Docker使用Linux cgroup來實現資源的限制,對於CPU的限制有兩種方法:
1.cpuset
CPU Set限定容器使用某個固定的CPU核。使用預設的libcontainer引擎時,可以通過--cpuset來指定程式/docker容器在執行時使用某幾個固定的CPU。比如0-3或以逗號分割如0,3,4(0是第一個CPU)。
2.cpu.shares
CPU shares是相對權重, 設定為一個正整數,代表所分配的相對CPU資源比。在Docker中,使用預設的libcontainer引擎時,可以指定在docker run時指定-c或--cpu-shares=0。當DockerDaemon中增加新的容器時,CPU shares的權重相應減小,當刪除容器時CPU shares的權重相應增加。
由於第二種方式理解上有些繞,且容器真正分到的CPU資源會隨著容器數及其他容器權重而改變,個人建議並不太適合應用到生產場景中。本文主要分析第一種方式,即cpuset。
測試步驟
1、下載CPU測試image。agileek/cpuset-test給出了一種用於測試CPU的image,功能就是將指定的CPU資源用滿
$ docker pull agileek/cpuset-test
2、測試容器佔用單獨CPU
$ docker run -it --rm --cpuset=4 agileek/cpuset-test
3、另開終端視窗,觀察CPU佔用情況
[root@zhenyunode ~]# mpstat -P ALL 5 10 Linux 3.10.0-123.el7.x86_64 (zhenyunode) 2015年12月20日 _x86_64_ (8 CPU) 21時25分17秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 21時25分22秒 all 12.68 0.00 0.05 0.00 0.00 0.00 0.00 0.00 0.00 87.27 21時25分22秒 0 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.60 21時25分22秒 1 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.60 21時25分22秒 2 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60 21時25分22秒 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 21時25分22秒 4 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 21時25分22秒 5 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80 21時25分22秒 6 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.60 21時25分22秒 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
4、測試容器佔用多個CPU
$ docker run -it --rm --cpuset=0,2,4,5 agileek/cpuset-test /cpus 4
5、另開終端視窗,觀察CPU佔用情況
[root@zhenyunode ~]# mpstat -P ALL 5 10 Linux 3.10.0-123.el7.x86_64 (zhenyunode) 2015年12月20日 _x86_64_ (8 CPU) 21時26分34秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 21時26分39秒 all 50.24 0.00 0.05 0.00 0.00 0.00 0.00 0.00 0.00 49.71 21時26分39秒 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 21時26分39秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 21時26分39秒 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 21時26分39秒 3 0.40 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.40 21時26分39秒 4 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 21時26分39秒 5 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 21時26分39秒 6 0.60 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.20 21時26分39秒 7 0.40 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.40
經過以上的測試步驟,可以看到,當為容器配置某個CPU時,該CPU被佔滿,但其餘的CPU並沒有受到影響。