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