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點
- –cpus=2比–cpus=1,佔用比例要大。
- 在 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