CGroup系列三CGroup使用指南
Posted 高桐@BILL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGroup系列三CGroup使用指南相关的知识,希望对你有一定的参考价值。
写在前面
这里先从整体上概述cgroup的创建,挂载,参数配置和卸载,后面的章节中会一一介绍每个子系统的详细使用方法和使用案例。
一、使用Linux命令管理CGroup
1.1挂载cgroup临时文件系统
mount -t tmpfs cgroup_root /sys/fs/cgroup
1.2 创建挂载层级需要的目录
mkdir /sys/fs/cgroup/cpuset
1.3 挂载子系统cpuset到
mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
1.4 创建CGroup进程组
cd /sys/fs/cgroup/cpuset mkdir test
1.5 为CGroup进程组附加管控策略
echo 1 > cpuset.cpus echo 1 > cpuset.mems echo $$ > taskssh cat /proc/self/cgroup
二、使用systemd管理CGroup
2.1 用systemd-run创建临时cgroup
systemd-run可用于创建、启动临时service或scope,并在其中运用自定义指令。
systemd-run --unit=name --scope --slice=slice_name command
-
name 代表您想要此unit被识别的名称。如果
--unit
没有被指定,unit名称会自动生成。建议选择一个描述性的名字,因为它将代表systemctl
输出中的单位。在unit运行时期间,此名字需为独一无二的。 -
--scope
参数创建临时 scope 单位来替代默认创建的 service 单位。 -
--slice
选项,让新近创建的 service 或 scope unit可以成为指定 slice 的一部分。用现存 slice(如systemctl -t slice
输出所示)的名字替代 slice_name,或者通过传送一个独有名字来创建新 slice。默认情况下,service 和 scope 做为 system.slice 的一部分被创建。 -
用在 service unit中运行的指令替代 command。将此指令放置于
systemd-run
句法的最末端。这样,此指令的参数就不会与systemd-run
参数混淆。 -
--description
可以创建对unit的描述;service 进程结束后。 -
--remain-after-exit
可以收集运行时信息。 -
--machine
选项可以在密闭容器中执行指令。
2.2 创建永久cgroup
这个好理解,2.1是通过命令临时创建一个service unit,这里就是指自定义一个service unit,即在系统启动时由systemd解析并并自启动创建。
三、删除CGroup进程组
临时cgroup可以通过下面命令删除,如下:
systemctl stop name.service
永久cgroup可以通过下面命令删除,如下:
systemctl disable name.service
上面方法说白了就是对systemd的服务进行操作,因为我们将管理CGroup进程组的命令都封装到了服务中。
那么如何service如何编写,修改呢?
四、配置CGroup控制参数
所有编写的service都位于/usr/lib/systemd/system/目录下。那么我们配置CGroup控制参数也是对该目录下的service unit进行编辑。
4.1 命令方式
如果是同时修改多项属性,可以使用下面命令,如下:
systemctl set-property name parameter=value
上面命令会写入service unit文件,重启后仍然生效。如果只是临时修改,可添加--runtime选项。
systemctl set-property --runtime name property=value
4.1.1 使用案例
如下,通过下面命令限制test.service的CPU和内存占用量
systemctl set-property --runtime test.service CPUShares=600 MemoryLimit=500M
4.2 文件方式
如果我们要修改/usr/lib/systemd/system/test.service的资源使用限额,可以使用下面方式进行配置,如下:
//value默认值为 1024,可以增加此数值以分配更多CPU
- CPUShares=value
//对 cgroup 中执行的进程设定其可用内存的最大值,以千字节(Kilobyte)、兆字节(Megabyte)、千兆字节(Gigabyte)、太字节(Terabyte)为计量单位并使用 K、M、G、T 后缀来表示
- MemoryLimit=value
//设置进程block IO 权重,权重需在 10 到 1000 之间选择,默认值是 1000。
- BlockIOWeight=value
//为 device_name 所指的设备选取 block IO 权重,在 10 到 1000 之间选取权重值
- BlockIODeviceWeight=device_name value
//设置读带宽,用 K、M、G、T 后缀作为计量单位。没有后缀的值默认单位为 “字节/秒”。
- BlockIOReadBandwidth=device_name value
//设置写带宽,用 K、M、G、T 后缀作为计量单位。没有后缀的值默认单位为 “字节/秒”。
- BlockIOWriteBandwidth=device_name value
//设置访问指定设备节点的次数,options指r、w 和 m 的组合
- DeviceAllow=device_name options
//strict :仅允许 DeviceAllow 指定的存取类型;closed:允许对标准伪设备的存取,如:/dev/null、/dev/zero、/dev/full、/dev/random 和 /dev/urandom; auto:如果不显示 DeviceAllow,则允许对所有设备进行存取,此设定为默认设置。
- DevicePolicy=value
//默认名称是 system.slice。scope 单位不能以此方式排列,因为它们已与其父 slice 绑定。
- Slice=slice_name
[Service]
CPUShares=1500
MemoryLimit=1G
BlockIODeviceWeight=/home/jdoe 750
BlockIOReadBandwith=/var/log 5M
以上是关于CGroup系列三CGroup使用指南的主要内容,如果未能解决你的问题,请参考以下文章