概念
cgroups(Control Groups) 是 linux 内核提供的一种机制, 这种机制可以根据需求把一 系列系统任务及其子任务整合 ( 或分隔 ) 到按资源划分等级的不同组内,从而为系统资源 管理提供一个统一的框架。 简单说, cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子 (hook) ,通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
为什么使用 cgroups?
其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 及 k8s 中的 pod 就使用了 cgroups 提供的资源限制能力来完成 cpu,内存等部分的资源控制。比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。
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 挂载信息查看
我们可以使用 mount | grep cgroup 命令,可以看到默认存储位置为 /sys/fs/cgroup

查看一个进程上的 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 是 sysstat 的一个命令,用于监控全部或指定进程的 CPU 、内存、线程、设备 IO 等系统资源的占用情况。 Pidstat 第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
语法
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
参数:
- -u:默认参数,显示各进程的 CPU 使用统计
- -r:显示各进程的内存使用统计
- -d:显示各进程的 IO 使用情况
- -p:指定进程号,ALL 表示所有进程
- -C:指定命令
- -l:显示命令名和所有参数
安装
Ubuntu 安装
#卸载
apt remove sysstat -y
#安装
apt install sysstat -y
CentOS 安装
#卸载
yum remove sysstat -y
#安装
yum install sysstat -y
stress 命令
stress 是 Linux 的一个压力测试工具,可以对 CPU 、 Memory 、 IO 、磁盘进行压力测试。
语法
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:程序在运行的过程中不输出信息
安装
Ubuntu 安装
#卸载
apt remove stress -y
#安装
apt install stress -y
CentOS 安装
#卸载
yum remove stress -y
#安装
yum install stress -y