CGroups资源控制实战【Linux】

CGroups资源控制实战

  • [1. 基础知识](#1. 基础知识)
    • [1.1 pidstat](#1.1 pidstat)
    • [1.2 stress](#1.2 stress)
  • [2. 实操一、cgroups信息查看](#2. 实操一、cgroups信息查看)
  • [3. 实操二、使用cgroups对内存进行控制](#3. 实操二、使用cgroups对内存进行控制)
  • [4. 实操三、使用cgroups对cpu进行控制](#4. 实操三、使用cgroups对cpu进行控制)

1. 基础知识


1.1 pidstat


1. 概述

  • pidstatsysstat的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况。pidstat第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

2. 语法:

bash 复制代码
pidstat [选项] [<时间间隔>] [<次数>]
  • 参数:
    • -u:默认参数,显示各进程的CPU使用统计;
    • -r:显示各进程的内存使用统计;
    • -d:显示各进程的IO使用情况;
    • -p: 指定进程号,ALL表示所有进程;
    • -C:指定命令;
    • -l:显示命令名和所有参数。

3. 安装(Ubuntu)

bash 复制代码
#卸载
apt remove sysstat -y
# 安装
apt install sysstat -y

1.2 stress


1. 概述

  • stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。

2. 语法

bash 复制代码
stress [OPTION [ARG]]
  • 参数:
    • -c, --cpu N:产生N个进程,每个进程都循环调用sqrt函数产生CPU压力;
    • -i, --io N:产生N个进程,每个进程循环调用sync将内存缓冲区内容写到磁盘上,产生IO压力。通过系统调用sync刷新内存缓冲区数据到磁盘中,以确保同步。如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。在SSD硬盘环境中尤为明显,很可能iowait总是0,却因为大量调用系统调用sync,导致系统CPU使用率sys升高。
    • -m, --vm N:产生N个进程,每个进程循环调用malloc/free函数分配和释放内存。
      • --vm-bytes B:指定分配内存的大小;
      • --vm-keep:一直占用内存,区别于不断地释放和重新分配(默认是不断释放并重新分配)。
    • -d, --hdd N:产生N个不断执行writeunlink函数的进程(创建文件,写入内容,删除文件)
      • --hdd-bytes B:指定文件大小。
    • -t, --timeout N:在N秒后结束程序;
    • -q, --quiet:程序在运行的过程中不输出信息。

3. 安装(Ubuntu)

bash 复制代码
#卸载
apt remove stress -y
#安装
apt install stress -y

2. 实操一、cgroups信息查看


1. cgroups版本查看

  • 使用命令:cat /proc/filesystems | grep cg
    • 可以看到,我的机器上支持两个版本的cgroup

2. cgroups子系统查看

  • 使用命令:cat /proc/cgroups
    • 查看能控制哪些资源。

3. cgroups挂载信息查看

  • 使用命令:mount | grep cgroup
    • 控制组的存储目录。

4. 查看一个进程上的cgroups限制

  • cat /proc/$$/cgroup找到当前进程的cgroup目录,然后带上前缀/sys/fs/cgroup/...就可以查看该进程的cgroup目录具体内容了。

3. 实操二、使用cgroups对内存进行控制


1. 创建任务组:

  • /sys/fs/group/下创建一个目录myapp,目录中的内容会自动生成:

2. 启动一个stress进程

  • stress -m 1 --vm-bytes 50m:开一个进程,占用50m内存。

3. pidstat监控stress进程

  • pidstat -C stress -p ALL -r 2 100000:监控命令stress关联的所有进程,每两秒打印一次,打印100000。

4. 为任务组添加内存限制

  • echo "20M" > /sys/fs/cgroup/myapp/memory.max:设置20M的内存限制。
  • echo "0" > /sys/fs/cgroup/myapp/memory.swap.max:完全禁用内存交换。

5. 将stress进程pid加入任务组

  • echo "2789" > /sys/fs/cgroup/myapp/cgroup.procs

6. 观察现象

  • stress进程立即停止:
  • 监控丢失,因为进程终止了:
  • 内存限制成功。

4. 实操三、使用cgroups对cpu进行控制


1. 启用子级cpu限制

  • echo "+cpu" > /sys/fs/cgroup/cgroup.subtree_control:cgroup.subtree_control文件设置开启的子级限制有哪些,看到下图中开启了cpu限制,内存限制和pid限制。

2. 为任务组设置20%的cpu限制

  • echo "20000 100000" > /sys/fs/cgroup/myapp/cpu.max

3. 启动cpu占用约100%的stress进程,并开始监控

  • stress -c 1
  • 启动监控:pidstat -C stress -u -p ALL 2 100000
  • 可以看到cpu几乎打满。

4. 将进程pid加入任务组,并查看监控信息

  • echo "2814" > /sys/fs/cgroup/myapp/cgroup.procs
  • 查看监控:
  • 可以看到,cpu占用率直线下降,最终稳定在了20%。

相关推荐
JavaPub-rodert4 小时前
Docker 多阶段构建:为什么生产环境镜像可以小 90%
运维·docker·容器
浅念-4 小时前
C++ Protobuf 入门实战:基于通讯录项目吃透proto3语法与序列化
linux·服务器·网络·c++·protobuf·proto·proto3
qq_349447954 小时前
阿里云centos7.9系统安装jenkins
服务器·阿里云·jenkins
不怕犯错,就怕不做5 小时前
RK linux在buildroot中如何添加linux命令
linux·驱动开发·嵌入式硬件
2601_962218475 小时前
万象生鲜系统多账套隔离技术适配集团生鲜企业集团化数字化管控
大数据·运维·微服务·云原生·架构
M158227690555 小时前
ModbusTCP 转 Profinet 网关:上位机控制 PN 伺服方案
服务器·网络·tcp/ip
小羊在睡觉5 小时前
HLS视频
linux·后端·golang
宵时待雨5 小时前
linux笔记归纳18:传输层协议TCP
linux·网络·笔记·网络协议·tcp/ip
王志来137944730085 小时前
安防监控工控工业服务器配套
运维·服务器·python
hanchenxing5 小时前
自动化脚本“卡住无输出“怎么办: 一次 WebSocket 挂死的排查与自愈模板
运维·javascript·chrome·websocket·自动化·自动化爬虫