linux(centos8):使用cgroups做资源限制
一,什么是cgroups?
其中:Namespace主要用于隔离资源
Cgroups用来提供对一组进程以及将来子进程的资源限制
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,cgroups的用途:
三,cgroups相关的操作命令:
[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
...
[root@node1 ~]# grep cgroup /proc/filesystems
nodev cgroup
nodev cgroup2
[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)
[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
[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
四,查看一个进程上的cgroup限制:
以nginx的进程为例
[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 \_
...
[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
[root@blog ~]# ls /sys/fs/cgroup/systemd/system.slice/openresty.service/
cgroup.clone_children cgroup.procs notify_on_release tasks
五,使用libcgroup-tools做进程的限制
说明:从centos7开始,已经默认不再使用libcgroup套件,
所以大家把它作为演示使用即可
[root@blog ~]# dnf install libcgroup-tools
[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
[root@node1 memory]# stress -m 1 --vm-bytes 50M --vm-keep
stress: info: [14327] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
[root@node1 ~]# pidstat -r | grep stress
14时57分13秒 0 46088 0.01 0.00 7948 972 0.03 stress
14时57分13秒 0 46089 0.07 0.00 59152 51496 1.34 stress
[root@node1 memory]# pwd
/sys/fs/cgroup/memory
[root@node1 memory]# mkdir lhd_stress_memory
[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
[root@node1 memory]# expr 1024 \* 1024 \* 10
10485760
设置内存的限制
[root@node1 memory]# echo 10485760 > lhd_stress_memory/memory.limit_in_bytes
用stress测试内存限制
[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
[root@node1 memory]# cgexec -g memory:lhd_stress_memory stress -m 1 --vm-bytes 9M --vm-keep --verbose
此时可以正常运行
[root@node1 ~]# pidstat -r | grep stress
14时34分21秒 0 41767 0.05 0.00 7948 1148 0.03 stress
14时34分21秒 0 41768 0.07 0.00 17164 9328 0.24 stress
六,与systemd相关的cgroup操作:
[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 -
…
[root@node1 ~]# systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-0.slice
│ ├─session-3.scope
│ │ ├─14349 sshd: root [priv]
…
[root@node1 ~]# man systemd.resource-control
[root@node1 ~]# more /sys/fs/cgroup/memory/system.slice/nginx.service/memory.limit_in_bytes
9223372036854771712
[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
[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
[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
linux(centos8):使用cgroups做资源限制的更多相关文章
- linux(centos8):使用namespace做资源隔离
一,namespace是什么? namespace 是 Linux 内核用来隔离内核资源的方式. 它是对全局系统资源的封装隔离, 处于不同 namespace 的进程拥有独立的全局系统资源, 改变一个 ...
- 理解Docker(4):Docker 容器使用 cgroups 限制资源使用
本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- 容器基础(三): 使用Cgroups进行资源限制
Linux Cgroups Linux Cgroups 是 Linux 内核中用来为进程设置资源限制的一个重要功能. Cgroups将进程进行分组, 然后对这一组进程进行统一的资源监控和限制.Cgro ...
- 高级Linux SA需要会做的事情
高级Linux SA需要会做的事情:linux---------系统安装(光盘或自动化安装)linux---------系统常用工具安装(sudo,ntp,yum,rsync,lrzsz syssta ...
- Linux磁盘空间被未知资源耗尽【转】
Linux磁盘空间被未知资源耗尽 在linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间, ...
- Linux学习之CentOS(十七)-----释放 Linux 系统预留的硬盘空间 与Linux磁盘空间被未知资源耗尽 (转)
释放 Linux 系统预留的硬盘空间 大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监 ...
- 我把一些Linux的中英文命令做了对应翻译大家参考一下
本文我们把Linux的中英文命令做了对应翻译,给需要的朋友参考一下.(http://wap.0834jl.com) 很多朋友在论坛上找Linux英文命令,我们给大家整理了比较全的Linux英文命令,并 ...
- linux下获取占用CPU资源最多的10个进程
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...
- Linux下查看占用CPU资源最多的几个进程
linux下获取占用CPU资源最多的10个进程: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用内存资源最多的10个进 ...
随机推荐
- Spring AOP-用代理代替繁琐逻辑
Spring AOP 基础概念 AOP 是一种面向切面的编程思想,通俗来讲,这里假如我们有多个方法. @Component public class Demo { public void say1() ...
- 使用PXE+VNC方式安装CentOS 7
U盘坏了,用个下面的方法安装 安装配置dhcp yum -y install dhcp tftp-server 修改如下,网段改为你自己的网段 vim /etc/dhcp/dhcpd.conf sub ...
- windows下nginx的配置
这里做的nginx的配置主要的功能是: 能够用localhost访问本地文件夹中的项目 输入ip地址访问本地文件夹中的项目 反向代理其他地址访问本地文件 1.nginx安装地址 2.解压之后的文件如下 ...
- Redis底层数据结构详解
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...
- 学习OpenGL
重要!!! OpenGL新人一枚,希望可以再此和大家分享有用的知识,少走弯路 文章会定期更新,把前面几段已经整理过的知识更完后,接下来每周至少会更两次. 文章如果有不对的,理解错误的地方,也非常希望在 ...
- java获取一天前的时间
获取一天前的时间 Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); ...
- Mongodb PHP封装类
分享一个Mongodb PHP封装类 <?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该 ...
- Java单播、组播(多播)、广播的简单实现
简介 单播有TCP和UDP两种实现,组播(多播)和广播只有UDP一种实现.单播和广播基本一样,只是广播的数据包IP为广播IP. 单播 DatagramSocket和DatagramPacket 服 ...
- Hibernate4.3 QBC查询
一.基本查询 1 Session session = HibernateUtils.getSession(); 2 //创建QBC查询接口的实现类 3 Criteria criteria = sess ...
- 使用free掉的内存的危害
1 源码 #include <stdio.h> #include <stdlib.h> // 编译环境 gcc int main(void) { printf("** ...