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是用來(lái)指定容器對(duì)CPU的使用要在多長(zhǎng)時(shí)間內(nèi)做一次重新分配,而cpu-quota是用來(lái)指定在這個(gè)周期內(nèi),最多可以有多少時(shí)間用來(lái)跑這個(gè)容器。跟cpu-shares不同的是這種配置是指定一個(gè)絕對(duì)值,而且沒(méi)有彈性在里面,容器對(duì)CPU資源的使用絕對(duì)不會(huì)超過(guò)配置的值。
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í)行。








