Docker 資源(cpu、memory)限制實踐篇

Docker 資源(cpu、memory)限制實踐篇

寫這篇的目的是爲了搞清楚,在docker中的一些設置項,對容器資源(cpu、memory)產生的影響和對比,從網絡中瞭解到docker容器的資源限制是通過cgroup來實現的。cgroup是control group的簡稱,是Linux內核2.6.24引入的一個新特性 ,用來限制、分離和報告一個進程組的資源(CPU、內存、磁盤輸入輸出等)。常用的ulimit只能基於用戶或者用戶組來進行資源限制,不能夠針對某一進程作出詳細限制,缺乏靈活度。

 

一、安裝 sysstat 工具

下載:sysstat-7.0.2-3.el5.x86_64.rpm

rpm -ivh sysstat-7.0.2-3.el5.x86_64.rpm

二、使用工具 mpstat

命令:mpstat -P ALL 3 10 :表示每3秒對所有的cpu採樣10次.

04時54分27秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
04時54分32秒  all   17.77    0.00    0.05    0.00    0.00    0.00    0.00   82.17   1113.60
04時54分32秒    0    0.00    0.00    0.20    0.00    0.00    0.00    0.00   99.80      0.00
04時54分32秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.62      0.60
04時54分32秒    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
04時54分32秒    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      2.20
04時54分32秒    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00        0.00

  • user:在internal時間段裏,用戶態的CPU時間(%),不包含nice值爲負進程,值爲 (usr/total)*100;
  • nice:在internal時間段裏,nice值爲負進程的CPU時間(%),值爲(nice/total)*100;
  • system:在internal時間段裏,核心時間(%),值爲(system/total)*100;
  • iowait:在internal時間段裏,硬盤IO等待時間(%),值爲(iowait/total)*100;
  • irq:在internal時間段裏,硬中斷時間(%),值爲(irq/total)*100;
  • soft:在internal時間段裏,軟中斷時間(%),值爲(softirq/total)*100;
  • idle:在internal時間段裏,CPU除去等待磁盤IO操作外的因爲任何原因而空閒的時間閒置時間(%),值爲(idle/total)*100;
  • intr/s:在internal時間段裏,每秒CPU接收的中斷的次數,值爲(intr/total)*100;

三、Docker中關於容器cpu的設置項

  • –cpuset-cpus:指定允許容器使用的CPU序號,從0開始,默認使用主機的所有CPU
--cpuset-cpus=0-2 // 允許使用0,1,2號cpu
--cpuset-cpus=0-1,3 // 允許使用0,1,3號cpu

例如:

docker run -it --rm --cpuset-cpus=0-1,3 agileek/cpuset-test
# agileek/cpuset-test給出了一種用於測試CPU的image,功能就是將指定的CPU資源用滿

運行結果:

# mpstat -P ALL 2 1000

05時08分40秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
05時08分43秒  all   70.16    0.00    0.00    0.00    0.00    1.06    0.00   28.78   4443.03
05時08分43秒    0   98.36    0.00    0.00    0.00    0.00    1.64    0.00    0.00      0.00
05時08分43秒    1   99.20    0.00    0.00    0.00    0.00    0.80    0.00    0.00      0.82
05時08分43秒    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
05時08分43秒    3   97.98    0.00    0.00    0.00    0.00    2.02    0.00    0.00      1.64
05時08分43秒    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
  • –cpu-shares 是相對權重, 設置爲一個正整數,代表所分配的相對CPU資源比,需要注意的是,這種情況只發生在CPU資源緊張的情況下。

啓動2個容器:

docker run -it --rm --cpu-shares=10 --cpuset-cpus=0 agileek/cpuset-test
docker run -it --rm --cpu-shares=20 --cpuset-cpus=0 agileek/cpuset-test

分表查看2個容器的top信息:

# docker top 4067dfb90eeb 
UID     PID      PPID     C      STIME        TTY        TIME          CMD
root     5428    5412     66     05:23          pts/2       00:00:32     /cpuburn

# docker top 11d8f3076db1
UID     PID      PPID     C      STIME        TTY         TIME          CMD
root     5330    5314     34     05:22          pts/4        00:00:59     /cpuburn
注:容器運行的時間越長,比例越接近.

