Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

2.3. 修改 cgroup

所有被 systemd 监管的永久单位都在 /usr/lib/systemd/system/ 目录中有一个单位配置文件。如要修改 service 单位的参数,请修改此配置文件。可以手动完成或者从命令列界面使用 systemctl set-property 指令。

2.3.1. 在命令列界面设定参数

systemctl set-property 指令让您可以在应用程序运行时,持续修改资源管控设置。请以 root 身份使用下列句法来完成此项操作:
systemctl set-property name parameter=value
用您希望修改的 systemd 名字来替代 name,希望改动的参数名称来替代 parameter,希望分配给此参数的新值来替代 value
并非所有单位参数都能在运行时被修改,但是大多数与资源管控相关的参数是可以的。如需要完整列表,请参阅〈第 2.3.2 节 “修改单位文件”〉。提示:systemctl set-property 指令让您可以同时修改多项属性,所以相较于单独设定每项属性,推荐您使用此指令。
改动会立即生效并被写入单位文件,并在重启后保留。您可以传递 --runtime 选项,让设定变成临时设定。
systemctl set-property --runtime name property=value

例 2.2. 使用 systemctl set-property

如需使用命令列来限定 httpd.service 的 CPU 和内存占用量,请输入:
~]# systemctl set-property httpd.service CPUShares=600 MemoryLimit=500M
如希望此更改为临时更改,请添加 --runtime 选项:
~]# systemctl set-property --runtime httpd.service CPUShares=600 MemoryLimit=500M

2.3.2. 修改单位文件

systemd service 单位文件提供一系列对资源管理有帮助的高级配置参数。这些参数与必须在 kernel 中启用的 Linux cgroup 管控器通讯。您可以使用这些参数管理 CPU、内存使用量、block IO和更多精细单位的属性。

管理 CPU

cpu 管控器在 kernel 中被默认启动,这可使所有系统 service 的可用 CPU 量相同,而与其所包含进程数量无关。此项默认设定可以使用 /etc/systemd/system.conf 配置文件中的 DefaultControllers 参数来修改。如需管理 CPU 的分配,请使用单位配置文件 [Service] 部分中的下列指令:
CPUShares=value
请用 CPU share 的数量代替 value。默认值为 1024,您可以增加此数值来给单位分配更多 CPU。此参数默认:CPUAccounting 已在单位文件中启用。
CPUShares 参数可以控制 cpu.shares 控制群组参数。 请参阅〈Kernel 管控器专项介绍〉对 cpu 管控器的描述来查阅其它与 CPU 相关的控制参数。

例 2.3. 限定一个单位的 CPU 可用量

若要为 Apache service 分配 1500 个 CPU share 而不是 1024 个,请修改 /usr/lib/systemd/system/httpd.service 单位文件中的 CPUShares 设置:
[Service]
CPUShares=1500
要应用此项修改,请重新载入 systemd 的配置并重启 Apache 来让修改过的 service 文件生效:
~]# systemctl daemon-reload
~]# systemctl restart httpd.service

内存管理

为限定单位可用内存大小,请使用单位配置文件 [Service] 部分中的下列指令:
MemoryLimit=value
对 cgroup 中执行的进程设定其可用内存的最大值,并用此值替代 value。请以千字节(Kilobyte)、兆字节(Megabyte)、千兆字节(Gigabyte)、太字节(Terabyte)为计量单位并使用 KMGT 后缀来表示。同样,MemoryAccounting 参数必须在同一单元中启用。
MemoryLimit 参数可以控制 memory.limit_in_bytes 控制群组参数。更多信息,请参阅〈Kernel 管控器专项介绍〉中对 memory 管控器的描述。

例 2.4. 限制一个单位的可用内存量

若要限定 Apache service 的最大可用内存为 1GB,请修改 /usr/lib/systemd/system/httpd.service 单位文件中的 MemoryLimit 设定:
[Service]
MemoryLimit=1G
要应用此项修改,请重新载入 systemd 的配置并重启 Apache 来让修改过的 service 文件生效:
~]# systemctl daemon-reload
~]# systemctl restart httpd.service

