通過前面的介紹,我們了解到Linux中cgroups可用來限制cpu資源,那么具體要如何實現(xiàn)呢?下面小編就給大家介紹下Linux中如何使用cgroups來限制cpu資源 。

這回說說怎樣通過 cgroups 來管理 cpu 資源 。先說控制進程的 cpu 使用 。在一個機器上運行多個可能消耗大量資源的程序時,我們不希望出現(xiàn)某個程序占據(jù)了所有的資源,導致其他程序無法正常運行,或者造成系統(tǒng)假死無法維護 。這時候用 cgroups 就可以很好地控制進程的資源占用 。這里單說 cpu 資源 。
cgroups 里,可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 來限制該組中的所有進程在單位時間里可以使用的 cpu 時間 。這里的 cfs 是完全公平調(diào)度器的縮寫 。cpu.cfs_period_us 就是時間周期,默認為 100000,即百毫秒 。cpu.cfs_quota_us 就是在這期間內(nèi)可使用的 cpu 時間,默認 -1,即無限制 。
跑一個耗 cpu 的程序
代碼如下:
# echo ‘while True: pass’|python &
[1] 1532
top 一下可以看到,這進程占了 100% 的 cpu
代碼如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1532 root 20 0 112m 3684 1708 R 99.6 0.7 0:30.42 python
。。。
然后就來對這個進程做一下限制 。先把 /foo 這個控制組的限制修改一下,然后把進程加入進去 。
代碼如下:
echo 50000 》/sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us
echo 1532 》/sys/fs/group/cpu/foo/tasks
可見,修改設置只需要寫入相應文件,將進程加入 cgroup 也只需將 pid 寫入到其中的 tasks 文件即可 。這里將 cpu.cfs_quota_us 設為 50000,相對于 cpu.cfs_period_us 的 100000 即 50% 。再 top 一下看看效果 。
代碼如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1532 root 20 0 112m 3684 1708 R 50.2 0.7 5:00.31 python
。。。
可以看到,進程的 cpu 占用已經(jīng)被成功地限制到了 50%。這里,測試的虛擬機只有一個核心 。在多核情況下,看到的值會不一樣 。另外,cfs_quota_us 也是可以大于 cfs_period_us 的,這主要是對于多核情況 。有 n 個核時,一個控制組中的進程自然最多就能用到 n 倍的 cpu 時間 。
這兩個值在 cgroups 層次中是有限制的,下層的資源不能超過上層 。具體的說,就是下層的 cpu.cfs_period_us 值不能小于上層的值,cpu.cfs_quota_us 值不能大于上層的值 。
另外的一組 cpu.rt_period_us、cpu.rt_runtime_us 對應的是實時進程的限制,平時可能不會有機會用到 。
在 cpu 子系統(tǒng)中,cpu.stat 就是用前面那種方法做的資源限制的統(tǒng)計了 。nr_periods、nr_throttled 就是總共經(jīng)過的周期,和其中受限制的周期 。throttled_time 就是總共被控制組掐掉的 cpu 使用時間 。
還有個 cpu.shares, 它也是用來限制 cpu 使用的 。但是與 cpu.cfs_quota_us、cpu.cfs_period_us 有挺大區(qū)別 。cpu.shares 不是限制進程能使用的絕對的 cpu 時間,而是控制各個組之間的配額 。比如
【Linux下如何使用cgroups管理CPU資源】 代碼如下:
/cpu/cpu.shares : 1024
/cpu/foo/cpu.shares : 2048
那么當兩個組中的進程都滿負荷運行時,/foo 中的進程所能占用的 cpu 就是 / 中的進程的兩倍 。如果再建一個 /foo/bar 的 cpu.shares 也是 1024,且也有滿負荷運行的進程,那 /、/foo、/foo/bar 的 cpu 占用比就是 1:2:1。前面說的是各自都跑滿的情況 。如果其他控制組中的進程閑著,那某一個組的進程完全可以用滿全部 cpu ??梢娡ǔG闆r下,這種方式在保證公平的情況下能更充分利用資源 。
此外,還可以限定進程可以使用哪些 cpu 核心 。cpuset 子系統(tǒng)就是處理進程可以使用的 cpu 核心和內(nèi)存節(jié)點,以及其他一些相關配置 。這部分的很多配置都和 NUMA 有關 。其中 cpuset.cpus、cpuset.mems 就是用來限制進程可以使用的 cpu 核心和內(nèi)存節(jié)點的 。這兩個參數(shù)中 cpu 核心、內(nèi)存節(jié)點都用 id 表示,之間用 “,” 分隔 。比如 0,1,2。也可以用 “-” 表示范圍,如 0-3。兩者可以結合起來用 。如“0-2,6,7” 。在添加進程前,cpuset.cpus、cpuset.mems 必須同時設置,而且必須是兼容的,否則會出錯 。例如
推薦閱讀
- Linux中cgroups的基礎知識
- vivo手機如何卡付費主題
- 甲狀腺功能減退,該如何補充碘? 甲狀腺機能減退
- 如何取消電腦自動關機 xp自動關機
- 微信過期文件怎么恢復下載
- 如何祛除狗狗的口臭問題
- 古人識字方法技巧 古代沒有拼音如何識字
- 古代考試怎么作弊的,科舉作弊如何處罰?
- 消費者如何選擇購買境外醫(yī)療保險?
- 有社保 如何投保住院津貼型醫(yī)療險?
