Linux 系統管理員 - 使用 cgroups 進行資源管理



cgroups 或控制組是 Linux 核心的一項功能,允許管理員為服務分配或限制系統資源,並進行分組。

要列出正在執行的活動控制組,我們可以使用以下ps命令:

[root@localhost]# ps xawf -eo pid,user,cgroup,args 
8362 root     -                            \_ [kworker/1:2] 
1 root        -                           /usr/lib/systemd/systemd --switched-
   root --system --    deserialize 21 
507 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-journald 
527 root     7:cpuacct,cpu:/system.slice  /usr/sbin/lvmetad -f 
540 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-udevd 
715 root     7:cpuacct,cpu:/system.slice  /sbin/auditd -n 
731 root     7:cpuacct,cpu:/system.slice   \_ /sbin/audispd 
734 root     7:cpuacct,cpu:/system.slice       \_ /usr/sbin/sedispatch 
737 polkitd  7:cpuacct,cpu:/system.slice  /usr/lib/polkit-1/polkitd --no-debug 
738 rtkit    6:memory:/system.slice/rtki  /usr/libexec/rtkit-daemon 
740 dbus     7:cpuacct,cpu:/system.slice  /bin/dbus-daemon --system --
   address=systemd: --nofork --nopidfile --systemd-activation

截至 CentOS 6.X,資源管理已透過systemd init實現重新定義。在考慮服務的資源管理時,主要關注的是cgroupscgroups在功能和簡易性方面都隨著systemd而發展。

cgroups 在資源管理中的目標是 - 任何服務都不能使整個系統崩潰。或者沒有單個服務程序(可能是編寫不佳的 PHP 指令碼)會透過消耗過多資源來削弱伺服器功能。

cgroups 允許對以下資源的單元進行資源控制:

  • CPU - 限制那些不重要的 CPU 密集型任務,以便其他不太密集的任務能夠執行。

  • 記憶體 - 限制服務可以消耗的記憶體量。

  • 磁碟 - 限制磁碟 I/O。

**CPU 時間:**

需要較低 CPU 優先順序的任務可以擁有自定義配置的 CPU 時間片。

讓我們以以下兩個服務為例。

禮貌的 CPU 服務 1

[root@localhost]# systemctl cat polite.service 
# /etc/systemd/system/polite.service 
[Unit] 
Description = Polite service limits CPU Slice and Memory 
After=remote-fs.target nss-lookup.target

[Service] 
MemoryLimit = 1M 
ExecStart = /usr/bin/sha1sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/polite.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

惡意的 CPU 服務 2

[root@localhost]# systemctl cat evil.service 
# /etc/systemd/system/evil.service 
[Unit] 
Description = I Eat You CPU 
After=remote-fs.target nss-lookup.target

[Service] 
ExecStart = /usr/bin/md5sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/evil.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

讓我們使用較低的 CPU 優先順序設定禮貌服務:

systemctl set-property polite.service CPUShares = 20  
/system.slice/polite.service
1   70.5   124.0K        -        -  

/system.slice/evil.service
1   99.5   304.0K        -        -

我們可以看到,在一段正常的系統空閒時間內,兩個流氓程序仍在使用 CPU 週期。但是,設定為較少時間片的程序使用的 CPU 時間較少。考慮到這一點,我們可以看到使用較少的時間片將如何允許基本任務更好地訪問系統資源。

要為每個資源設定服務,set-property方法定義了以下引數:

systemctl set-property name parameter=value

CPU 時間片 CPUShares
記憶體限制 MemoryLimit
軟記憶體限制 MemorySoftLimit
塊 IO 權重 BlockIOWeight
塊裝置限制(在 /volume/path 中指定)) BlockIODeviceWeight
讀取 IO BlockIOReadBandwidth
磁碟寫入 IO BlockIOReadBandwidth

大多數情況下,服務將受到CPU 使用率記憶體限制讀/寫 IO的限制。

更改每個引數後,需要重新載入 systemd 並重新啟動服務:

systemctl set-property foo.service CPUShares = 250 
systemctl daemon-reload 
systemctl restart foo.service

在 CentOS Linux 中配置 CGroups

要在 CentOS Linux 中建立自定義 cgroups,我們需要首先安裝服務並對其進行配置。

步驟 1 - 安裝 libcgroup(如果尚未安裝)。

[root@localhost]# yum install libcgroup 
Package libcgroup-0.41-11.el7.x86_64 already installed and latest version 
Nothing to do 
[root@localhost]#

我們可以看到,預設情況下,CentOS 7 已透過everything安裝程式安裝了 libcgroup。使用最小安裝程式將要求我們安裝libcgroup實用程式以及任何依賴項。

步驟 2 - 啟動並啟用 cgconfig 服務。

[root@localhost]# systemctl enable cgconfig 
Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service 
to /usr/lib/systemd/system/cgconfig.service. 
[root@localhost]# systemctl start cgconfig 
[root@localhost]# systemctl status cgconfig 
● cgconfig.service - Control Group configuration service 
Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor 
preset: disabled) 
Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago 
Main PID: 4692 (code=exited, status = 0/SUCCESS) 
Memory: 0B 
CGroup: /system.slice/cgconfig.service  

Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group 
configuration service... 
Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group 
configuration service. 
[root@localhost]#
廣告