介绍
控制组或cgroup是CentOS 6中引入的内核功能,用于提供限制对进程的系统资源访问的新方法。 您可以创建自己的cgroup,监视配置的cgroup,拒绝cgroup访问某些资源,甚至在运行的系统上动态重新配置cgroup。
在本教程中,我们将了解如何限制进程的CPU,内存和磁盘i / o。 为了实现这一点,我们将首先创建一些控制组,向它们添加进程,并查看它们的性能。
先决条件
在开始使用本教程之前,您应该有一个非root用户在CentOS 6 Droplet上进行sudo设置。 要设置这种类型的用户,按照我们在CentOS 6初始服务器设置教程。 所有命令将作为此用户运行。
第1步 - 安装
在本节中,我们将安装cgroups所需的软件包。
可以使用shell命令和实用程序来操纵控制组及其相关的子系统。 然而,随着cgroup中工作的最简单的方法就是安装libcgroup
包。 该libcgroup
软件包提供的cgroup有关的命令行工具,配置文件和手册页。 默认情况下,此软件包不安装在CentOS 6服务器上。 要安装它,请运行以下命令:
sudo yum install libcgroup
第2步 - 启动服务
该cgconfig
(对照组配置)服务用于创建的cgroup和管理子系统。 它可以配置为在引导时启动并重新建立预定义的cgroup,从而使它们在重新启动后保持不变。 该cgconfig
服务默认情况下未在CentOS 6日开始,所以让我们开始吧:
sudo service cgconfig start
启动cgconfig
服务创建安装在一个虚拟文件系统/cgroup
所有的子系统。 让我们验证一下:
sudo ls /cgroup
此命令应显示以下子系统:
blkio cpu cpuacct cpuset devices freezer memory net_cls
您还可以运行`lscgroup'命令来验证:
sudo lscgroup
您将看到子系统在一个稍微不同的布局:
cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/
系统资源
系统资源称为子系统,每个子系统有几个参数,我们可以为其分配值。 CentOS 6提供了十个cgroup子系统:
- blkio -这个子系统上设置的输入/输出访问和来自块设备如物理驱动器(磁盘,固态,USB等)的限制。
- CPU -这个子系统上设置的可用CPU时间限制
- cpuacct -这个子系统生成cgroup中使用的任务上的CPU资源的自动报告
- cpuset -这个子系统的cgroup中各个CPU(在多核系统)和内存节点分配给任务
- 设备 -这个子系统允许或者在cgroup中通过任务拒绝访问设备
- 冰箱 -这个子系统挂起或者在cgroup中恢复任务
- 内存 -这个子系统设置在cgroup中的任务对内存使用的限制,并生成由那些任务使用的内存资源的自动报告
- net_cls -这个子系统代码与类标识符(的classid),允许在Linux流量控制器(TC),以确定从特定cgroup中任务始发分组网络分组
- net_prio -这个子系统提供了一种动态地设置每个网络接口的网络流量的优先级
- NS -这是命名空间子系统
第3步 - 配置
在本节中,我们将创建示例cgroups并为这些cgroup设置一些资源限制。 该cgroup配置文件是/etc/cgconfig.conf
。 根据配置文件的内容,cgconfig可以为每个cgroup创建层次结构,安装必要的文件系统,创建cgroup以及设置子系统参数(资源限制)。
层次结构是以树布置的cgroup的集合,使得系统中的每个任务恰好在层次结构中的cgroup中的一个中。 在默认的CentOS 6配置中,每个子系统都放入其自己的层次结构中。
让我们先创建一个名为limitcpu,limitmem,limitio和浏览器的cgroup。 该/etc/cgconfig.conf
文件包含两种主要类型的条目- mount
和group
。 这样开始的行group
创建的cgroup并设置子系统参数。 编辑文件/etc/cgconfig.conf
并在底部添加下面cgroup中的条目:
group limitcpu{
cpu {
cpu.shares = 400;
}
}
group limitmem{
memory {
memory.limit_in_bytes = 512m;
}
}
group limitio{
blkio {
blkio.throttle.read_bps_device = "252:0 2097152";
}
}
group browsers{
cpu {
cpu.shares = 200;
}
memory {
memory.limit_in_bytes = 128m;
}
}
- 在
limitcpu
cgroup中,我们限制了CPU份额提供给这个cgroup中进程400cpu.shares
指定的CPU时间的相对份额提供给该cgroup的任务。 - 在
limitmem
cgroup中,我们会限制到该cgroup进程512MB显存。 - 在
limitio
cgroup中,我们限制了磁盘读取吞吐量以2MiB /秒。 这里我们将读取I / O限制到主磁盘/ dev / vda,主要:minor number 252:0和2MiB / s转换为每秒字节数(2x1024x1024 = 2097152)。 - 在
browsers
CGROUP,我们限制了CPU份额为200和可用内存为128MB。
我们需要重新启动cgconfig
在变更服务/etc/cgconfig.conf
文件生效:
sudo service cgconfig restart
让我们使cgconfig
开始在系统启动。 当您启用chkconfig的服务,它读取该cgroup配置文件/etc/cgconfig.conf
在启动时。 cgroups从会话重建到会话并保持持久。
sudo chkconfig cgconfig on
接下来,验证我们配置的cgroup是否正确显示:
lscgroup
如果一切顺利,你应该看到:
cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio
我们的下一个目标是将我们希望限制资源的进程(任务)添加到我们之前创建的cgroup。
Cgred
(对照组规则引擎后台程序)是根据设定的参数移动到任务cgroup中服务/etc/cgrules.conf
文件。 在条目/etc/cgrules.conf
文件可采取两种形式之一:
user subsystems control_group
要么
user:command subsystems control_group
user
是指用户名或用“@”字符。前缀组名subsystems
是指以逗号分隔的子系统名称的列表。 control_group
代表到该cgroup的路径, command
代表一个进程名称或一个完整的命令路径处理。 在条目/etc/cgrules.conf
文件可包括以下额外符号:
-
@
-表示的基团,而不是单个用户。 例如,@admin
表示管理组中的所有用户。 -
*
-代表“所有”。 例如,*
在用户字段表示所有用户。 -
%
-表示的项相同,在上面的行中的项。
现在让我们添加我们希望限制的程序/进程。 编辑/etc/cgrules.conf
并添加以下底部:
*:firefox cpu,memory browsers/
*:hdparm blkio limitio/
sammy blkio limitio/
@admin:memhog memory limitmem/
*:cpuhog cpu limitcpu/
在上面的行中,我们设置以下规则:
- 任何用户使用Firefox进程将被自动添加到
browsers
CGROUP,并在CPU和内存子系统的限制。 - 由任何用户运行hdparm的进程将被添加到
limitio
cgroup中,并根据在该cgroup中指定的参数值将在blkio子系统的限制。 - 由用户sammy运行的所有进程将被添加到
limitio
cgroup中和在blkio子系统的限制。 - memhog处理由任何人运行
admin
组将被添加到该cgrouplimitmem
和在存储器子系统的限制。 - 由任何用户运行CPUHOG进程将被添加到该cgroup
limitcpu
并在CPU子系统的限制。
我们需要启动cgred
服务为cgrules配置更改生效,为此使用以下命令:
sudo service cgred start
我们还需要确保cgred
服务已启用,开始在系统启动时,使我们的规则仍然存在在重新引导:
sudo chkconfig cgred on
注意:对于支持sysconfig中的服务,您可以添加变量CGROUP_DAEMON="subsystem:control_group"
中/etc/sysconfig/servicename
,而不是编辑cgrules.conf
文件。 例如,对于像httpd服务,您可以添加CGROUP_DAEMON="blkio:/limitio"
到文件/etc/sysconfig/httpd.conf
到httpd过程添加到limitio
cgroup中。
第4步 - 测试
在这一步中,我们将验证2MiB /秒的磁盘读取吞吐量极限按照我们添加的规则正确实施cgrules.conf
。 要做到这一点,我们将安装并运行hdparm
工具。 该hdparm
工具,可以设置和硬盘驱动器的角度硬件参数,测量读写速度,等我们安装使用hdparm的:
sudo yum install hdparm
现在,让我们运行一个命令来测量硬盘/ dev / vda的读取速度:
sudo hdparm --direct -t /dev/vda
您应该看到以下输出:
/dev/vda:
Timing O_DIRECT disk reads: 6 MB in 3.00 seconds = 2.00 MB/sec
输出显示磁盘读取吞吐量为2MB / s。 如果你同时停止cgconfig
和cgred
服务和运行hdparm
再次上面的命令,你可以看到,当cgroup的规则没有实现原来的/默认读取速度。
结论
本教程仅介绍了您可以对cgroups执行的一些基本操作。 另外,也可以创建子的cgroup,计数并报告cgroup中所消耗的资源量,暂停一组使用冷冻子系统过程,等等。
有关详细信息,请查看以下资源: