如何在CentOS上使用cgroup限制CPU|内存|IO等资源–CentOS 6/7/RHEL适用

自己留存备忘,翻译自:How To Limit Resources Using cgroups on CentOS 6

介绍

控制组或cgroup是CentOS 6中引入的内核功能,它提供了一种限制进程对系统资源的访问的新方法。您可以创建自己的cgroup,监视您配置的cgroup,拒绝cgroup访问某些资源,甚至可以在正在运行的系统上动态重新配置cgroup。

在本教程中,我们将了解如何限制进程的CPU,内存和磁盘i / o。为此,我们将首先创建一些控制组,向它们添加流程,并查看它们的执行方式。

先决条件

在开始学习本教程之前,您应该在CentOS 6上安装sudo的非root用户。要设置此类型的用户,请按照我们的初始服务器设置和CentOS 6教程进行操作。所有命令都将以此用户身份运行。

第1步 – 安装

在本节中,我们将安装cgroup运行所需的软件包。

可以使用shell命令和实用程序来操纵控制组及其相关的子系统。但是,使用cgroups最简单的方法是安装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 – 此子系统将单个CPU(在多核系统上)和内存节点分配给cgroup中的任务
  • devices – 此子系统允许或拒绝cgroup中的任务对设备的访问
  • freezer – 此子系统暂停或恢复cgroup中的任务
  • memory – 此子系统设置cgroup中任务对内存使用的限制,并生成这些任务使用的内存资源的自动报告
  • net_cls – 此子系统使用类标识符(classid)标记网络数据包,该类标识符允许Linux流量控制器(tc)识别源自特定cgroup任务的数据包
  • net_prio – 此子系统提供了一种动态设置每个网络接口的网络流量优先级的方法
  • ns – 这是命名空间子系统

第3步 – 配置

在本节中,我们将创建示例cgroup并为这些cgroup设置一些资源限制。cgroup配置文件是/etc/cgconfig.conf。根据配置文件的内容,cgconfig可以为每个cgroup创建层次结构,安装必要的文件系统,创建cgroup和设置子系统参数(资源限制)。

层次结构是排列在树中的一组cgroup,这样系统中的每个任务都恰好位于层次结构中的一个cgroup中。在默认的CentOS 6配置中,每个子系统都放在自己的层次结构中。

我们首先创建一些名为limitcpu,limitmem,limitio和browsers的cgroup。该/etc/cgconfig.conf文件包含两种主要类型的条目 – mountgroup。以groupcreate cgroups和set subsystem parameters 开头的行。编辑文件/etc/cgconfig.conf并在底部添加以下cgroup条目:

/etc/cgconfig.conf
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;
        }
}
  • limitcpucgroup中,我们将此cgroup中进程可用的cpu份额限制为400. cpu.shares指定cgroup中任务可用的CPU时间的相对份额。
  • limitmemcgroup中,我们将cgroup进程可用的内存限制为512MB。
  • limitiocgroup中,我们将磁盘读取吞吐量限制为2MiB / s。这里我们将读取I / O限制为主磁盘/ dev / vda,其中major:次要编号252:0和2MiB / s被转换为每秒字节数(2x1024x1024 = 2097152)。
  • browserscgroup中,我们将cpu份额限制为200,可用内存限制为128MB。

我们需要重新启动cgconfig服务才能使/etc/cgconfig.conf文件中的更改生效:

sudo service cgconfig restart

让我们启用cgconfig系统启动。使用chkconfig启用服务时,它会/etc/cgconfig.conf在引导时读取cgroup配置文件。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(控制组规则引擎守护程序)是一种根据/etc/cgrules.conf文件中设置的参数将任务移动到cgroup中的服务。/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并在底部添加以下内容:

/etc/cgrules.conf
*:firefox       cpu,memory      browsers/
*:hdparm        blkio   limitio/
sammy   blkio   limitio/
@admin:memhog  memory  limitmem/
*:cpuhog        cpu     limitcpu/

在上面的行中,我们设置了以下规则:

  • 由任何用户运行的firefox进程将自动添加到browserscgroup并限制在cpu和内存子系统中。
  • 由任何用户运行的hdparm进程将被添加到limitiocgroup,并将根据该cgroup中指定的参数值限制在blkio子系统中。
  • 用户sammy运行的所有进程都将添加到limitiocgroup并限制在blkio子系统中。
  • admin组中的任何人运行的memhog进程将被添加到cgroup limitmem并限制在内存子系统中。
  • 由任何用户运行的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进程添加到limitiocgroup。

第4步 – 测试

在此步骤中,我们将根据我们添加的规则验证是否正确实施了磁盘读取吞吐量限制2MiB / s 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。如果同时停止cgconfigcgred服务并hdparm再次运行上面的命令,则可以从未实现cgroup规则时看到原始/默认读取速度。

结论

本教程仅介绍了您可以使用cgroup执行的一些基本操作。还可以创建子cgroup,计算和报告cgroup消耗的资源量,使用冷冻子系统挂起一组进程等等。

有关更多详细信息,请查看以下资源:

说点什么

Please Login to comment
avatar
  Subscribe  
提醒