docker在默認(rèn)情況下,容器使用的資源是不受限制的。也就是可以使用主機內(nèi)核調(diào)度器所允許的最大資源。如果不對容器可以使用的 cpu 資源進(jìn)行限制,一旦發(fā)生容器內(nèi)程序異常使用 cpu 的情況,很可能把整個主機的 cpu 資源耗盡,從而導(dǎo)致更大的災(zāi)難。
本文將介紹如何設(shè)置容器可以使用的 cpu 資源。
docker 的資源限制和隔離完全基于 linux cgroups。對 cpu 資源的限制方式也和 cgroups 相同。docker 提供的 cpu 資源限制選項可以在多核系統(tǒng)上限制容器能利用哪些 vcpu。而對容器最多能使用的 cpu 時間有兩種限制方式:一是有多個 cpu 密集型的容器競爭 cpu 時,設(shè)置各個容器能使用的 cpu 時間相對比例。二是以絕對的方式設(shè)置容器在每個調(diào)度周期內(nèi)最多能使用的 cpu 時間。
docker run命令和 cpu 限制相關(guān)的所有選項如下:
–cpuset-cpus= 允許使用的 cpu 集,值可以為 0-3,0,1
-c,–cpu-shares=0 cpu 共享權(quán)值(相對權(quán)重)
cpu-period=0 限制 cpu cfs 的周期,范圍從 100ms~1s,即[1000, 1000000]
–cpu-quota=0 限制 cpu cfs 配額,必須不小于1ms,即 >= 1000
–cpuset-mems= 允許在上執(zhí)行的內(nèi)存節(jié)點(mems),只對 numa 系統(tǒng)有效
其中–cpuset-cpus用于設(shè)置容器可以使用的 vcpu 核。-c,–cpu-shares用于設(shè)置多個容器競爭 cpu 時,各個容器相對能分配到的 cpu 時間比例。
docker提供了cpu-period、cpu-quota兩個參數(shù)控制容器可以分配到的cpu時鐘周期。cpu-period是用來指定容器對cpu的使用要在多長時間內(nèi)做一次重新分配,而cpu-quota是用來指定在這個周期內(nèi),最多可以有多少時間用來跑這個容器。跟cpu-shares不同的是這種配置是指定一個絕對值,而且沒有彈性在里面,容器對cpu資源的使用絕對不會超過配置的值。
cpu-period和cpu-quota的單位為微秒(μs)。cpu-period的最小值為1000微秒,最大值為1秒(10^6 μs),默認(rèn)值為0.1秒(100000 μs)。cpu-quota的值默認(rèn)為-1,表示不做控制。
例如設(shè)置容器可以在哪些 cpu 核上運行:
docker run -it –cpuset-cpus=0,6 –name centos centos /bin/bash
設(shè)置容器中的進(jìn)程可以在 cpu 0 和 cpu 6上執(zhí)行。