通过Namespace可以实现容器间的资源隔离,但是主机的资源如CPU、内存等,容器还可以任意使用,如果某个容器占用了大量的主机资源,就可能导致主机宕机等问题。所以,我们应该通过什么方法来限制一个容器对主机资源的使用呢?
control groups
简称cgroups是Linux内核的一个功能,可以实现限制进程或者进程组的资源(cpu、内存、磁盘IO等)
功能
- 资源限制
限制资源的使用了
- 优先级控制
不同的进程或者进程组之间可以有不同的资源使用优先级
- 审计
计算控制组的资源使用情况
- 控制
核心概念
- 子系统(subsystem)
是一个内核的组件,一个子系统代表一类资源调度控制器。如内存子系统可以限制内存的使用量
- 控制组(cgroup)
表示一组进程和一组带有参数的子系统的关联关系
- 层级树(hierarchy)
是由一系列的控制组按照树状结构排列组成的,子控制组默认拥有父控制组的属性
案例:cgroups限制进程的cpu使用时间
- 在cpu子系统下创建cgroup.只需要在相应的目录下创建新目录即可
```bash
查看系统中挂载的cgroup信息
baifan@server:~$ sudo mount -t cgroup [sudo] password for baifan: cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
以下均为root用户
cpu /sys/fs/cgroup/cpu
mem /sys/fs/cgroup/memory
root@server:~# mkdir /sys/fs/cgroup/cpu/mydocker
mydocker文件夹下系统自动创建了很多文件
root@server:~# ls -la /sys/fs/cgroup/cpu/mydocker/ total 0 drwxr-xr-x 2 root root 0 Jul 1 08:43 . dr-xr-xr-x 6 root root 0 Jul 1 07:57 .. -rw-r—r— 1 root root 0 Jul 1 08:43 cgroup.clone_children -rw-r—r— 1 root root 0 Jul 1 08:43 cgroup.procs -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.stat -rw-r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage_all -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage_percpu -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage_percpu_sys -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage_percpu_user -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage_sys -r—r—r— 1 root root 0 Jul 1 08:43 cpuacct.usage_user -rw-r—r— 1 root root 0 Jul 1 08:43 cpu.cfs_period_us -rw-r—r— 1 root root 0 Jul 1 08:43 cpu.cfs_quota_us # 限制cpu使用时间总量,单位微秒 -rw-r—r— 1 root root 0 Jul 1 08:43 cpu.shares -r—r—r— 1 root root 0 Jul 1 08:43 cpu.stat -rw-r—r— 1 root root 0 Jul 1 08:43 cpu.uclamp.max -rw-r—r— 1 root root 0 Jul 1 08:43 cpu.uclamp.min -rw-r—r— 1 root root 0 Jul 1 08:43 notify_on_release -rw-r—r— 1 root root 0 Jul 1 08:43 tasks
将100000写入cpu.cfs_quota_us
root@server:/sys/fs/cgroup/cpu/mydocker# echo 100000 > cpu.cfs_quota_us
将shell进程添加到cgroup中
root@server:/sys/fs/cgroup/cpu/mydocker# echo $$ > tasks root@server:/sys/fs/cgroup/cpu/mydocker# cat tasks 56768 89737
2. 执行CPU耗时任务,验证cgroup是否可以限制cpu使用时间```bashroot@server:/# while true;do echo;done;
- 打开一个新窗口,执行
top -p 56768命令,验证结果

- 打开一个新窗口,切换到root用户下,修改cpu使用时间,执行命令
echo 50000 > cpu.cfs_quota_us

- 由此可验证,cgroup可以限制cpu使用
- 如何删除
cgroups,只需要删除创建的对应目录即可
rmdir /sys/fs/cgroup/cpu/mydocker
限制
cgroups可以实现资源的限制,但是不能保证资源的使用。如给某个容器限制了1core,但是由于资源竞争,这个容器不一定能使用到这个core。
