Linux资源管理与crgoups


cgroups 或Control Groups是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 实现进行了重新定义。在思考资源管理服务时,主要关注的是 cgroupcgroups 在功能和简单性方面都采用了 systemd

cgroups在资源管理中的目标是 - 没有任何一项服务可以将整个系统从整体上降低。或者没有一个单独的服务过程(可能是写得不好的PHP脚本)会通过消耗太多资源来削弱服务器功能。

cgroups 允许单位资源控制以下资源 -

  • CPU - 限制cpu密集型任务与其他不太密集型任务不重要

  • 内存 - 限制服务可消耗的内存量

  • 磁盘 - 限制磁盘I / O

CPU时间:

需要较少CPU优先级的任务可以具有自定义配置的CPU片。

例如,我们来看看以下两个服务。

Polite CPU Service 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]#

Evil CPU Service 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 Slices CPUShares
Memory Limit MemoryLimit
Soft Memory Limit MemorySoftLimit
Block IO Weight BlockIOWeight
Block Device Limit (specified in /volume/path) ) BlockIODeviceWeight
Read IO BlockIOReadBandwidth
Disk Write IO BlockIOReadBandwidth

最常见的服务将受到 CPU使用内存限制读/写IO的 限制

每次更改后,都需要重新加载systemd并重新启动服务 -

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

在CentOS Linux中配置CGroups

要在CentOS Linux中创建自定义cgroup,我们需要先安装服务并配置它们。

第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已经安装了 所有 安装程序的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]#