標籤:

docker內部的資源限制

目前來說,docker內部的資源限制,主要是兩個方式:

namespace的資源隔離

使用clone()在創建的新進程中同時創建namespacen

查看/proc/[pid]/ns文件n

通過setns()加入一個已存在的namespacen

通過unshare()在原先進程上進行namespace隔離n

fork()系統調用n

基本上是六項隔離:

(1)UTS(主機名與域名)

提供了主機和域名的隔離n

(2)IPC(信號量、消息隊列和共享內存)

進程間通信涉及到的IPC資源包括常見的信號量、消息隊列n

(3)PID(進程編號)

可以實現兩個不同的namespace下的進程存在相n

(4)Network(網路設備、網路棧、埠等)

網路資源的隔離,包括網路設備、IPv4、IPv6協議棧、IP路由表、防火牆、/proc/net目錄、/sys/class/net目錄、套接字等n

(5)Mount(掛載點)

通過對文件系統的掛載點,起到隔離的作用n

(6)User(用戶和用戶組)

包括標識符和屬性,包括用戶ID、用戶組ID、root目錄、key以及特殊許可權。n

cgroups資源限制

cgroups最初的名字為process container,由Google工程師提出的,屬於Linux內核提供一個機制,這種機制將根據需求把一系列任務及其子任務整合(或分隔)到按資源劃分到不同的組內,從而為系統資源管理提供一個統一的框架。

功能:

(1)資源限制:主要是對資源使用的總額進行限制;

(2)優先順序分配:通過分配的CPU時間片數量及磁碟IO帶寬大小,控制者任務運行的優先順序;

(3)資源統計:統計資源的使用量,(CPU使用時長、內存用量等)

(4)任務控制:對任務進行掛起或恢復等操作。

實現方式

本質上是鉤子原理,當任務在運行時,當涉及到某些資源時,就會觸發鉤子上附帶的子系統進行檢測。

如果當資源超過限制及限額之後時,需要docker設置OOM Control(內存超限控制),那麼進程就會收到OOM的信號,並且結束任務,否則進程就會掛起,進入到睡眠狀態,直到cgroup中其他進程釋放了足夠的內存資源為止。


推薦閱讀:

Docker 的應用場景在哪裡?
密碼1212@KubeCon北美峰會幹貨直播培訓課
[52ABP實戰課程系列]Docker&Ubuntu從入門到實戰開課啦~
基於Docker、NodeJs實現高可用的服務發現

TAG:Docker |