#docker 的資源 Docker的一個很大的特性就是能夠對各類資源作隔離以及限制。這些資源包括CPU、內存、網絡、硬盤,關於內存、網絡、硬盤的資源限制都比較好理解,無非就是分多少用多少。html
常見的計算機資源一般都(CPU,內存,硬盤,網絡),而docker 的資源管控 也從 這幾個方面入手,隨便說說.我在實際使用中發現的一些 疑惑點node
CPU
docker 的cpu 控制 總體上來講,都是docker 自帶的,而按 功能來分 的話 ,能夠分爲docker
- 共享:--cpu-shares, 經過設置對應的權重參數來控制CPU的分配, 例如 A --cpu-shares 1024 B --cpu-shares 512 那麼 若是都跑滿 A 將佔有2/3 cpu 時間 ,B是 1/3 ,可是 當 A 不使用時 ,B 是能用使用所有的 CPU 資源的
- 獨佔:--cpuset-cpus 能夠設置容器執行在具體 的 某個或者某幾個核上。core 編號 從0 開始
- 現象:在測試中 我發現 核Id 是能夠反覆寫,也就是 docker 並不會 管 這個 core 是否 被 獨佔,依然是一種共享的狀態下。那麼問題來了
- 現象: 如今在測試環境下搭建都用的是 使用swarm 搭建的 docker 集羣 ,而 swarm 的 調度策略有 spread, binpack, random.
- random 不用都說
- spread 默認策略,及那一臺host 運行的 容器少,就在那一臺運行,這個是經過計數來實現的
- binpack 這個是儘量得集中運行
- 問題 , 若是在 以售賣 資源的 業務模式下 ,cpu 得不到記錄, 不能合理的劃分 (有問題能夠細說) ,缺乏一種記錄機制,
內存
docker 的內存 ,以 測試虛擬機 (16G 內存) , 分給docker 能使用的內存 是 14.5G 左右centos
- 設置內存 -m, --memory 若是隻 設置這個參數的話, 當容器中程序使用內存超過這個值,則程序死,可是容器不會死
- 限制內存 --memory-swap :若是使用內存超過 設置的值 ,則 容器 也會被kill
磁盤IO
磁盤 自己 能夠經過掛載 數據盤 ,來擴展 容器 默認的10G 空間bash
- 基於權重
- --blkio-weight Block IO (relative weight), between 10 and 1000
- --blkio-weight-device=[] Block IO weight (relative device weight)
- 精細控制
- --device-read-bps=[] Limit read rate (bytes per second) from a device
- --device-read-iops=[] Limit read rate (IO per second) from a device
- --device-write-bps=[] Limit write rate (bytes per second) to a device
- --device-write-iops=[] Limit write rate (IO per second) to a device 經過 參數 來 精細控制 我沒有成功(其應該是控制外部掛載盤的),可是我採用了另一種辦法 ,成功的如今住了 IO 速度
- 隨意建立一個鏡像
docker run -it centos bash
- 執行 mount 得到 映射
在第一行,獲取掛載 /dev/mapper/docker-8:2-269944452-33b4de5fe561162ca07d8a5b9acc43920902f131edff9a56a0aa3b3f1b46b925 on / type xfs (rw,relatime,nouuid,attr2,inode64,logbsize=64k,sunit=128,swidth=128,noquota)
或者 使用外部命令,來獲取掛載網絡
sudo /usr/bin/nsenter --target $(docker inspect -f '{{ .State.Pid }}' $CONTAINER_ID) --mount --uts --ipc --net --pid mount | head -1 | awk '{ print $1 }'
- 而後在宿主機上執行:
sudo systemctl set-property --runtime docker-{$CONTAINER_ID}.scope "BlockIOWriteBandwidth=/dev/mapper/docker-8:2-269944452-33b4de5fe561162ca07d8a5b9acc43920902f131edff9a56a0aa3b3f1b46b925 {IO速度}"
- 測試
[root@97dfbe989adb /]# time $(dd if=/dev/zero of=testfile0 bs=1000 count=100000 && sync)
100000+0 records in 100000+0 records out 100000000 bytes (100 MB) copied, 0.685456 s, 146 MB/s real 0m7.292s user 0m0.089s sys 0m0.619s * 限速 10m
[root@97dfbe989adb /]# time $(dd if=/dev/zero of=testfile0 bs=1000 count=100000 && sync) 100000+0 records in 100000+0 records out 100000000 bytes (100 MB) copied, 0.615627 s, 162 MB/s real 0m10.887s user 0m0.084s sys 0m0.589s ``` 能夠看到速度變化 明顯app
網絡
在如今的網絡中咱們搭建的都是 overlay 的網絡。而在網絡方面的限制 docker 自己爲0 ,這來自於docker 自己的設計思想。dom
- 自身: 無網卡限速
- 第三方:
- 在外部動刀 openswitch 的ops http://www.aixchina.net/club/thread-123385-1-1.html
- 內部動刀(tc(鏡像中沒有此命令 去要安裝)),啓動容器時 須要加下面的參數 yum -y install iproute tc qdisc add dev eth0 root tbf rate 50kbit latency 50ms burst 1000 (在個人 虛擬機測試中差6.6倍,其對應的測試下載速度爲330K) 刪除此規則 :tc qdisc del dev eth0 root tbf 沒有作 限速 能有 70M/s