系統(tǒng)之家 - 系統(tǒng)光盤(pán)下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux使用cgroups

Linux下如何使用cgroups管理CPU資源

時(shí)間:2014-12-22 11:45:51 作者:qipeng 來(lái)源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請(qǐng)使用手機(jī)瀏覽器訪問(wèn): https://m.xitongzhijia.net/xtjc/20141222/33089.html 手機(jī)查看 評(píng)論

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

 Linux下如何使用cgroups管理CPU資源

  這回說(shuō)說(shuō)怎樣通過(guò) cgroups 來(lái)管理 cpu 資源。先說(shuō)控制進(jìn)程的 cpu 使用。在一個(gè)機(jī)器上運(yùn)行多個(gè)可能消耗大量資源的程序時(shí),我們不希望出現(xiàn)某個(gè)程序占據(jù)了所有的資源,導(dǎo)致其他程序無(wú)法正常運(yùn)行,或者造成系統(tǒng)假死無(wú)法維護(hù)。這時(shí)候用 cgroups 就可以很好地控制進(jìn)程的資源占用。這里單說(shuō) cpu 資源。

  cgroups 里,可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 來(lái)限制該組中的所有進(jìn)程在單位時(shí)間里可以使用的 cpu 時(shí)間。這里的 cfs 是完全公平調(diào)度器的縮寫(xiě)。cpu.cfs_period_us 就是時(shí)間周期,默認(rèn)為 100000,即百毫秒。cpu.cfs_quota_us 就是在這期間內(nèi)可使用的 cpu 時(shí)間,默認(rèn) -1,即無(wú)限制。

  跑一個(gè)耗 cpu 的程序

  代碼如下:

  # echo ‘while True: pass’|python &

 。1] 1532

  top 一下可以看到,這進(jìn)程占了 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

  。。。

  然后就來(lái)對(duì)這個(gè)進(jìn)程做一下限制。先把 /foo 這個(gè)控制組的限制修改一下,然后把進(jìn)程加入進(jìn)去。

  代碼如下:

  echo 50000 》/sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us

  echo 1532 》/sys/fs/group/cpu/foo/tasks

  可見(jiàn),修改設(shè)置只需要寫(xiě)入相應(yīng)文件,將進(jìn)程加入 cgroup 也只需將 pid 寫(xiě)入到其中的 tasks 文件即可。這里將 cpu.cfs_quota_us 設(shè)為 50000,相對(duì)于 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

  。。。

  可以看到,進(jìn)程的 cpu 占用已經(jīng)被成功地限制到了 50% 。這里,測(cè)試的虛擬機(jī)只有一個(gè)核心。在多核情況下,看到的值會(huì)不一樣。另外,cfs_quota_us 也是可以大于 cfs_period_us 的,這主要是對(duì)于多核情況。有 n 個(gè)核時(shí),一個(gè)控制組中的進(jìn)程自然最多就能用到 n 倍的 cpu 時(shí)間。

  這兩個(gè)值在 cgroups 層次中是有限制的,下層的資源不能超過(guò)上層。具體的說(shuō),就是下層的 cpu.cfs_period_us 值不能小于上層的值,cpu.cfs_quota_us 值不能大于上層的值。

  另外的一組 cpu.rt_period_us、cpu.rt_runtime_us 對(duì)應(yīng)的是實(shí)時(shí)進(jìn)程的限制,平時(shí)可能不會(huì)有機(jī)會(huì)用到。

  在 cpu 子系統(tǒng)中,cpu.stat 就是用前面那種方法做的資源限制的統(tǒng)計(jì)了。nr_periods、nr_throttled 就是總共經(jīng)過(guò)的周期,和其中受限制的周期。throttled_time 就是總共被控制組掐掉的 cpu 使用時(shí)間。

  還有個(gè) cpu.shares, 它也是用來(lái)限制 cpu 使用的。但是與 cpu.cfs_quota_us、cpu.cfs_period_us 有挺大區(qū)別。cpu.shares 不是限制進(jìn)程能使用的絕對(duì)的 cpu 時(shí)間,而是控制各個(gè)組之間的配額。比如

  代碼如下:

  /cpu/cpu.shares : 1024

  /cpu/foo/cpu.shares : 2048

  那么當(dāng)兩個(gè)組中的進(jìn)程都滿(mǎn)負(fù)荷運(yùn)行時(shí),/foo 中的進(jìn)程所能占用的 cpu 就是 / 中的進(jìn)程的兩倍。如果再建一個(gè) /foo/bar 的 cpu.shares 也是 1024,且也有滿(mǎn)負(fù)荷運(yùn)行的進(jìn)程,那 /、/foo、/foo/bar 的 cpu 占用比就是 1:2:1 。前面說(shuō)的是各自都跑滿(mǎn)的情況。如果其他控制組中的進(jìn)程閑著,那某一個(gè)組的進(jìn)程完全可以用滿(mǎn)全部 cpu。可見(jiàn)通常情況下,這種方式在保證公平的情況下能更充分利用資源。

  此外,還可以限定進(jìn)程可以使用哪些 cpu 核心。cpuset 子系統(tǒng)就是處理進(jìn)程可以使用的 cpu 核心和內(nèi)存節(jié)點(diǎn),以及其他一些相關(guān)配置。這部分的很多配置都和 NUMA 有關(guān)。其中 cpuset.cpus、cpuset.mems 就是用來(lái)限制進(jìn)程可以使用的 cpu 核心和內(nèi)存節(jié)點(diǎn)的。這兩個(gè)參數(shù)中 cpu 核心、內(nèi)存節(jié)點(diǎn)都用 id 表示,之間用 “,” 分隔。比如 0,1,2 。也可以用 “-” 表示范圍,如 0-3 。兩者可以結(jié)合起來(lái)用。如“0-2,6,7”。在添加進(jìn)程前,cpuset.cpus、cpuset.mems 必須同時(shí)設(shè)置,而且必須是兼容的,否則會(huì)出錯(cuò)。例如

  代碼如下:

  # echo 0 》/sys/fs/cgroup/cpuset/foo/cpuset.cpus

  # echo 0 》/sys/fs/cgroup/cpuset/foo/cpuset.mems

  這樣, /foo 中的進(jìn)程只能使用 cpu0 和內(nèi)存節(jié)點(diǎn)0。用

  代碼如下:

  # cat /proc/《pid》/status|grep ‘_allowed_list’

  可以驗(yàn)證效果。

  cgroups 除了用來(lái)限制資源使用外,還有資源統(tǒng)計(jì)的功能。做云計(jì)算的計(jì)費(fèi)就可以用到它。有一個(gè) cpuacct 子系統(tǒng)專(zhuān)門(mén)用來(lái)做 cpu 資源統(tǒng)計(jì)。cpuacct.stat 統(tǒng)計(jì)了該控制組中進(jìn)程用戶(hù)態(tài)和內(nèi)核態(tài)的 cpu 使用量,單位是 USER_HZ,也就是 jiffies、cpu 滴答數(shù)。每秒的滴答數(shù)可以用 getconf CLK_TCK 來(lái)獲取,通常是 100。將看到的值除以這個(gè)值就可以換算成秒。

  cpuacct.usage 和 cpuacct.usage_percpu 是該控制組中進(jìn)程消耗的 cpu 時(shí)間,單位是納秒。后者是分 cpu 統(tǒng)計(jì)的。

  P.S. 2014-4-22

  發(fā)現(xiàn)在 SLES 11 sp2、sp3 ,對(duì)應(yīng)內(nèi)核版本 3.0.13、 3.0.76 中,對(duì) cpu 子系統(tǒng),將 pid 寫(xiě)入 cgroup.procs 不會(huì)實(shí)際生效,要寫(xiě)入 tasks 才行。在其他環(huán)境中,更高版本或更低版本內(nèi)核上均未發(fā)現(xiàn)

  上面就是Linux中使用cgroups控制cpu資源的方法介紹了,如果你運(yùn)行的程序占用過(guò)多資源,可以使用cgroups控制cpu資源,趕緊試試看吧。

發(fā)表評(píng)論

0

沒(méi)有更多評(píng)論了

評(píng)論就這些咯,讓大家也知道你的獨(dú)特見(jiàn)解

立即評(píng)論

以上留言?xún)H代表用戶(hù)個(gè)人觀點(diǎn),不代表系統(tǒng)之家立場(chǎng)

其他版本軟件

熱門(mén)教程

人氣教程排行

Linux系統(tǒng)推薦

官方交流群 軟件收錄