docker基础-cgroup
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)是早期版本,通过不同子系统(如cpu、memory)独立管理资源,各子系统可挂载到不同层级。 -
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"
更多推荐
所有评论(0)