wwqdrh

如何查看cgroup版本

cgroupv1和v2有所区别,groupv2各项指标是混在一个group下的,而不是在具体的指标下再分组

$mount | grep cgroup

cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)

如何创建与删除cgroup

cgroupv2

mkdir [name]

rmdir [name] # ! 不能rm -rf之类的

如何查看一个容器中有哪些进程(宿主机pid)

cat /sys/fs/cgroup/system.slice/docker-[pid].scope/cgroup.procs

如何查看一个pid有哪些命名空间

ls /proc/[pid]/ns

如何进入一个命名空间

进入已经存在的进程的指定空间

nsenter --target 58212 --mount --uts --ipc --net --pid -- env --ignore-environment -- /bin/bash

创建并进入新的命名空间并执行命令

unshare --mount --ipc --pid --net --mount-proc=/proc --fork /bin/bash

关于命名空间的函数

在每一个进程的 task_struct 里面,有一个指向 namespace 结构体的指针 nsproxy。

// 创建一个新的进程,并把它放到新的 namespace 中。
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

// 用于将当前进程加入到已有的 namespace 中
int setns(int fd, int nstype);

// 它可以使当前进程退出当前的 namespace,并加入到新创建的 namespace
int unshare(int flags);

资源限制

参考: https://docs.kernel.org/admin-guide/cgroup-v2.html#cpu

v1与v2各个指标的变化

  • "cpu.shares" => "cpu.weight"
  • "cpu.cfs_quota_us" + "cpu.cfs_period_us" => "cpu.max"

加入进程到cgroup中

将进程移动到指定 cgroup:将 PID 写到相应 cgroup 的 cgroup.procs 文件即可。

如何限制容器的CPU使用

v1

# 限制成1.5个CPU 150000(150ms,一个cfs周期可以使用的时间) / 100000(一个cfs周期的时间) = 1.5
echo [pid] >> /sys/fs/cgroup/[group]/cgroup.procs
echo 100 >> /sys/fs/cgroup/[group]/cpu.cfs_period_us
echo 150000 >> /sys/fs/cgroup/[group]/cpu.cfs_quota_us

v2

# 限制成1.5个CPU 150000(150ms,一个cfs周期可以使用的时间) / 100000(一个cfs周期的时间) = 1.5
echo [pid] >> /sys/fs/cgroup/[group]/cgroup.procs
echo 100 >> /sys/fs/cgroup/[group]/cpu.weight # default also 100
echo 150000 >> /sys/fs/cgroup/[group]/cpu.max # default is 100000

如何控制一个容器的最大内存使用量

假设设置上限为2g(2*1024*1024*1024 = 2147483648),

echo memory.limit_in_bytes > /sys/fs/cgroup/system.slice/docker-[pid].scope/memory.limit_in_bytes