CGroups资源控制实战【Linux】
CGroups资源控制实战
- 1. 基础知识
- 1.1 pidstat
- 1.2 stress
- 2. 实操一、cgroups信息查看
- 3. 实操二、使用cgroups对内存进行控制
- 4. 实操三、使用cgroups对cpu进行控制
1. 基础知识
1.1 pidstat
1. 概述
pidstat
是sysstat
的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况。pidstat
第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
2. 语法:
pidstat [选项] [<时间间隔>] [<次数>]
- 参数:
-u
:默认参数,显示各进程的CPU使用统计;-r
:显示各进程的内存使用统计;-d
:显示各进程的IO使用情况;-p
: 指定进程号,ALL表示所有进程;-C
:指定命令;-l
:显示命令名和所有参数。
3. 安装(Ubuntu)
#卸载
apt remove sysstat -y
# 安装
apt install sysstat -y
1.2 stress
1. 概述
stress
是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。
2. 语法
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)
#卸载
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%。