使用cgroups控制進程cpu配額
在數據採集器運行的過程中,常常遇到佔用CPU配額較高的情況。
夏洛克ITOA採集器使用了cgroups來控制cpu的佔用,這下不用擔心CPU資源不夠啦。
—— Molly茉莉小編
Linux下的cgroups,全稱叫Control Groups,最初由Google工程師提出並實現,linux從2.6開始將這個特性納入內核。cgroups主要對進程按組(Group)進行資源配額的控制,包括CPU、內存、IO等,相比古老的ulimit,cgroups更為平滑和易用,成為容器技術(比如docker)的基礎。
cgroups的形態
cgroups.png
hierarchy:cgroups從用戶態看,提供了一種叫cgroup類型的文件系統(Filesystem),這是一種虛擬的文件系統,並不真正保存文件,類似/proc。通過對這個文件系統的操作(讀,寫,創建子目錄),告訴內核,你希望內核如何控制進程對資源的使用。文件系統本身是層級的,所以構成了hierarchy。
task:進程(process)在cgroups中稱為task,taskid就是pid。
subsystem:cgroups支持的所有可配置的資源稱為subsystem。例如cpu是一種subsystem,memory也是一種subsystem。linux內核在演進過程中subsystem是不斷增加的。
libcgroup:一個開源軟體,提供了一組支持cgroups的應用程序和庫,方便用戶配置和使用cgroups。目前許多發行版都附帶這個軟體。
事實上,使用cgroups是非常簡單的,幾行shell命令就可以。下面以CPU子系統為例,來嘗試控制一個進程的CPU利用率。
1
掛載cgroup文件系統
首先掛載cgroup文件系統:
# mkdir -p /cgroup/mave# mount -t cgroup -o cpu mave /cgroup/mave# cat /proc/mounts...mave /cgroup/mave cgroup rw,relatime,cpu 0 0
上面的命令掛載了一個cpu子系統,目錄為/cgroup/mave,名字叫mave。cpu子系統用於控制進程的cpu總體佔用率,是最常用的子系統。內核會根據配額的設置在調度進程上做出相應的調整。
觀察/cgroup/mave目錄:
# ls /cgroup/mavecgroup.event_controlcpu.cfs_period_uscpu.rt_period_uscpu.sharesnotify_on_releasecgroup.procscpu.cfs_quota_uscpu.rt_runtime_uscpu.statrelease_agenttasks
這些文件是自動創建出來的,且都跟cpu這個子系統有關。不同的子系統會創建出不同的文件。我們重點關註:
cpu.cfs_period_us
cpu.cfs_quota_us
tasks
tasks
這個文件裡面可以寫入一個或多個taskid(pid),/cgroup/mave這個組中的配額設置將影響這些task。
cpu.cfs_period_us
# cat /cgroup/mave/cpu.cfs_period_us100000
表示將cpu時間片分成100000份。
cpu.cfs_quota_us
# cat /cgroup/mave/cpu.cfs_period_us200000
表示當前這個組中的task(/cgroup/mave/tasks中的taskid)將分配多少比例的cpu時間片。由於是雙核cpu,這裡就表示最多可以用到200%的CPU。
2
創建一個控制組
儘管根目錄(/cgroup/mave)也可以設置配額,但是習慣上,我們在這個目錄下創建一個目錄,作為一個控制組,這個控制組可以單獨設置配額,而不影響其他控制組:
# mkdir /cgroup/mave/steam# ls /cgroup/mave/steamcgroup.event_controlcpu.cfs_period_uscpu.rt_period_uscpu.sharesnotify_on_releasecgroup.procscpu.cfs_quota_uscpu.rt_runtime_uscpu.stattasks
可以看到,創建的steam目錄下也會自動創建出一堆cpu子系統相關的文件,幾乎和根目錄(/cgroup/mave)完全一樣。現在我們再來理解一下什麼是hierarchy:
hierarchy就是一個帶有繼承關係的目錄層次,每一層形成一個控制組,單獨控制其中的task。
一個文件系統可以同時掛載多種子系統
3
手動設置配額
採集器進程在不受限制的情況下全速採集,CPU佔用率達到:
將5000寫入cpu.cfs_quota_us,表示希望CPU佔用率控制在(5000/100000=5%)以內:
# echo 5000 > /cgroup/mave/steam/cpu.cfs_quota_us
然後將進程號30126寫入tasks:
# echo 30126 >> /cgroup/mave/steam/tasks
觀察cpu佔用率,瞬間降到。
4
自動設置
可以看到,使用cgroups十分簡單,效果很好。然而,進程id並不是每次都保持不變。我們需要一些自動化的機制。上文提到過libcgroup,這個庫提供了掛載、配置和運行的程序和庫。
附:cgroups中的子系統
blkio 設置限制每個塊設備的輸入輸出控制。例如:磁碟,光碟以及usb等等。
cpu 使用調度程序為cgroup任務提供cpu的訪問。
cpuacct 產生cgroup任務的cpu資源報告。
cpuset 如果是多核心的cpu,這個子系統會為cgroup任務分配單獨的cpu和內存。
devices 允許或拒絕cgroup任務對設備的訪問。
freezer 暫停和恢復cgroup任務。
memory 設置每個cgroup的內存限制以及產生內存資源報告。
net_cls 標記每個網路包以供cgroup方便使用。
ns 名稱空間子系統。
perf_event 增加了對每group的監測跟蹤的能力,即可以監測屬於某個特定的group的所有線程以及運行在特定CPU上的線程,此功能對於監測整個group非常有用。
夏洛克 ITOA
為企業量身定製的IT運維專家
人工智慧 機器學習 IT運維
TAG:夏洛克ITOA |
※Zabbix低級發現監控supervisor管理的進程
※使用 shell 構建多進程的 CommandlineFu 爬蟲
※Linux查殺stopped進程
※Process-Forest-Window進程日誌分析工具;python版的BloodHound
※tomcat 在liunx系統中shutdown後進程仍然存在解決辦法
※python threading中處理主進程和子線程的關係
※如何利用Pspy監控沒有Root許可權的Linux進程
※人性化的子進程:Delegator.py
※Linux系統監控與進程管理軟體—Htop取代top
※如何針對Windows中ConsoleWindowClass對象實現進程注入
※python logging 日誌模塊以及多進程日誌
※蘋果iOS 13將限制VolP後台進程 或影響Facebook等應用通話功能
※Android 進程和線程
※五種尋找 「Domain Admin」 運行的進程的方法
※雷諾-日產-三菱聯盟投資The Mobility House 加速電動化出行進程
※linux進程信息查詢命令lsof詳解
※Linux進程管理
※用 Python 管理系統進程
※如何在 Linux/Unix/Windows 中發現隱藏的進程和埠
※Python多進程編程