自己写一个docker(1)-cgroup介绍与使用
# 一. 是什么
Cgroup(Control Group)是Linux内核提供的一种资源管理和限制机制,用于对进程进行分组并对分组内的进程进行资源限制、优先级调整等操作。
例如,他可以限制一个进程使用的内存数量,CPU数量等等。cgroup目前有两个版本,分别是v1和v2。本文所讲内容及实现均以cgroup v2为基础。
# 二. 使用前的一些检查
Linux内核有一个很大的模块叫VFS(Virtual File System)。VFS能够把具体的文件系统细节隐藏起来,给用户态进程提供一个文件系统API接口。cgrpus与VFS之间衔接的部分称之为cgroup文件系统。
# 查看系统是否支持cgroup v2
cgroup 版本取决于正在使用的 Linux 发行版和操作系统上配置的默认 cgroup 版本。 要检查你的发行版使用的是哪个 cgroup 版本,请在该节点上运行 stat -fc %T /sys/fs/cgroup/ 命令:
stat -fc %T /sys/fs/cgroup/
对于 cgroup v2,输出为 cgroup2fs。
对于 cgroup v1,输出为 tmpfs。
# 查看cgroup v2可管理的系统资源类型
cat /sys/fs/cgroup/cgroup.controllers
可以看到类似于如下输出:cpuset cpu io memory hugetlb pids rdma misc
。
# 查看cgroup2开启的控制器
以上仅仅是可以管理的,不代表实际开启了这些管理,查看cgroup2开启的控制器需要使用:
cat /sys/fs/cgroup/cgroup.subtree_control
# 三. 如何实现、怎么用
我看到cgroup的介绍,一般都是说对XX资源进行限制,那么想解决一个问题,例如我想让main进程仅能使用1G的内存,应该怎么做呢?
linux有一切皆文件的设计理念,cgroup也是如此。在/sys/fs/cgroup/
目录,可以看到一些文件,这些就是cgroup的一些相关配置。例如,cgroup.controllers
就是表示当前cgroup的可用控制器。
# 1. 创建cgroup
我们在这个/sys/fs/cgroup/
这个目录下新建一个文件夹mkdir test-cgroup
。然后再进入到这个文件夹中,可以看到已经有一些文件了,这些文件就是我们创建的cgroup的相关配置。
# 2. 对资源进行限制
echo "50000 100000" > cpu.max
# cat cpu.max
50000 100000
2
3
这个含义是任务组test-cgroup配制为每个100毫秒周期最多执行50毫秒,也就是本cgroup管理的进程在单核CPU上的使用率不会超过50%。
提示
要获取所有的限制项,请参阅Maximizing Resource Utilization with cgroup2 (opens new window)。
# 3. 将进程移动到对应的cgroup
echo {pid} > cgroup.procs
表示把进程pid添加到当前的cgroup中。其中0是一个特殊值,表示当前进程。例如,把当前进程加入到cgroup
中只需要echo 0 > cgroup.procs
。
# 4. 删除一个cgroup
rmdir /sys/fs/cgroup/{你的cgroup的名字}
注意必须用rmdir
,使用rm -rf
是不行的,即便是root用户也会被提示没有权限。
- 02
- containerd高版本换源,containerd换源无效问题11-07
- 03
- apt-get使用代理11-05