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