stat -fc %T /sys/fs/cgroup/ # cgroup v1 返回 tmpfs # cgroup v2 返回 cgroup2fs创建 cgroup 和 执行命令在 v1 和 v2 是一样的,所以这一块不需要区分。
cgcreate -g memory,cpu,cpuset:benchmark-1-1 # 具体的限制语义设置。。。 cgexec -g memory,cpu,cpuset:benchmark-1-1 /tmp/publised/webappcgcreate 就是用来创建 cgroup 的一个命令,可以看到 crank 这块主要是针对了 memroy,cpu,cpuset 这三个做了限制。
# 限制 1G 的内存 cgset -r memory.limit_in_bytes=1073741824 benchmark-1-1 # 不限制内存 cgset -r memory.limit_in_bytes=-1 benchmark-1-1v2 的语义发生了变化,与 memory.limit_in_bytes 相对应的是 memory.max,所以与之对应的是
cgset -r memory.max=1073741824 benchmark-1-1 # 不限制内存 cgset -r memory.max=max benchmark-1-1参考:
https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#memory-interface-files
# 限制 50% 的 cpu,其中 cfs_period_us = 10000 是为了和docekr对齐 cgset -r cpu.cfs_period_us=100000 benchmark-1-1 cgset -r cpu.cfs_quota_us=50000 benchmark-1-1 # 不限制 cpu cgset -r cpu.cfs_quota_us=-1 benchmark-1-1v2 这边的语义变化的还是比较大的,把 cfs_period_us 和 cfs_quota_us 整合到 max 上面了。
cgset -r cpu.max="50000 100000" benchmark-1-1 cgset -r cpu.max="max 100000" benchmark-1-1参考:
https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#cpu-interface-files
# 限制使用 0和1 两个cpu cgset -r cpuset.cpus=0-1 benchmark-1-1 cgset -r cpuset.mems=0 benchmark-1-1 ######## # 不限制cpu,8个cpu都可以使用 (8c机器) cgset -r cpuset.cpus=0-7 benchmark-1-1 cgset -r cpuset.mems=0 benchmark-1-1有一个需要注意的是, cpuset.mems 的取值问题,在 v1 时,是从 /sys/fs/cgroup/cpuset/cpuset.mems 中取, v2 则是 /sys/fs/cgroup/{controller}/cpuset.mems 或 /sys/fs/cgroup/{controller}/cpuset.mems.effective。
crank --config ./hello.benchmarks.yml --profile local --scenario hello \ --application.cpuSet "0" \ --application.cpuLimitRatio 0.5 \ --application.memoryLimitInBytes 1073741824Agent 的具体输出
# 堆代码 duidaima.com [18:53:09 INF] [/] chmod +x /tmp/benchmarks-agent/benchmarks-server-1/ancl3ltc.4a1/src/hello/published/hello [18:53:09 INF] [/] cgcreate -g memory,cpu,cpuset:benchmarks-1-4 [18:53:09 INF] [/] cgset -r memory.max=1073741824 benchmarks-1-4 [18:53:09 INF] [/] cgset -r cpu.max="50000 100000" benchmarks-1-4 [18:53:09 INF] [/] cgset -r cpuset.cpus=0 benchmarks-1-4 [18:53:09 INF] [/] cgset -r cpuset.mems=0 benchmarks-1-4 [18:53:09 INF] [/] Invoking executable: cgexec [18:53:09 INF] [/] Arguments: -g memory,cpu,cpuset:benchmarks-1-4 /tmp/benchmarks-agent/benchmarks-server-1/ancl3ltc.4a1/src/hello/published/hello [18:53:09 INF] [/] Working directory: /tmp/benchmarks-agent/benchmarks-server-1/ancl3ltc.4a1/src/hello/published除了上面提到的语义之外,还有硬盘,网络相关的也可以进行限制。如果在没有安装 cgroup-tools 的前提下,需要通过 echo xx -> yyy 的方式来设置。
# 8614aabd3e57 v1 # 0a7e61dd556f v2 docker run -d -m 200M --cpu-quota=50000 --cpu-period=100000 --name ng-cg0 nginx # 118bc903caee v1 # ce356350e956 v2 docker run -d --name ng-cg1 nginx然后分别看看 cgroup 的限制情况
cd /sys/fs/cgroup/memory/docker cat 8614aabd3e57*****/memory.limit_in_bytes # output is 209715200 cd /sys/fs/cgroup/cpu/docker cat 8614aabd3e57*****/cpu.cfs_quota_us # output is 50000 cat 8614aabd3e57*****/cpu.cfs_period_us # output is 100000然后是没做限制的容器:
cd /sys/fs/cgroup/memory/docker cat 118bc903caee*****/memory.limit_in_bytes # output is 9223372036854771712 cd /sys/fs/cgroup/cpu/docker cat 118bc903caee*****/cpu.cfs_quota_us # output is -1 cat 118bc903caee*****/cpu.cfs_period_us # output is 100000cgroup v1 的 cgroup 控制文件在 /sys/fs/cgroup/<控制器>/docker/<longid>/ 或 /sys/fs/cgroup/<控制器>/system.slice/docker-<longid>.scope/ 下面。
cd /sys/fs/cgroup/system.slice/docker-0a7e61dd556f*****.scope cat memory.max # output is 209715200 cat cpu.max # output is 50000 100000然后是没做限制的容器:
cd /sys/fs/cgroup/system.slice/docker-ce356350e956*****.scope cat memory.max # output is max cat cpu.max # output is max 100000cgroup v1 的 cgroup 控制文件在 /sys/fs/cgroup/system.slice/docker-<longid>.scope/ 或 /sys/fs/cgroup/docker/<longid/> 下面。可以看到是做了不同版本的区分已经符合 cgroup 预期行为的。