管理 Block IO

如要管理 Block IO,请使用单位配置文件 [Service] 部分中的下列指令。下列指令假设 BlockIOAccounting 参数已启动:
BlockIOWeight=value
为已执行进程选取一个新的整体 block IO 权重,并以此替代 value。权重需在 10 到 1000 之间选择,默认值是 1000。
BlockIODeviceWeight=device_name value
请为 device_name 所指的设备选取 block IO 权重,并以此代替 value。用名称或者通向此设备的路径来代替 device_name。因为有 BlockIOWeight,您可以在 10 到 1000 之间选取权重值。
BlockIOReadBandwidth=device_name value
此指令可以为一个单位限定具体带宽。用设备名称或通向块设备节点的路径替换 device_namevalue 代表带宽率。使用 KMGT 后缀作为计量单位。没有后缀的值默认单位为 “字节/秒”。
BlockIOWriteBandwidth=device_name value
此指令可以给指定设备限定可写带宽。参数与可与 BlockIOReadBandwidth 一致。
上述的每一个指令控制一个与之相符的 cgroup 参数。请参阅〈Kernel 管控器专项介绍〉中对 blkio 管控器的介绍。

注意

目前,blkio 资源管控器暂不支持已缓冲的编写操作。它主要针对直接 I/O,所以已缓冲编写的 service 将忽略 BlockIOWriteBandwidth 的限制。另一方面,已缓冲的读取操作是受到支持的,BlockIOReadBandwidth 限制对直接读取和已缓冲读取操作均起作用。

例 2.5. 限定一个单位 Block IO 的可用量

如要降低 Apache service 存取 /home/jdoe/ 目录 block IO 的权重,请将下列字符添加至 /usr/lib/systemd/system/httpd.service 单位文件:
[Service]
BlockIODeviceWeight=/home/jdoe 750
如要设定 Apache 从 /var/log/ 目录读取的最大带宽为 5MB/秒,请使用下列句法:
[Service]
BlockIOReadBandwith=/var/log 5M
如要应用此项修改,请重新载入 systemd 的配置并重启 Apache,这样所修改的 service 文件会生效:
~]# systemctl daemon-reload
~]# systemctl restart httpd.service

管理其它系统资源

另有几种指令,可在单位文件中使用以协助管理资源。
DeviceAllow=device_name options
此选项可以控制存取指定设备节点的次数。此处,device_name 代表通向设备节点的路径,或者是 /proc/devices 中特定的设备组名称。用 rwm 的组合来替换 options,以便单位读取、写入或者创建设备节点。
DevicePolicy=value
此处,value 是以下三种之一。strict :仅允许 DeviceAllow 指定的存取类型;closed:允许对标准伪设备的存取,如:/dev/null、/dev/zero、/dev/full、/dev/random 和 /dev/urandom; auto:如果不显示 DeviceAllow,则允许对所有设备进行存取,此设定为默认设置。
Slice=slice_name
请用存放单位的 slice 名称替换 slice_name。默认名称是 system.slice。scope 单位不能以此方式排列,因为它们已与其父 slice 绑定。
ControlGroupAttribute=attribute value
此选项可以设定 Linux cgroup 管控器公开的多项控制群组参数。用您希望修改的低级别 cgroup 参数来替换 attribute,用此参数的新值来替换 value。更多关于 cgroup 管控器的信息,请参阅〈Kernel 管控器专项介绍〉。

例 2.6. 更改低级别 cgroup 的属性

如果您希望更改 memory.swappiness 设置来重新设定 kernel 替换 cgroup 任务所用进程内存的趋势,请参阅〈Kernel 管控器专项介绍〉对内存管控器的介绍。如要将 Apache service 的 memory.swappiness 设为 70,请添加下列信息至 /usr/lib/systemd/system/httpd.service
[Service]
ControlGroupAttribute=memory.swappiness 70
要应用此项修改,请重新载入 systemd 的配置并重启 Apache 来让修改过的 service 文件生效:
~]# systemctl daemon-reload
~]# systemctl restart httpd.service