
Linux利用Cgroup资源控制
cgroups 是Linux内核提供的可以限制进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制。
什么是cgroups
-
控制族群(cgroup)
- 关联一组task和一组subsystem的配置参数。一个task对应一个进程, cgroup是资源分片的最小单位。 -
子系统(subsystem)
- 资源管理器,一个subsystem对应一项资源的管理,如 cpu, cpuset, memory等。
- cpu 子系统,主要限制 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
-
层级(hierarchy)
- 关联一个到多个subsystem和一组树形结构的cgroup。和cgroup不同,hierarchy包含的是可管理的subsystem
-
任务(task)
- 每个cgroup都会有一个task列表文件tasks,一个task就对应一个进程。
cpu子系统
cgroups的创建很简单,只需要在相应的子系统下创建目录即可。下面我们到 cpu 子系统下创建测试文件夹:
1.创建cpu系统的cgroup
执行完成创建就可以看到
已经把cpu子系统 对应控制文件创建好了
2.创建进程加入cgroup
查看当前进程
将进程号添加到 tasks 中
查看task 会将当前bash 进行与所有子进程都放入tasks 中
3.验证
制作一个耗时cpu 的进程
查看监控可以非常容易发现 cpu 跑满了一个cpu
cgoups 利用 cpu.cfs_quota_us 与cfs_period_us 限制cpu 的频率分配, 分配为 cfs_quota_us / cfs_period_us
限制分配0.25 个cpu
再查看监控
可以非常明显看到了进程被限制最大使用 25% 了
同理可以创建 memory , blkio 等cgroup 用于限制系统资源
4.移除cgroup
退出tasks
cgroup在Docker 中的使用
Docker 是目前常用容器,它就依赖cgroup 对资源进行限制
创建一个centos7 分配0.25 个cpu 与1g 内存
可以看到
在宿主机上可以看到Docker 创建了容器相关的 cpu 的cgroup
进入容器在Docker 中
类似 top, free 等命令查看 /proc/ 目录都是宿主机的信息 就会导致 free 的实际值并不准确
实际已经将分配的资源使用完了,但是在容器内这些命令并不能显示正确的结果,实际显示的宿主系统的资源使用情况,会对使用的情况产生误导,需要注意。
判断进程是否属于cgroup 可以通过 /proc/1/cgroup 进行判断
可以明显看到这个进程被分配到Docker 下的cgroup 中了
本文转载自公众号:GreatSQL社区
