Docker核心原理深度剖析:Cgroups限制原理!
Docker是大型架構(gòu)的必備技能,也是云原生核心,下面我重點(diǎn)詳解Docker原理@mikechen
Docker核心原理:Cgroups
Cgroups 是 Linux 內(nèi)核提供的一種強(qiáng)大的機(jī)制,用于對(duì)一組進(jìn)程(process groups)進(jìn)行資源管理、和限制。
最新文章
對(duì)于 Docker 來(lái)說(shuō),Cgroups 是實(shí)現(xiàn)容器資源隔離和管理的關(guān)鍵基石。
沒(méi)有 Cgroups,Docker 就無(wú)法有效地限制容器的資源使用,也就無(wú)法保證多容器環(huán)境下的穩(wěn)定性和性能。
為什么需要Cgroups?
因?yàn)椋核械膽?yīng)用程序都運(yùn)行在同一個(gè)操作系統(tǒng)內(nèi)核之上,共享所有的系統(tǒng)資源(CPU、內(nèi)存、磁盤 I/O、網(wǎng)絡(luò)帶寬等)。
最新文章
如果某個(gè)應(yīng)用程序出現(xiàn)資源消耗過(guò)高的情況(例如,一個(gè)死循環(huán)占用了大量 CPU,或者一個(gè)內(nèi)存泄漏導(dǎo)致內(nèi)存耗盡)。
它可能會(huì)無(wú)限制地吞噬系統(tǒng)資源,導(dǎo)致其他應(yīng)用程序運(yùn)行緩慢甚至崩潰,最終可能拖垮整個(gè)宿主機(jī)。
雖然 Namespaces 提供了進(jìn)程、網(wǎng)絡(luò)等方面的隔離,但如果沒(méi)有 Cgroups 的資源限制。
一個(gè)惡意、或有缺陷的容器,仍然可能通過(guò)過(guò)度消耗資源來(lái)影響其他容器甚至宿主機(jī)。
因此,需要Cgroups來(lái)限制資源。
Cgroups的工作原理
Cgroups 的核心思想:是將任務(wù)(進(jìn)程)組織成層級(jí)的樹(shù)狀結(jié)構(gòu)。
最新文章
并在樹(shù)的每個(gè)節(jié)點(diǎn)上附加各種子系統(tǒng),從而實(shí)現(xiàn)對(duì)該節(jié)點(diǎn)下所有任務(wù)的資源控制和監(jiān)控。
對(duì)應(yīng)的控制組結(jié)構(gòu)如下:
/sys/fs/cgroup/
├── memory/docker/<container-id>/
├── cpu/docker/<container-id>/
├── blkio/docker/<container-id>/
└──...
每個(gè)子系統(tǒng)下都有一份以容器 ID 命名的目錄,用來(lái)記錄資源配額與使用情況。
Cgroups 將系統(tǒng)資源劃分為不同的子系統(tǒng)(Subsystem),每個(gè)子系統(tǒng)控制一種資源,例如:
子系統(tǒng)名稱 | 控制資源 | 功能舉例 |
| CPU 時(shí)間分配 | 限制容器最大 CPU 使用量 |
| 指定 CPU 核 | 指定容器只能運(yùn)行在哪些 CPU 上 |
| 內(nèi)存使用限制 | 限制容器內(nèi)存上限、防止 OOM |
| 磁盤 IO 限制 | 控制容器讀寫(xiě)磁盤的帶寬和速度 |
| 網(wǎng)絡(luò)帶寬管理 | 給容器打網(wǎng)絡(luò)流量標(biāo)簽,用于限速 |
| 設(shè)備訪問(wèn)控制 | 限制容器訪問(wèn)特定硬件設(shè)備 |
舉幾個(gè)例子:
CPU 限制
通過(guò) cpu.shares 設(shè)置容器進(jìn)程的 CPU 時(shí)間片權(quán)重,或使用 cpu.cfs_quota_us 設(shè)置使用配額。
# 只允許使用一個(gè)核
docker run --cpus=1...
表示:只允許使用一個(gè)核。
內(nèi)存 限制
通過(guò) memory.limit_in_bytes 設(shè)置容器可用的最大內(nèi)存,超過(guò)后觸發(fā) OOM。
docker run --memory=256m...
總之,Docker 之所以能做到“限制誰(shuí)、限制多少、怎么限制”。
核心依賴的就是 Linux Cgroups,它是實(shí)現(xiàn)資源隔離與彈性伸縮的基石技術(shù)。