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
=600MemoryLimit
=500M
如希望此更改为临时更改,请添加
--runtime
选项:
~]#systemctl
set-property
--runtime
httpd.service
CPUShares
=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 文件生效:
~]#systemctl
daemon-reload
~]#systemctl
restart
httpd.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 文件生效:
~]#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_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 文件会生效:
~]#systemctl
daemon-reload
~]#systemctl
restart
httpd.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 文件生效:
~]#systemctl
daemon-reload
~]#systemctl
restart
httpd.service