編號 | 限制內容 | 代表意思 |
---|---|---|
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核心原理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!