1、限制進程的CPU
通過Cgroup來限制進程資源的使用,CPU Cgroup 是 Cgroups 其中的一個 Cgroups 子系統,它是用來限制進程的 CPU 使用的。
- cpu.cfs_period_us,它是 CFS 算法的一個調度周期,一般它的值是 100000,以 microseconds 為單位,也就 100ms。
- cpu.cfs_quota_us,它“表示 CFS 算法中,在一個調度周期里這個控制組被允許的運行時間,比如這個值為 50000 時,就是 50ms。
如果用這個值去除以調度周期(也就是 cpu.cfs_period_us),50ms/100ms = 0.5,這樣這個控制組被允許使用的 CPU 最大配額就是 0.5 個 CPU。(很有意思)
啟動了一個進程,不斷死循環,在一個四核的機器上會占用25%的cpu。
并且這個進程的pid是8683,然后我們對這個進程的cpu使用率進行限制。
首先將進程id寫入cgroup.procs文件中,并向cpu.cfs_quota_us中寫入50000,也就代表這個進程最多只能使用半個cpu。再執行top看下具體信息:
可以看到已經被限制住了。像k8s的pod中cpu的limit就是修改的這個值。
- cpu.shares。這個值是 CPU Cgroup 對于控制組之間的 CPU 分配比例,它的缺省值是 1024。
Request CPU"就是無論其他容器申請多少 CPU 資源,即使運行時整個節點的 CPU 都被占滿的情況下,我的這個容器還是可以保證獲得需要的 CPU 數目,那么這個設置具體要怎么實現呢?顯然我們需要設置 cpu.shares 這個參數:在 CPU Cgroup 中 cpu.shares == 1024 表示 1 個 CPU 的比例,那么 Request CPU 的值就是 n,給 cpu.shares 的賦值對應就是 n*1024。
其中容器相關的配置在這個目錄下,對應的文件也是這些,可以針對每個容器中的所有進程進行cpu的限制。
2、如何正確拿到容器的CPU可銷
在傳統虛擬機時代,我們習慣使用top來查看進程所占用的CPU情況,但是在容器環境下這個就不那么好用了。
如圖所示:容器中所有進程和的CPU使用率都是0.0但是總的CPU使用率卻是25%,這是為什么呢?
再看一下宿主機上上的cpu使用情況:
不難發現宿宿主機上的cpu使用率和容器上的cpu使用率是一樣的。
因此這個例子說明,在容器中使用top命令獲取容器的cpu使用率是有問題的。
daixu