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 $$ > tasks
sh
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使用指南的主要内容,如果未能解决你的问题,请参考以下文章

Docker通过Cgroup 资源配置

Docker通过Cgroup 资源配置

Docker通过Cgroup 资源配置

docker私有仓库registry和cgroup资源限制

docker私有仓库registry和cgroup资源限制

docker私有仓库registry和cgroup资源限制