默認情況下所有容器的share(簡單理解成是權重吧)是相同的,也就是所有容器有相同的權重,在所有容器一起競爭資源時,最終得到的資源是相同的。這個share是一個相對的值,那麼這個值的意義就不能單純的通過一個容器的share值來看,而是多個在一起對比,比如A和B兩個容器,A配置的是1024,B配置的是512,那麼A最大可以使用的CPU資源是B的兩倍。還有一點要注意的是這種配置是有彈性的,如果A容器一直閒着,那B容器是可以使用空閒資源的。

  •  –cpus 容器CPU佔用主機的CPU的比例,佔用的比例關係暫時未找到相關的資料。

例如 –cpus=1 ,宿主機cpu個數爲4,佔用比例並非1/4 .現在使用–cpus能夠確認2點

  1. –cpus=2比–cpus=1,佔用比例要大。
  2. 在 docker inspect 3ef363848eb8 | grep Cpu 中有個 NanoCpus 會隨其規律性變化。
  • –cpu-period 和 –cpu-quota

這兩個設置項是成對出現的,在理解這2個概念之前需要清楚,linux系統中進程的CPU佔比是如何計算的,簡單可以理解爲:在單位的時間內(也稱刷新時間),進程佔用CPU的時間比,這裏只是單個CPU的比值(進程CPU使用比例),如果是多核CPU,即 進程CPU使用佔比/CPU核數=系統CPU佔比。

cpu-period:指刷新時間,單位是微秒(us),默認值是0.1秒,即100,000us
cpu-quota:容器佔用時間,單位是微秒(us),默認是-1,即不限制

#注意:只是單個CPU的百分比(進程CPU使用比例).系統cpu使用比=進程CPU使用比例/核數

通過例子說明(本人使用4核CPU),例子1:

docker run -it --rm --cpu-quota=50000 --name=test agileek/cpuset-test
// 容器cpu佔用50%,因爲本人用的4核CPU,top中進程CPU比例50%,系統CPU使用比例12.5%
# top
Tasks: 128 total,   1 running, 127 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.8 us,  0.1 sy,  0.0 ni, 89.0 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  1016488 total,   663352 free,   119692 used,   233444 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   736284 avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
22734 root      20   0   36732    972    584 S  49.5  0.1   0:12.02 cpuburn

例子2:

docker run -it --rm --cpu-quota=300000 --name=test agileek/cpuset-test
// 進程cpu佔比 300%,系統cpu佔比75%
# top
Tasks: 129 total,   2 running, 127 sleeping,   0 stopped,   0 zombie
%Cpu(s): 55.7 us,  0.0 sy,  0.0 ni, 43.2 id,  0.0 wa,  0.0 hi,  1.1 si,  0.0 st
KiB Mem :  1016488 total,   663336 free,   119708 used,   233444 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   736264 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
22828 root      20   0   36732    972    584 S 300.7  0.1   2:31.44 cpuburn

例子3:

docker run -it --rm --cpu-quota=500000 --name=test agileek/cpuset-test
// 進程cpu佔比 400%,系統cpu佔比100%
注:此時超過4核cpu的最大佔比,所以使用最大佔比
# top
Tasks: 127 total,   3 running, 124 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.4 us,  0.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  2.5 si,  0.0 st
KiB Mem :  1016488 total,   662932 free,   120116 used,   233440 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   735884 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
22915 root      20   0   36732    712    396 R 398.0  0.1  19:41.62 cpuburn

例子4:

# docker run -it --rm --cpu-quota=500000 --cpu-period=1000000 --name=test 
agileek/cpuset-test
// 容器進程佔比 50%,系統cpu佔比12.5
#top
Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.0 us,  0.0 sy,  0.0 ni, 89.9 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  1016488 total,   665960 free,   117144 used,   233384 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   738964 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
23006 root      20   0   36732    972    584 S  50.0  0.1   0:33.50 cpuburn

例子5:

docker run -it --rm --cpu-quota=3000000 --cpu-period=1000000 --cpuset-cpus=0-1 
 --name=test  agileek/cpuset-test
# 進程cpu佔比 200%(因限制使用0和1好CPU,最大值是300%),系統cpu佔比50%
#top
Tasks: 124 total,   1 running, 123 sleeping,   0 stopped,   0 zombie
%Cpu(s): 43.3 us,  0.1 sy,  0.0 ni, 56.3 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  1016488 total,   665464 free,   117560 used,   233464 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   738496 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
23143 root      20   0   36732    712    396 R 199.3  0.1   4:14.25 cpuburn
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章