金钱(警告)
状态: 被剥夺
本文涵盖了不再受支持的 CentOS 版本. 如果您目前正在运行运行 CentOS 6 的服务器,我们强烈建议升级或迁移到受支持的 CentOS 版本。
** 原因**: CentOS 6于2020年11月30日到期(EOL)并且不再收到安全补丁或更新。
** 参见相反**: 此指南可能仍然有用作为参考,但可能不适用于其他 CentOS 版本. 如果可用,我们强烈建议使用为您正在使用的 CentOS 版本撰写的指南。
美元
介绍
控制组(或cgroups)是 CentOS 6 引入的内核功能,旨在为进程提供一种新的限制对系统资源的访问方式,您可以创建自己的 cgroups、监控您配置的 cgroups、阻止 cgroups 访问某些资源,甚至在运行系统上动态重新配置您的 cgroups。
在本教程中,我们将看到如何限制CPU、内存和磁盘i/o的流程. 为了实现这一点,我们将首先创建一些控制组,添加进程,并看看它们的性能。
前提条件
在您开始使用本教程之前,您应该在 CentOS 6 Droplet 上安装一个具有 sudo 设置的非 root 用户。 要设置此类型的用户,请遵循我们的 CentOS 6 初始服务器设置教程。
步骤 1 - 安装
在本节中,我们将安装 cgroups 运作所需的包。
控制组和它们所关联的子系统可以通过壳命令和实用程序进行操纵,但是,与cgroups合作的最简单方法是安装libcgroup
套件。libcgroup
套件提供与cgroups相关的命令行实用程序、配置文件和人的页面。 此套件默认情况下不安装在CentOS 6服务器上。 要安装它,请运行以下命令:
1sudo yum install libcgroup
Step 2 — Starting the Service
The cgconfig
(control group config) service is used to create cgroups and manage subsystems. It can be configured to start up at boot time and reestablish your predefined cgroups, thus making them persistent across reboots. The cgconfig
service is not started by default on CentOS 6, so let us start it:
1sudo service cgconfig start
启动cgconfig
服务将创建一个与所有子系统一起安装在/cgroup
的虚拟文件系统。
1sudo ls /cgroup
此命令应显示以下子系统:
1blkio cpu cpuacct cpuset devices freezer memory net_cls
您还可以运行lscgroup
命令来验证:
1sudo lscgroup
您将看到子系统在稍微不同的布局:
1cpuset:/
2cpu:/
3cpuacct:/
4memory:/
5devices:/
6freezer:/
7net_cls:/
8blkio:/
系统资源
系统资源被称为子系统,每个子系统都有几个参数,我们可以分配值。
- blkio — 本子系统对物理驱动器等块设备(磁盘,固态,USB等)的输入/输出访问设置了限制.
- cpu——本子系统对可用的CPU时间设置了限制
- cpuact——本子系统生成关于croup中的任务所使用的CPU资源的自动报告
- cpuset——本子系统为croup中的任务指定了存储器(在多核心系统中)和内存节点,并生成关于这些任务所使用的存储器资源的自动报告
- net_cls——本子系统发源网包_MBRBR1*** 动态网络优先级控制器为 Linnet MBRBR1 网络优先级控制器设置了此子系统标签_pro-get_groupro-get_groupirlem_pirit
步骤3 - 配置
在本节中,我们将创建示例cgroups,并为这些cgroups设置一些资源限制. cgroup配置文件是 /etc/cgconfig.conf
. 根据配置文件的内容,cgconfig可以创建等级,安装必要的文件系统,创建cgroups,并为每个cgroup设置子系统参数(资源限制)。
Hierarchy 是一组在树上排列的 cgroups,以便系统中的每个任务都位于等级中的一个 cgroups 中。
让我们先创建几个名为 limitcpu, limitmem, limitio 和浏览器的 cgroups. 该 /etc/cgconfig.conf
文件包含两个主要类型的条目 - mount
和 group
. 以 group
开头的行创建 cgroups 并设置子系统参数. 编辑 /etc/cgconfig.conf
文件并在底部添加以下 cgroup 条目:
1[label /etc/cgconfig.conf]
2group limitcpu{
3 cpu {
4 cpu.shares = 400;
5 }
6}
7
8group limitmem{
9 memory {
10 memory.limit_in_bytes = 512m;
11 }
12}
13
14group limitio{
15 blkio {
16 blkio.throttle.read_bps_device = "252:0 2097152";
17 }
18}
19
20group browsers{
21 cpu {
22 cpu.shares = 200;
23 }
24 memory {
25 memory.limit_in_bytes = 128m;
26 }
27}
在limitcpu
cgroup中,我们将可用的CPU份额限制为400个。cpu.shares
指定了可用的CPU时间的相对份额。
- 在
limitmem
cgroup中,我们将可用的CPU份额限制为512MB。 - 在
limitio
cgroup中,我们将磁盘读取量限制为2MiB/s。
我们需要重新启动cgconfig
服务,以便对/etc/cgconfig.conf
文件的更改生效:
1sudo service cgconfig restart
当您使用 chkconfig 启用该服务时,它会在启动时读取 cgroup 配置文件 `/etc/cgconfig.conf。
1sudo chkconfig cgconfig on
接下来,检查我们配置的 cgroups 是否正确显示:
1lscgroup
如果一切顺利,你应该看到:
1cpuset:/
2cpu:/
3cpu:/browsers
4cpu:/limitcpu
5cpuacct:/
6memory:/
7memory:/browsers
8memory:/limitmem
9devices:/
10freezer:/
11net_cls:/
12blkio:/
13blkio:/limitio
我们的下一个目标是将我们想要限制资源的进程(任务)添加到我们之前创建的c组中。
Cgred
(控制组规则引擎daemon)是根据 /etc/cgrules.conf
文件中设置的参数将任务移动到 cgroups 的服务。
1user subsystems control_group
或
1user:command subsystems control_group
用户
是指以@
字符为前缀的用户名或组名称。 子系统
是指一个单元格分离的子系统名称列表。 control_group
是指向cgroup的路径,而command
是指一个过程的过程名称或一个过程的完整命令路径。
@
— 表示一个组而不是个别用户. 例如,@admin
表示管理组中的所有用户.*
— 表示所有
。 例如,用户字段中的 `*’ 表示所有用户。
现在让我们添加我们想要限制的程序/流程. 编辑 /etc/cgrules.conf
并在底部添加以下内容:
1[label /etc/cgrules.conf]
2*:firefox cpu,memory browsers/
3*:hdparm blkio limitio/
4sammy blkio limitio/
5@admin:memhog memory limitmem/
6*:cpuhog cpu limitcpu/
在上面的条款中,我们制定了以下规则:
由任何用户运行的 firefox 流程将自动添加到浏览器
cgroup,并在 CPU 和内存子系统中受到限制。
- hdparm 由任何用户运行的流程将被添加到
limitio
cgroup,并根据该 cgroup中指定的参数值在 blkio 子系统中受到限制。 *所有由用户运行的过程将被添加到limitio
cgroup,并在 blkio 子系统中受到限制。
我们需要启动cgred
服务,以便 cgrules 配置更改生效,使用命令来执行:
1sudo service cgred start
我们还需要确保cgred
服务能够启动系统启动,以便我们的规则在重启过程中继续存在:
1sudo chkconfig cgred on
注意:对于支持 sysconfig 的服务,您可以将变量 CGROUP_DAEMON="subsystem:control_group"
在 /etc/sysconfig/servicename
中添加,而不是编辑 cgrules.conf
文件。
步骤4:测试
在此步骤中,我们将验证磁盘读取输出限制为2MiB/s是否按照我们在cgrules.conf中添加的规则正确执行。为了做到这一点,我们将安装和运行hdparm
工具。
1sudo yum install hdparm
现在,让我们运行一个命令来测量您的硬盘 /dev/vda 的读取速度:
1sudo hdparm --direct -t /dev/vda
你应该看到以下结果:
1/dev/vda:
2 Timing O_DIRECT disk reads: 6 MB in 3.00 seconds = 2.00 MB/sec
如果您停止cgconfig
和cgred
服务并再次运行上述hdparm
命令,您可以看到从 cgroup 规则未实施时的原始/默认读取速度。
结论
还可以创建子组,计算和报告 cgroup 所消耗的资源量,使用 freezer 子系统暂停一组流程,等等。
查看以下资源以获取更多细节: