linux(centos8):使用cgroups做资源限制
一,什么是cgroups?
1,cgroups是資源的控制組,它提供了一套機(jī)制用于控制一組特定進(jìn)程對(duì)資源的使用。
cgroups綁定一個(gè)進(jìn)程集合到一個(gè)或多個(gè)限制資源使用的子系統(tǒng)上。
2, cgroups是容器的實(shí)現(xiàn)基礎(chǔ)之一:
其中:Namespace主要用于隔離資源
Cgroups用來(lái)提供對(duì)一組進(jìn)程以及將來(lái)子進(jìn)程的資源限制
說(shuō)明:劉宏締的架構(gòu)森林是一個(gè)專(zhuān)注架構(gòu)的博客,地址:https://www.cnblogs.com/architectforest
對(duì)應(yīng)的源碼可以訪問(wèn)這里獲取:https://github.com/liuhongdi/
說(shuō)明:作者:劉宏締 郵箱: 371125307@qq.com
二,cgroups的用途:
主要有4個(gè):
Resource limitation: 限制資源使用,例:內(nèi)存使用上限/cpu的使用限制
Prioritization: 優(yōu)先級(jí)控制,例:CPU利用/磁盤(pán)IO吞吐
Accounting: 一些審計(jì)或一些統(tǒng)計(jì)
Control: 掛起進(jìn)程/恢復(fù)執(zhí)行進(jìn)程
三,cgroups相關(guān)的操作命令:
1,查看當(dāng)前kernel中cgroup是否開(kāi)啟:
[root@blog ~]$ more /boot/config-`uname -r` | grep -i cgroup CONFIG_CGROUPS=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_PIDS=y ...
說(shuō)明:CONFIG_CGROUPS=y
表示已開(kāi)啟cgroup
2,cgroup目前存在v1/v2 兩個(gè)版本,
v2 版本與v1相比,在目錄組織上更清晰,管理更方便,
如何檢查當(dāng)前內(nèi)核版本是否支持cgroup v2?
方法是:查看文件系統(tǒng)是否支持cgroup2
[root@node1 ~]# grep cgroup /proc/filesystems nodev cgroup nodev cgroup2
如果看到cgroup2,表示支持cgroup v2
3,列出所有掛載的cgroup掛載點(diǎn)
[root@blog ~]$ mount | grep cgroup tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) 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/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
注意:/sys/fs/cgroup的掛載方式是ro,表示readonly
因?yàn)?sys/fs/cgroup 目錄由 systemd 在系統(tǒng)啟動(dòng)的過(guò)程中掛載,
它把目錄掛載為只讀的類(lèi)型,這個(gè)目錄下不能再手動(dòng)創(chuàng)建目錄
2,列出cgroup支持的子系統(tǒng)?
[root@blog ~]# ll /sys/fs/cgroup/ total 0 dr-xr-xr-x 4 root root 0 Jan 10 18:03 blkio lrwxrwxrwx 1 root root 11 Jan 10 18:03 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Jan 10 18:03 cpuacct -> cpu,cpuacct dr-xr-xr-x 2 root root 0 Jan 10 18:03 cpu,cpuacct dr-xr-xr-x 2 root root 0 Jan 10 18:03 cpuset dr-xr-xr-x 4 root root 0 Jan 10 18:03 devices dr-xr-xr-x 2 root root 0 Jan 10 18:03 freezer dr-xr-xr-x 2 root root 0 Jan 10 18:03 hugetlb dr-xr-xr-x 4 root root 0 Jan 10 18:03 memory lrwxrwxrwx 1 root root 16 Jan 10 18:03 net_cls -> net_cls,net_prio dr-xr-xr-x 2 root root 0 Jan 10 18:03 net_cls,net_prio lrwxrwxrwx 1 root root 16 Jan 10 18:03 net_prio -> net_cls,net_prio dr-xr-xr-x 2 root root 0 Jan 10 18:03 perf_event dr-xr-xr-x 4 root root 0 Jan 10 18:03 pids dr-xr-xr-x 2 root root 0 Jan 10 18:03 rdma dr-xr-xr-x 5 root root 0 Jan 10 18:03 systemd
也可以通過(guò)/proc/cgroups來(lái)查看
[root@blog ~]# more /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 8 1 1 cpu 2 1 1 cpuacct 2 1 1 blkio 4 29 1 memory 7 1703 1 devices 3 60 1 freezer 9 1 1 net_cls 5 1 1 perf_event 10 1 1 net_prio 5 1 1 hugetlb 11 1 1 pids 12 67 1 rdma 6 1 1
各個(gè)子系統(tǒng)的說(shuō)明:
cpuset:把任務(wù)綁定到特定的cpu
cpu: 限定cpu的時(shí)間份額
cpuacct: 統(tǒng)計(jì)一組task占用cpu資源的報(bào)告
blkio:限制控制對(duì)塊設(shè)備的讀寫(xiě)
memory: 限制內(nèi)存使用
devices: 限制設(shè)備文件的創(chuàng)建限制對(duì)設(shè)備文件的讀寫(xiě)
freezer: 暫停/恢復(fù)cgroup中的task
net_cls: 用classid標(biāo)記該cgroup內(nèi)的task產(chǎn)生的報(bào)文
perf_event: 允許perf監(jiān)控cgroup的task數(shù)據(jù)
net_prio: 設(shè)置網(wǎng)絡(luò)流量的優(yōu)先級(jí)
hugetlb: 限制huge page 內(nèi)存頁(yè)數(shù)量
pids: 限制cgroup中可以創(chuàng)建的進(jìn)程數(shù)
rdma: 限制RDMA資源(Remote Direct Memory Access,遠(yuǎn)程直接數(shù)據(jù)存取)
四,查看一個(gè)進(jìn)程上的cgroup限制:
以nginx的進(jìn)程為例
[root@blog ~]# ps auxfww | grep nginx: root 491 0.0 0.0 71028 3368 ? Ss May18 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx nginx 492 0.0 0.0 102496 7036 ? S May18 0:00 \_ nginx: worker process nginx 493 0.0 0.0 102764 7496 ? S May18 0:00 \_ nginx: worker process nginx 494 0.0 0.0 102496 5856 ? S May18 0:00 \_ ...
我們?nèi)∩厦娴?92這個(gè)進(jìn)程:
查看492這個(gè)進(jìn)程的cgroup限制
[root@blog ~]# more /proc/492/cgroup 12:pids:/system.slice/openresty.service 11:hugetlb:/ 10:perf_event:/ 9:freezer:/ 8:cpuset:/ 7:memory:/system.slice/openresty.service 6:rdma:/ 5:net_cls,net_prio:/ 4:blkio:/system.slice/openresty.service 3:devices:/system.slice/openresty.service 2:cpu,cpuacct:/ 1:name=systemd:/system.slice/openresty.service
內(nèi)容說(shuō)明:
第一列:cgroupid,和/proc/cgroups中的id是一致的,
第二列:cgroup的子系統(tǒng)
第三列:進(jìn)程在 cgroup 樹(shù)中的路徑
例:
[root@blog ~]# ls /sys/fs/cgroup/systemd/system.slice/openresty.service/ cgroup.clone_children cgroup.procs notify_on_release tasks
五,使用libcgroup-tools做進(jìn)程的限制
libcgroup-tools包含了多個(gè)cg相關(guān)的命令,方便進(jìn)行cgroups的測(cè)試
說(shuō)明:從centos7開(kāi)始,已經(jīng)默認(rèn)不再使用libcgroup套件, 所以大家把它作為演示使用即可
1,安裝
[root@blog ~]# dnf install libcgroup-tools
2,安裝/測(cè)試運(yùn)行stress
[root@node1 stress]# pwd /usr/local/source/stress [root@node1 stress]# wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/s/stress-1.0.4-16.el7.x86_64.rpm [root@node1 stress]# rpm -ivh stress-1.0.4-16.el7.x86_64.rpm
運(yùn)行stress
啟動(dòng)1個(gè)消耗內(nèi)存的進(jìn)程,每個(gè)進(jìn)程占用50M內(nèi)存
#--vm-keep一直占用內(nèi)存,(默認(rèn)是不斷釋放并重新分配內(nèi)存)
[root@node1 memory]# stress -m 1 --vm-bytes 50M --vm-keep stress: info: [14327] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
用pidstat查看效果
[root@node1 ~]# pidstat -r | grep stress 14時(shí)57分13秒 0 46088 0.01 0.00 7948 972 0.03 stress 14時(shí)57分13秒 0 46089 0.07 0.00 59152 51496 1.34 stress
3,在cgroup中添加一個(gè)內(nèi)存限制:再次用stress測(cè)試:
[root@node1 memory]# pwd /sys/fs/cgroup/memory [root@node1 memory]# mkdir lhd_stress_memory
注意:
cgroups 文件系統(tǒng)會(huì)在創(chuàng)建文件目錄的時(shí)候自動(dòng)創(chuàng)建相應(yīng)的配置文件
[root@node1 memory]# ls lhd_stress_memory/ cgroup.clone_children memory.kmem.limit_in_bytes memory.kmem.tcp.usage_in_bytes memory.memsw.max_usage_in_bytes memory.soft_limit_in_bytes tasks cgroup.event_control memory.kmem.max_usage_in_bytes memory.kmem.usage_in_bytes memory.memsw.usage_in_bytes memory.stat cgroup.procs memory.kmem.slabinfo memory.limit_in_bytes memory.move_charge_at_immigrate memory.swappiness memory.failcnt memory.kmem.tcp.failcnt memory.max_usage_in_bytes memory.numa_stat memory.usage_in_bytes memory.force_empty memory.kmem.tcp.limit_in_bytes memory.memsw.failcnt memory.oom_control memory.use_hierarchy memory.kmem.failcnt memory.kmem.tcp.max_usage_in_bytes memory.memsw.limit_in_bytes memory.pressure_level notify_on_release
可以看到新建目錄下面已建好了配置文件
設(shè)置這個(gè)cgroup內(nèi)存限制的最大使用內(nèi)存:
[root@node1 memory]# expr 1024 * 1024 * 10 10485760
設(shè)置內(nèi)存的限制
[root@node1 memory]# echo 10485760 > lhd_stress_memory/memory.limit_in_bytes
用stress測(cè)試內(nèi)存限制
[root@node1 memory]# cgexec -g memory:lhd_stress_memory stress -m 1 --vm-bytes 100M --vm-keep --verbose stress: info: [35293] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd stress: dbug: [35293] using backoff sleep of 3000us stress: dbug: [35293] --> hogvm worker 1 [35294] forked stress: dbug: [35294] allocating 104857600 bytes ... stress: dbug: [35294] touching bytes in strides of 4096 bytes ... stress: FAIL: [35293] (415) <-- worker 35294 got signal 9 stress: WARN: [35293] (417) now reaping child worker processes stress: FAIL: [35293] (451) failed run completed in 0s
因?yàn)橛袃?nèi)存10M的限制,導(dǎo)致stress在申請(qǐng)100M內(nèi)存時(shí)收到了SIGKILL(signal 9) 信號(hào)
測(cè)試改為10M范圍內(nèi)
[root@node1 memory]# cgexec -g memory:lhd_stress_memory stress -m 1 --vm-bytes 9M --vm-keep --verbose
此時(shí)可以正常運(yùn)行
用pidstat查看效果
[root@node1 ~]# pidstat -r | grep stress 14時(shí)34分21秒 0 41767 0.05 0.00 7948 1148 0.03 stress 14時(shí)34分21秒 0 41768 0.07 0.00 17164 9328 0.24 stress
六,與systemd相關(guān)的cgroup操作:
1,systemd-cgtop:顯示 cgoups 的實(shí)時(shí)資源消耗情況
[root@node1 ~]# systemd-cgtop Control Group Tasks %CPU Memory Input/s Output/s / 211 4.0 1.0G - - /system.slice 84 1.5 831.7M - - /user.slice 9 0.9 64.3M - - /system.slice/kubelet.service 15 0.6 31.3M - …
2,systemd-cgls :查看 cgroups 的層級(jí)結(jié)構(gòu)
[root@node1 ~]# systemd-cgls Control group /: -.slice ├─user.slice │ └─user-0.slice │ ├─session-3.scope │ │ ├─14349 sshd: root [priv] …
各slice的說(shuō)明:
-.slice: 根slice
user.slice: 下面是所有的用戶(hù)會(huì)話
system.slice: 下面是所有系統(tǒng)service
machine.slice: 下面是所有虛擬機(jī)和容器
什么是slice:一組進(jìn)程:由service或會(huì)話/容器/虛擬機(jī)組成
3,為systemd啟動(dòng)的服務(wù)添加cgroup限制
查看有哪些cgroup配置項(xiàng)可用
[root@node1 ~]# man systemd.resource-control
例子:
查看nginx的內(nèi)存限制:
[root@node1 ~]# more /sys/fs/cgroup/memory/system.slice/nginx.service/memory.limit_in_bytes 9223372036854771712
上面是沒(méi)有手動(dòng)設(shè)置時(shí)的默認(rèn)值
設(shè)置內(nèi)存限制
[root@node1 ~]# systemctl set-property nginx.service MemoryLimit=512M
再次查看
[root@node1 ~]# more /sys/fs/cgroup/memory/system.slice/nginx.service/memory.limit_in_bytes 536870912
注意:即使服務(wù)重啟,這個(gè)cgroup限制仍然會(huì)起作用,
因?yàn)閟ystemctl已經(jīng)把它寫(xiě)到了service文件中,
[root@node1 ~]# systemctl cat nginx # /usr/lib/systemd/system/nginx.service [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid # Nginx will fail to start if /run/nginx.pid already exists but has the wrong # SELinux context. This might happen when running `nginx -t` from the cmdline. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621 ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=mixed PrivateTmp=true [Install] WantedBy=multi-user.target # /etc/systemd/system.control/nginx.service.d/50-MemoryLimit.conf # This is a drop-in unit file extension, created via "systemctl set-property" # or an equivalent operation. Do not edit. [Service] MemoryLimit=536870912
4,其他常用命令:
設(shè)置cpu使用率最高不超過(guò)單顆cpu的80%
[root@node1 ~]# systemctl set-property nginx.service CPUQuota=80%
七,查看linux的版本:
[root@node1 ~]# more /etc/redhat-release CentOS Linux release 8.1.1911 (Core) [root@node1 ~]# uname -r 4.18.0-147.el8.x86_64
總結(jié)
以上是生活随笔為你收集整理的linux(centos8):使用cgroups做资源限制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安全运营
- 下一篇: 浅析DevOps中结合IAST的落地介绍