概念
为什么使用 cgroups?
cgroups 的功能
-
资源限制:可以限制进程组使用的 CPU 时间、内存大小、磁盘 I/O 带宽等资源。
-
资源优先级分配:为进程组设置不同的优先级,确保关键进程获得更多的资源。
-
资源监控:监控和跟踪进程组的资源使用情况,提供 CPU 使用率、内存消耗等统计信息。
-
资源隔离:确保一个进程组不会消耗过多的系统资源,从而影响到其他进程组的正常运行。
-
动态调整:在运行时动态地调整进程组的资源配额。
cgroups 可以控制的子系统
| blkio | 对块设备的 IO 进行限制。 |
| cpu | 限制 CPU 时间片的分配。 |
| cpuacct | 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录。 |
| cpuset | 给 cgroup 中的任务分配独立的 CPU( 多处理器系统 ) 和内存节点。 |
| devices | 限制设备文件的创建,和对设备文件的读写。 |
| freezer | 暂停 / 恢复 cgroup 中的任务。 |
| memory | 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告。 |
| perf_event | 允许 perf 观测 cgroup 中的 task。 |
| net_cls | cgroup 中的任务创建的数据报文的类别标识符,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制。 |
| hugetlb | 限制使用的内存页数量。 |
| pids | 限制任务的数量。 |
| rdma | 限制 RDMA 资源 (Remote Direct Memory Access ,远程直接数据存取)。 |
我们也可以通过 cat /proc/cgroups 命令来查看控制的子系统。

cgroups 挂载信息查看
查看一个进程上的 cgroup 限制
之前我们已经知道可以使用 mount | grep cgroup 命令,可以看到默认存储位置为 /sys/fs/cgroup,以当前 bash 进程为例,查看进程的 cgroup。先使用以下命令查看 bash 进程 cgroup 的存储位置。
cat /proc/$$/cgroup ![]()
而后查看该存储位置下的文件夹
ll /sys/fs/cgroup/user.slice/user-0.slice/session-2254.scope 
根据这些文件就可以查看到该 bash 进程相应的信息。

pidstat 命令
语法
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ] - -u:默认参数,显示各进程的 CPU 使用统计
- -r:显示各进程的内存使用统计
- -d:显示各进程的 IO 使用情况
- -p:指定进程号,ALL 表示所有进程
- -C:指定命令
- -l:显示命令名和所有参数
安装
#卸载
apt remove sysstat -y
#安装
apt install sysstat -y #卸载
yum remove sysstat -y
#安装
yum install sysstat -y stress 命令
语法
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:程序在运行的过程中不输出信息
安装
#卸载
apt remove stress -y
#安装
apt install stress -y #卸载
yum remove stress -y
#安装
yum install stress -y
