如何查看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);
资源限制
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