這回說說怎樣通過 cgroups 來管理 cpu 資源。先說控制程序的 cpu 使用。在乙個機器上執行多個可能消耗大量資源的程式時,我們不希望出現某個程式佔據了所有的資源,導致其他程式無法正常執行,或者造成系統假死無法維護。這時候用 cgroups 就可以很好地控制程序的資源占用。這裡單說 cpu 資源。
cgroups 裡,可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 來限制該組中的所有程序在單位時間裡可以使用的 cpu 時間。這裡的 cfs 是完全公平排程器的縮寫。cpu.cfs_period_us 就是時間週期,預設為 100000,即百毫秒。cpu.cfs_quota_us 就是在這期間內可使用的 cpu 時間,預設 -1,即無限制。
跑乙個耗 cpu 的程式
# echo 'while true: pass'|python &top 一下可以看到,這程序佔了 100% 的 cpu[1] 1532
pid user pr ni virt res shr s %cpu %mem time+ command然後就來對這個程序做一下限制。先把 /foo 這個控制組的限制修改一下,然後把程序加入進去。1532 root 20 0 112m 3684 1708 r 99.6 0.7 0:30.42 python
...
echo 50000 >/sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us可見,修改設定只需要寫入相應檔案,將程序加入 cgroup 也只需將 pid 寫入到其中的 tasks 檔案即可。這裡將 cpu.cfs_quota_us 設為 50000,相對於 cpu.cfs_period_us 的 100000 即 50%。再 top 一下看看效果。echo 1532 >/sys/fs/group/cpu/foo/tasks
pid user pr ni virt res shr s %cpu %mem time+ command可以看到,程序的 cpu 占用已經被成功地限制到了 50% 。這裡,測試的虛擬機器只有乙個核心。在多核情況下,看到的值會不一樣。另外,cfs_quota_us 也是可以大於 cfs_period_us 的,這主要是對於多核情況。有 n 個核時,乙個控制組中的程序自然最多就能用到 n 倍的 cpu 時間。1532 root 20 0 112m 3684 1708 r 50.2 0.7 5:00.31 python
...
這兩個值在 cgroups 層次中是有限制的,下層的資源不能超過上層。具體的說,就是下層的 cpu.cfs_period_us 值不能小於上層的值,cpu.cfs_quota_us 值不能大於上層的值。
另外的一組 cpu.rt_period_us、cpu.rt_runtime_us 對應的是實時程序的限制,平時可能不會有機會用到。
在 cpu 子系統中,cpu.stat 就是用前面那種方法做的資源限制的統計了。nr_periods、nr_throttled 就是總共經過的週期,和其中受限制的週期。throttled_time 就是總共被控制組掐掉的 cpu 使用時間。
還有個 cpu.shares, 它也是用來限制 cpu 使用的。但是與 cpu.cfs_quota_us、cpu.cfs_period_us 有挺大區別。cpu.shares 不是限制程序能使用的絕對的 cpu 時間,而是控制各個組之間的配額。比如
/cpu/cpu.shares : 1024那麼當兩個組中的程序都滿負荷執行時,/foo 中的程序所能占用的 cpu 就是 / 中的程序的兩倍。如果再建乙個 /foo/bar 的 cpu.shares 也是 1024,且也有滿負荷執行的程序,那 /、/foo、/foo/bar 的 cpu 占用比就是 1:2:1 。前面說的是各自都跑滿的情況。如果其他控制組中的程序閒著,那某乙個組的程序完全可以用滿全部 cpu。可見通常情況下,這種方式在保證公平的情況下能更充分利用資源。/cpu/foo/cpu.shares : 2048
此外,還可以限定程序可以使用哪些 cpu 核心。cpuset 子系統就是處理程序可以使用的 cpu 核心和記憶體節點,以及其他一些相關配置。這部分的很多配置都和 numa 有關。其中 cpuset.cpus、cpuset.mems 就是用來限制程序可以使用的 cpu 核心和記憶體節點的。這兩個引數中 cpu 核心、記憶體節點都用 id 表示,之間用 「,」 分隔。比如 0,1,2 。也可以用 「-」 表示範圍,如 0-3 。兩者可以結合起來用。如「0-2,6,7」。在新增程序前,cpuset.cpus、cpuset.mems 必須同時設定,而且必須是相容的,否則會出錯。例如
# echo 0 >/sys/fs/cgroup/cpuset/foo/cpuset.cpus這樣, /foo 中的程序只能使用 cpu0 和記憶體節點0。用# echo 0 >/sys/fs/cgroup/cpuset/foo/cpuset.mems
# cat /proc//status|grep '_allowed_list'可以驗證效果。
cgroups 除了用來限制資源使用外,還有資源統計的功能。做雲計算的計費就可以用到它。有乙個 cpuacct 子系統專門用來做 cpu 資源統計。cpuacct.stat 統計了該控制組中程序使用者態和核心態的 cpu 使用量,單位是 user_hz,也就是 jiffies、cpu 滴答數。每秒的滴答數可以用getconf clk_tck
來獲取,通常是 100。將看到的值除以這個值就可以換算成秒。
cpuacct.usage 和 cpuacct.usage_percpu 是該控制組中程序消耗的 cpu 時間,單位是納秒。後者是分 cpu 統計的。
p.s. 2014-4-22
發現在 sles 11 sp2、sp3 ,對應核心版本 3.0.13、 3.0.76 中,對 cpu 子系統,將 pid 寫入 cgroup.procs 不會實際生效,要寫入 tasks 才行。在其他環境中,更高版本或更低版本核心上均未發現。
windows下禁用CPU導致CPU資源過高
接km公司技術人員反饋,使用者新安裝的一台windows200864位his伺服器,資料庫版本是10.2.0.4,將業務遷移到新伺服器後正常運 況下cpu資源占用異常的高,經常達到100 導致業務經常卡頓,使用者檢視資源管理器未發現異常程序,cpu資源大部分被oracle程序占用。步驟一 首先分析會...
cpu資源,磁碟I O 補充
使用sar來檢查作業系統是否存在io問題 sar u 2 10 即每隔2秒檢察一次,共執行20次。結果示例 注 在redhat下,system就是所謂的 wio。linux 2.4.21 20.elsmp yy075 05 19 2005 10 36 07 am cpu user nice syst...
用網盤和git來管理資源
現在的網盤很多,比如dropbox 快盤 skydriver 115網盤 雲諾 堅果鋪子等,並且功能很強大,大部分提供的客戶端都有自動版本管理和加密傳輸的功能。這為我們管理我們的資源提供了便利條件,一般的資源直接使用網盤已經做夠了。但是我們有這樣的情況,你在家裡突然有乙個 的想法需要實現,但是你無法...