通过Namespace可以实现容器间的资源隔离,但是主机的资源如CPU、内存等,容器还可以任意使用,如果某个容器占用了大量的主机资源,就可能导致主机宕机等问题。所以,我们应该通过什么方法来限制一个容器对主机资源的使用呢?

control groups

简称cgroups是Linux内核的一个功能,可以实现限制进程或者进程组的资源(cpu、内存、磁盘IO等)

功能

  1. 资源限制

限制资源的使用了

  1. 优先级控制

不同的进程或者进程组之间可以有不同的资源使用优先级

  1. 审计

计算控制组的资源使用情况

  1. 控制

控制进程的挂起或恢复

核心概念

  1. 子系统(subsystem)

是一个内核的组件,一个子系统代表一类资源调度控制器。如内存子系统可以限制内存的使用量

  1. 控制组(cgroup)

表示一组进程和一组带有参数的子系统的关联关系

  1. 层级树(hierarchy)

是由一系列的控制组按照树状结构排列组成的,子控制组默认拥有父控制组的属性

案例:cgroups限制进程的cpu使用时间

  1. 在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

  1. 2. 执行CPU耗时任务,验证cgroup是否可以限制cpu使用时间
  2. ```bash
  3. root@server:/# while true;do echo;done;
  1. 打开一个新窗口,执行top -p 56768命令,验证结果

image.png

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

image.png

  1. 由此可验证,cgroup可以限制cpu使用
  2. 如何删除cgroups,只需要删除创建的对应目录即可

rmdir /sys/fs/cgroup/cpu/mydocker

限制

cgroups可以实现资源的限制,但是不能保证资源的使用。如给某个容器限制了1core,但是由于资源竞争,这个容器不一定能使用到这个core。