docker 的資源限制 總結

#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 速度
  1. 隨意建立一個鏡像
    docker run -it centos bash
  2. 執行 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 }'
  1. 而後在宿主機上執行:
sudo systemctl set-property --runtime docker-{$CONTAINER_ID}.scope "BlockIOWriteBandwidth=/dev/mapper/docker-8:2-269944452-33b4de5fe561162ca07d8a5b9acc43920902f131edff9a56a0aa3b3f1b46b925 {IO速度}"
  1. 測試
    • 沒有限速
    [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
相關文章
相關標籤/搜索