Linux Admin – 使用 crgoups 进行资源管理

Linux Admin – 使用 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实现重新定义在考虑服务的资源管理时,主要关注的是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 Slices CPU份额
Memory Limit 内存限制
Soft Memory Limit 内存软限制
Block IO Weight 块IO权重
Block Device Limit (specified in /volume/path) ) 块IO设备权重
Read IO 块IO读取带宽
Disk Write IO 块IO读取带宽

大多数情况下,服务会受到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 和Everything安装程序。使用最小安装程序需要我们安装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]#

觉得文章有用?

点个广告表达一下你的爱意吧 !😁