1. CGroup(控制群組)、slice(切片)、scop、service 控制群組(control group)是linux kernel的一項功能, 該功能允許linux對RHEL7中systemd下掛載的所有進程按類別分組, 從而使得系統管理員可以按需對linux的系統資源(如CPU時間、系 ...
1. CGroup(控制群組)、slice(切片)、scop、service
控制群組(control group)是linux kernel的一項功能, 該功能允許linux對RHEL7中systemd下掛載的所有進程按類別分組, 從而使得系統管理員可以按需對linux的系統資源(如CPU時間、系統記憶體、網路帶寬、磁碟IO等)進行合理分配. 通過CGroup進行系統資源切片(slice), 系統管理員可以在分配、排序、拒絕、管理和監控系統資源等方面, 進行精細化控制, 使硬體資源在應用程式和用戶之間合理分配, 最大限度挖掘系統軟硬體性能.
CGroup的操作對象slice、scope、service 是由systemd自動創建的. RHEL7中運行的所有進程都是systemd的子進程, systemd創建的進程(實際是用戶發出操作指令,systemd按照指令創建進程)會由systemd按照相應的指令參數分配到對應的slice、scope、service中,該進程將得到CGroup事先分配好的各種系統資源(特殊情況下,系統管理員為給特定程式或進程組優先分配系統資源,通常會單獨為該進程組創建或優化系統資源切片(slice)).
2. linux Kernel的資源管控器
資源管控器(CGroup子系統)更直觀的概念類似於windows中的控制面板,但是資源管控器在linux中可調校的參數更多,管理更複雜.
RHEL7中systemd預設啟用了以下管控器:
blkio —— 對輸入/輸出訪問存取塊設備設定許可權;
cpu —— 使用CPU調度程式讓CGroup的任務可以存取CPU, 與CPUACCT管控器一起掛載在同一個mount上;
cpuset —— 給cgroup中的任務分配獨立CPU和記憶體節點;
devices —— 允許或禁止cgroup中的任務存取設備;
freezer —— 暫停或恢復cgroup中的任務;
memory —— 限制cgroup中任務可用記憶體, 並且自動生成任務占用記憶體資源的報告;
net_cls —— 使用等級識別符(classid)標記網路數據包,使linux的流量控制器(tc指令)可以識別來自特定cgroup的任務數據包;
perf_event —— 允許使用perf工具來監控cgroup;
hugetlb —— 允許使用大的虛擬記憶體頁,並且給這些記憶體頁強制設定可用資源量.
3. 管理控制群組(cgroup)
(1)創建控制群組
systemd-run命令用於創建、啟動臨時的service或scope, 併在此單位中運行自定義指令. 在service單位中執行的指令在後臺非同步啟動, 由systemd進程調用.在scope單位中運行的指令直接從systemd-run進程中啟動,繼承systemd的執行狀態.
systemd-run --unit=<name> --scope --slice=<slice_name> <command>
name 自定義單位名稱. 如果不指定--unit,系統會自動生成一個.
--scope 創建臨時scope單位. 如果不指定,系統預設創建的是service單位.
--slice選項, 新建一個資源切片. 如果不指定名稱, 系統會預設將創建的 .service或 .scope掛載到system.slice.
command 將要在新建的 slice-scope或slice-service中運行的指令.
下圖是在同一個slice中分別運行了兩個top命令,一個指定掛載到scope; 一個沒有指定,系統預設掛載到service.
(2)刪除控制群組
systemctl stop name.service
或者
systemctl kill name.service --kill-who=pid,... --signal=signal
或者
systemctl disable name.service
發現了什麼?很熟悉的味道!
(3)修改控制群組的單位文件
這就是systemd依據/usr/lib/systemd/system/ 目錄下的 XXX.service 文件對進程的管理. 換句話說, 就是我們可以自行創建修改 XXX.service, 實現對進程運行資源的管理.
例如, 要給Apache service分配1500個CPU share (預設為1024個), 可以修改/usr/lib/systemd/system/httpd.service 文件中CPU、記憶體、網路帶寬等值:
[service] CPUShares=1500 #設定CPUShares
MenmoryLimit=1G #設定apache記憶體限制
BlockIOWeight=/usr/local/pic 750 #設定apache對/usr/local/pic目錄的IO權重
BlockIOReadBandWith=/usr/local/pic 5M #設定apache對/usr/local/pic目錄的最大讀取帶寬
重載daemon 使設定生效:
systemctl daemon-reload
systemctl restart httpd.service
(4)命令行修改進程的運行資源
當然,還可以通過命令行設定進程的運行資源:
設定Apache https.service的CPU和記憶體占用量: systemctl set-property httpd.service CPUShares=600 MenoryLimit=500M 利用 --runtime 選項使設定為臨時更改: systemctl set-property --runtime httpd.service CPUShares=600 MemoryLimit=500M
同一臺主機,kvm1中運行DB1.service, km2中運行DB.2service, 為DB1、DB2根據使用優先順序分配IO資源:
systemctl set-property DB1.service BlockIOWeight=1000 systemctl set-property DB2.service BlockIOWeight=100
為同一臺主機中NFS和Samba服務設定網路優先順序:
1.net_prio管控器並未編譯進kernel, 使用時必須手動裝載該模塊:
~]#modprobe netprio_cgroup
2.將net_prio子系統附加到/cgroup/net_prio 的cgroup 中:
~]#mkdir sys/fs/cgroup/net_prio
~]#mount -t cgroup -o net_prio none sys/fs/cgroup/net_prio
3.為各項服務創建cgroup:
~]#mkdir sys/fs/cgroup/net_prio/nfs_high
~]#mkdir sys/fs/cgroup/net_prio/samba_low
4.將NFS服務自動移至nfs_high cgroup :
~]#echo "CGROUP_DAEMON="net_prio:nfs_high"" >> /etc/sysconfig/nfs
5.將smbd自動移至samba_low cgroup :
~]#echo "*:smbd net_prio samba_low" >> /etc/cgrules.conf
6.啟動cgred服務
~]#systemctl start cgred
7.設定NFS和samba的優先順序:
~]#echo "eth1 1" >/sys/fs/cgroup/net_prio/samba_low/net_prio.ifpriomap
~]#echo "eth1 10">/sys/fs/cgroup/net_prio/nfs_high/net_prio.ifiomap
RHEL7的系統資源管理工具很豐富, 在RHEL7中仍然保留了早期版本的libcgroup數據包, 仍然可以啟用cgconfig服務實現系統資源的層級管理.
後續更新RHEL7中資源管理的各種可調參數.