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. 概述

  • pidstat是sysstat的一个命令,用于监控全部或指定进程的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个不断执行write和unlink函数的进程(创建文件,写入内容,删除文件)
      • --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%。

相关推荐
IT大白鼠1 小时前
彭大帅的AI运维助手——怎么给AI写运维SOP:提示词设计实战
运维·人工智能·彭大帅
Canmag 兴隆磁性8 小时前
中大型钕铁硼产品的磁通测量与自动分选:一条产线自动化的工程实现思路
运维·学习·自动化·永磁材料
福建佰胜张工9 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
xuefeiniao10 小时前
PHP2Shell漏洞修复
运维·服务器·php
水饺编程11 小时前
第2章:Linux 基础,切换到超级用户
linux·c语言·汇编
便利店102411 小时前
系统活动一抓留存!深入 Linux C/C++ 调试工具之 sysdig
linux·运维·服务器·sysdig
g3voip12 小时前
工业防水电话到底怎么选?隧道、管廊与码头的需求差异
服务器·网络·信息与通信·ip
qetfw12 小时前
Bash 变量:export、位置参数与默认值展开验证
linux·开发语言·chrome·bash
智能运维指南12 小时前
企业 IT 运维自动化平台怎么选?从场景匹配到 POC 验证的完整评估框架
运维·自动化·自动化运维·嘉为蓝鲸
其实防守也摸鱼12 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全