溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行容器Cgroups的使用

發(fā)布時間:2022-01-12 16:35:52 來源:億速云 閱讀:106 作者:柒染 欄目:云計算

本篇文章給大家分享的是有關(guān)如何進(jìn)行容器Cgroups的使用,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Linux Cgroups(Linux Control Group)是 Linux 內(nèi)核中用來為進(jìn)程設(shè)置資源限制的一個功能。它最主要的作用就是限制一個進(jìn)程組能夠使用的資源上限,包括 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)帶寬等。此外,Cgroups 還能夠?qū)M(jìn)程進(jìn)行優(yōu)先級設(shè)置、審計,以及將進(jìn)程掛起和恢復(fù)等操作。

那么為什么除了 Namespace 之外還需要 Cgroups 呢?因為雖然容器里的 1 號進(jìn)程只能看到容器里的情況,但是在宿主機(jī)上,它作為 100 號進(jìn)程(比如宿主機(jī)上它的 PID 是 100)與其他所有進(jìn)程之間依然是平等的競爭關(guān)系。也就是說,雖然 100 號進(jìn)程表面上被隔離了起來,但是它能夠使用的資源(比如 CPU、內(nèi)存)是全部的,它可能把所有資源耗光。那么這樣顯然不是一個容器應(yīng)該表現(xiàn)出來的合理行為。

在 Linux 中,Cgroups 給用戶暴露出來的操作接口是文件系統(tǒng),即操作接口是以文件和目錄的方式組織在操作系統(tǒng)的 /sys/fs/cgroup 路徑下。我們可以通過 mount 命令來查看一下,可以發(fā)現(xiàn)輸出結(jié)果是一系列文件系統(tǒng)目錄。

如何進(jìn)行容器Cgroups的使用  

我們查看 /sys/fs/cgroup 的時候還可以看到一系列子目錄,這些子目錄又被稱為子系統(tǒng)。這些都是我這臺機(jī)器上當(dāng)前可以被 Cgroups 進(jìn)行限制的資源種類。比如:

  • cpu 只要限制 CPU 的使用時間
  • cpuset 為進(jìn)程分配單獨的 CPU 核和對應(yīng)的內(nèi)存節(jié)點
  • memory 為進(jìn)程設(shè)定內(nèi)存使用的限制
  • blkio 塊設(shè)備設(shè)定 IO 限制,一般用于磁盤等設(shè)備
如何進(jìn)行容器Cgroups的使用  

而在子目錄下面可以看到該子系統(tǒng)對應(yīng)的資源可以被限制的方法,比如對于 CPU 子系統(tǒng)來說,我們可以看到如下幾個配置文件。

如何進(jìn)行容器Cgroups的使用  

其中 cpu.cfs_period_us 和 cpu.cfs_quota_us 這兩個文件組合使用可以限制進(jìn)程在長度為 cfs_period 的一段時間內(nèi),只能被分配到總量為 cfs_quota 的 CPU 時間。

 

Cgoups 配置示例

下面基于 Cgroups 提供的操作接口進(jìn)行配置,我們先在相應(yīng)的子系統(tǒng)中再創(chuàng)建一個目錄,比如 container ,這個目錄就被稱為“控制組”。當(dāng)將這個目錄創(chuàng)建好了之后,你會發(fā)現(xiàn)這個目錄已經(jīng)生成了該子系統(tǒng)對應(yīng)的資源限制文件。

如何進(jìn)行容器Cgroups的使用  

接下去,我們通過修改 container 中的文件內(nèi)容來設(shè)置限制。比如向 container 中的 cpu.cfs_quota_us 中寫入 20 ms,也就是 20000,就表示每 cpu_period_us (100ms)被控制組限制的進(jìn)程只能使用 20ms 的 CPU 時間。

接下去我們把要限制的進(jìn)程 PID 寫入 container 目錄中的 tasks 文件中,那么該設(shè)置對要限制的進(jìn)程就有效了。

如何進(jìn)行容器Cgroups的使用  
如何進(jìn)行容器Cgroups的使用  
 

Docker 實現(xiàn)

對于 Docker 等 Linux 容器項目來說,它們只需要在每個子系統(tǒng)下面,為每個容器創(chuàng)建一個控制組(也就是創(chuàng)建一個新目錄),然后在啟動容器進(jìn)程之后,把這個進(jìn)程的 PID 寫入到這個控制組的 tasks 文件中即可。而控制組中的資源限制要填上什么值,就要看用戶執(zhí)行 docker run 時指定的參數(shù)內(nèi)容。在 Docker 主機(jī)中,每個子系統(tǒng)下面都有 docker 控制組。

如何進(jìn)行容器Cgroups的使用  

下面我們來演示 docker 進(jìn)行設(shè)置的效果,就會在 CPU 子系統(tǒng)的 docker 控制組中進(jìn)行相關(guān)的設(shè)置。

docker run -it --rm --cpu-period=100000 --cpu-quota=20000 -d alpine sleep 500s
 

如下所示,docker 還會在 docker 控制組創(chuàng)建一個新的目錄,在這個目錄中對資源進(jìn)行設(shè)置,從而達(dá)到限制資源使用的效果。

如何進(jìn)行容器Cgroups的使用  
 

跟 Namespace 情況類似,Cgoups 對資源的限制能力也有很多不完善的地方,其中被提及最多的是 /proc 文件系統(tǒng)的問題。/proc 目錄存儲著當(dāng)前內(nèi)核運行狀態(tài)的一系列特殊文件,用戶可以通過訪問這些文件,查看系統(tǒng)以及當(dāng)前正在運行的進(jìn)程的信息,比如 CPU 使用情況、內(nèi)存占用率等,這些文件也是 top 指令查看系統(tǒng)信息的主要數(shù)據(jù)來源。

但是,如果你在容器里執(zhí)行 top 指令,就會發(fā)現(xiàn),它顯示的信息居然還是宿主機(jī)的 CPU 和內(nèi)存數(shù)據(jù)。這是因為  /proc 文件系統(tǒng)并不知道用戶通過 Cgroups 給這個容器做了什么樣的資源限制,所以它返回的還是整個宿主機(jī)的。那么這個問題會導(dǎo)致,容器內(nèi)的應(yīng)用程序讀取到的 CPU 核數(shù)、可用內(nèi)存等信息還是宿主機(jī)的,而不是做了限制之后的。這就是容器相比較于虛擬機(jī)另一個不盡如人意的地方。

以上就是如何進(jìn)行容器Cgroups的使用,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI