cgroup是 Linux 内核提供的一种物理资源管理机制,能实现对进程组的资源限制、记录、隔离与控制,是 Docker、LXC 等容器技术实现资源管控的核心基础之一,用来规定虚拟容器可以使用的资源

常用pidstat和stress两个工具来进行cgroup的资源监控和压力测试

pidstat:进程资源监控工具

pidstat属于sysstat包,用于实时监控进程 / 线程的 CPU、内存、I/O 等资源使用情况,常配合 cgroup 验证资源限制效果(例如查看某控制组内进程的 CPU 占用是否被限制)

在使用之前,我们要先下载对应的工具,这里我使用的是ubuntu

# 下载
apt install sysstat -y
# 卸载
apt remove sysstat -y

下载结束之后输入pidstat,检查是否下载成功(会出现进程的信息)

语法

pidstat [option] [时间间隔] [次数]
  • option

    • -u : 默认情况,会输出各进程CPU的使用情况

    • -p : 输出指定进程号(pid)进程的使用情况(可以结合其他option一起使用,输出不一样的结果)

    • -r : 输出内存占用情况

    • -d : 输出IO情况

  • 时间间隔: 表示每隔多少时间就统计一次使用情况

  • 次数: 表示统计的总次数,统计完成就停止

用例

# 表示每隔1秒统计一次,总共统计5次,进程2954515的内存占用情况
pidstat -r -p 2954515 1 5

以下是统计CPU(默认情况)、内存、IO的区别

stress:系统压力测试工具

stress用于模拟 CPU、内存、I/O 等资源负载,常与 cgroup 配合测试资源限制是否生效(例如用stress创建高负载进程,观察 cgroup 是否能限制其资源占用)。

使用stress也是要先进行下载的,我是用的是ubuntu

# 下载
apt install stress -y
# 卸载
apt remove stress -y

下载后,输入stress,我们可以看到该工具的用法

语法

# option->选项  ARG->参数
stress [option [ARG]]
# stress -c 5  --> -c是option   5是ARG

option

ARG

作用

-c/--cpu

N(整数)

生成 N 个 CPU 密集型进程

-m/--vm

N(整数)

生成 N 个内存密集型进程

-b/--vm-bytes

B(数值+单位,如 512M)

指定每个内存进程占用的内存大小(默认 256MB

--vm-hang

N(秒数)

内存进程分配内存后挂起 N 秒再释放(模拟内存长期占用)

-i/--io

N(整数)

生成 N 个 I/O 密集型进程(通过反复 sync () 写磁盘实现)

-d/--hdd

N(整数)

生成 N 个硬盘写入密集型进程(通过写临时文件实现)

-t/--timeout

T(数值 + 单位,如 10s)

指定压力测试持续时间,超时后自动退出

-q/--quiet

静默模式,仅输出错误信息

用例

我们先生成一个压力测试,然后再使用 pidstat 指令进行指定进程查看

stress -c 1

pidstat -p [PID]

同时需要注意的是 -b 不能单独使用

以及如果同时使用 -m -b 还是没有生成对应的进程,那就是stress版本的问题,我们要使用 --vm-bytes 才可以

定时压力测试

实战

Cgroup

查看当前版本

cat /proc/filesystems | grep cgroup

从显示的结果我们可以得知,同时支持 cgroup cgroup2 两种文件系统类型

  • cgroup(v1)是早期版本,通过不同子系统(如cpumemory)独立管理资源,各子系统可挂载到不同层级。

  • cgroup2(v2)是新版,采用统一层级结构,所有子系统挂载到同一层级,资源管理更统一、隔离性更强,是容器技术(如 Docker)的推荐版本。

查看挂载信息

mount | grep

mount | grep -E "cgroup|tmpfs"

查看子系统

# 根据挂载情况得知使用的是v1还是v2
# cgroup v1
cat /proc/cgroup

# cgroup v2
cat /sys/fs/cgroup

查看进程

# $$ 表示当前shell进程的 PID
cat /proc/$$/cgroup

控制内存

进入控制目录

在进行内存控制之前,我们要先进入到cgroup的内存控制目录当中

# cgroup v1
cd /sys/fs/cgroup/memory

# cgroup v2
cd /sys/fs/cgroup

创建控制组目录

我们需要创建自定义内存控制组目录,会自动生成相关配置文件

mkdir test_memory

进入控制组目录

进入控制组目录之后,我们查看对应的文件,可以看到初始是没有限制的,即输出为 max

cd test_memory
# 查看限制 v1
cat memory.limit_in_bytes
# 查看限制 v2
cat memory.max

写入限制并启动进程

将我们想要设置的限制内存大小写入文件中

# v1
echo "[具体大小]">memory.limit_in_bytes
# v2
echo "[具体大小]">memory.max

# 启动进程 限制内存大小
stress -m 1 --vm-bytes [50M]

# 将进程加入控制组
sudo echo [PID] > /sys/fs/cgroup/test_memory/cgroup.procs

# 恢复内存无限制(需sudo,因为文件属主是root)
sudo sh -c "echo 'max' > memory.max"

需要注意的是,控制CPU和控制内存的操作虽然类似,但是配置文件会有一点不同

# 进入cgroup根目录
cd /sys/fs/cgroup

# 创建自定义控制组目录(会自动生成CPU、内存等所有资源的配置文件)
sudo mkdir test_cgroup

# 进入该控制组目录,即可配置CPU、内存等限制
cd test_cgroup

# 配置CPU限制:限制为50%核心占用(周期100000微秒,配额50000)
sudo sh -c "echo '50000 100000' > cpu.max"

# 将进程加入控制组(与内存操作完全相同)
sudo echo 进程PID > cgroup.procs

# 取消CPU限制(恢复默认)
sudo sh -c "echo 'max 100000' > cpu.max"

更多推荐