Show Table of Contents
2.3. 修改 cgroup
所有被
systemd 监管的永久单位都在 /usr/lib/systemd/system/ 目录中有一个单位配置文件。如要修改 service 单位的参数,请修改此配置文件。可以手动完成或者从命令列界面使用 systemctl set-property 指令。
2.3.1. 在命令列界面设定参数
systemctl set-property 指令让您可以在应用程序运行时,持续修改资源管控设置。请以 root 身份使用下列句法来完成此项操作:
systemctlset-propertyname parameter=value
用您希望修改的 systemd 名字来替代 name,希望改动的参数名称来替代 parameter,希望分配给此参数的新值来替代 value。
并非所有单位参数都能在运行时被修改,但是大多数与资源管控相关的参数是可以的。如需要完整列表,请参阅〈第 2.3.2 节 “修改单位文件”〉。提示:
systemctl set-property 指令让您可以同时修改多项属性,所以相较于单独设定每项属性,推荐您使用此指令。
改动会立即生效并被写入单位文件,并在重启后保留。您可以传递
--runtime 选项,让设定变成临时设定。
systemctlset-property--runtimename property=value
例 2.2. 使用 systemctl set-property
如需使用命令列来限定 httpd.service 的 CPU 和内存占用量,请输入:
~]#systemctlset-propertyhttpd.serviceCPUShares=600MemoryLimit=500M
如希望此更改为临时更改,请添加
--runtime 选项:
~]#systemctlset-property--runtimehttpd.serviceCPUShares=600MemoryLimit=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已在单位文件中启用。
例 2.3. 限定一个单位的 CPU 可用量
若要为 Apache service 分配 1500 个 CPU share 而不是 1024 个,请修改
/usr/lib/systemd/system/httpd.service 单位文件中的 CPUShares 设置:
[Service] CPUShares=1500
要应用此项修改,请重新载入 systemd 的配置并重启 Apache 来让修改过的 service 文件生效:
~]#systemctldaemon-reload~]#systemctlrestarthttpd.service
内存管理
为限定单位可用内存大小,请使用单位配置文件 [Service] 部分中的下列指令:
MemoryLimit=value- 对 cgroup 中执行的进程设定其可用内存的最大值,并用此值替代 value。请以千字节(Kilobyte)、兆字节(Megabyte)、千兆字节(Gigabyte)、太字节(Terabyte)为计量单位并使用 K、M、G、T 后缀来表示。同样,
MemoryAccounting参数必须在同一单元中启用。
例 2.4. 限制一个单位的可用内存量
若要限定 Apache service 的最大可用内存为 1GB,请修改
/usr/lib/systemd/system/httpd.service 单位文件中的 MemoryLimit 设定:
[Service] MemoryLimit=1G
要应用此项修改,请重新载入 systemd 的配置并重启 Apache 来让修改过的 service 文件生效:
~]#systemctldaemon-reload~]#systemctlrestarthttpd.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_name,value 代表带宽率。使用 K、M、G、T 后缀作为计量单位。没有后缀的值默认单位为 “字节/秒”。
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 文件会生效:
~]#systemctldaemon-reload~]#systemctlrestarthttpd.service
管理其它系统资源
另有几种指令,可在单位文件中使用以协助管理资源。
DeviceAllow=device_name options- 此选项可以控制存取指定设备节点的次数。此处,device_name 代表通向设备节点的路径,或者是
/proc/devices中特定的设备组名称。用r、w和m的组合来替换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 文件生效:
~]#systemctldaemon-reload~]#systemctlrestarthttpd.service

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.