编号 | 限制内容 | 代表意思 |
---|---|---|
1 | blkio(对块设备提供输入输出的限制) | 光盘、固态磁盘、USB…。 |
2 | cpu | 可以调控task对cpu的使用。 |
3 | cpuacct | 自动生成task对cpu资源使用情况的报告。 |
4 | cpuset(针对多处理器的物理机使用) | 对task单独分配某个cpu使用的。 |
5 | device(设备是指键盘、鼠标…) | 关闭和开启task对设备的访问。 |
6 | freezer | 控制task的挂起和恢复,如不允许某个task使用cpu被称之为挂起。 |
7 | memory | 控制task对内存使用量的限定,自动生成对内存资源使用的报告 |
8 | perf_event | 对task可以进行统一的性能测试,如探测linxu的cpu性能以及硬盘的读写效率等等。 |
9 | net_cls | 在docker中没有直接被使用,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量控制程序识别从具体cgroup中生成的数据包。 |
注意:到现在为止,还没有可以对容器硬盘大小进行限制的工具,只能限制硬盘的读写频率
查看cgroup中的CPU控制中的tasks文件,存放了对文件中的进程的cpu的控制,如果要添加某个进程对cpu的控制,将进程的pid加入tasks文件即可,包括其他的硬件资源控制也是如此
[root@localhost ~]# cat /sys/fs/cgroup/cpu/tasks 1 2 4 5 6 7 8 9 ... 68469 68508 68526 68567
在生产环境中,由于在内核中,所以它是自动增加的
cgroup真正的工作原理就是hook钩子,cgroup的实现本质上是给系统进程挂上钩子实现的,当task进程运行的过程中,设计到某个资源是,就会触发钩子上附带的subsystem子系统进行资源检测,最终根据资源类别的不同使用对应的技术进行资源限制和优先级分配。
钩子是怎么实现的
简单来说,linux中管理task进程的数据结构,在cgroup的每个task设置一个关键词,将关键词都指向钩子,叫做指针。
一个task只对应一个指针结构时,一个指针结构可以被多个task进行使用
当一个指针一旦读取到唯一指针数据的内容,task就会被触发,就可以进行资源控制
在实际的使用过程中,用户需要使用mount来挂载cgroup控制组
在目录中可以看到,比如httpd程序,pid号为69060
[root@localhost ~]# yum -y install httpd^C [root@localhost ~]# systemctl start httpd^C [root@localhost ~]# netstat -anput | grep 80 tcp6 0 0 :::80 :::* LISTEN 69060/httpd
查看它pid号目录中的mounts文件,存放了大量的关于cgroup的挂载
可以看到每一个cgoup后面的目录,如/sys/fs/cgroup/cpu,cpuacct
,说明httpd进程受到了cpu使用的限制,该文件中还有很多类似的挂载项,可以看到的有blkio/perf_event/memory
等的硬件资源控制。
[root@localhost ~]# cat /proc/69060/mounts rootfs / rootfs rw 0 0 /dev/mapper/centos-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=914476k,nr_inodes=228619,mode=755 0 0 tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0 devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0 ... cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0 cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0 ...
这就是通过mount控制cgroup的,所有的程序都是这样的,子系统上所有的系统都把文件mount上以后,就可以像操作系统一样操作cgroup和层级树进行管理,包括权限管理、子文件系统,除了cgroup文件系统以外,内核中没有为cgroup的访问提供添加其他任何的操作,想要去操作cgroup,就必须使用mount挂到某一个cgroup控制组内才行。
我们需要知道每一个硬件资源的具体怎么去控制的操作
如:
cgroup组中的cpu目录里具体的每一项的具体的含义,都是对cpu具体的控制的细节
[root@localhost ~]# cd /sys/fs/cgroup/cpu [root@localhost cpu]# ls cgroup.clone_children cpuacct.stat cpu.cfs_quota_us cpu.stat system.slice cgroup.event_control cpuacct.usage cpu.rt_period_us machine.slice tasks cgroup.procs cpuacct.usage_percpu cpu.rt_runtime_us notify_on_release user.slice cgroup.sane_behavior cpu.cfs_period_us cpu.shares release_agent
这些具体的使用方法会在下一篇文章中来逐个去解释用法
-c/--cpu-shares:限制cpu优先级 -m/--memory:限制内存的使用容量 --memory-swap:限制内存+swap的大小 --blkil-weight bps/iops --device-read-bps --device-write-bps --device-read-iops --device-write-iops
具体使用方法:cpu、内存、blkio
cgroup目录结构如下
/sys/fs/cgroup
中存放了所有进程的硬件资源控制
/sys/fs/cgroup/{cpu,memory,blkio...}/
目录下存放了特定硬件资源的默认的非docker进程的控制,docker的进程号不会在这些目录下
/sys/fs/cgroup/cpu/docker/
目录下存放了docker在主机内的进程控制
/sys/fs/cgroup/cpu/docker/容器id/
目录下存放了对docker产生的容器的控制
到此这篇关于Docker核心原理之 Cgroup详解的文章就介绍到这了,更多相关Docker核心原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!