文章目录
- 一、cgroups的认识
-
- [1. 什么是 cgroups?](#1. 什么是 cgroups?)
- [2. 为什么使用 cgroups?](#2. 为什么使用 cgroups?)
- [3. cgroups 的用途](#3. cgroups 的用途)
- [4. cgroups可以控制的子系统](#4. cgroups可以控制的子系统)
- 二、pidstat
- 三、stress
- 四、内存控制
- 五、cpu控制
一、cgroups的认识
1. 什么是 cgroups?
cgroups(Control Groups)
是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups
可以限制、记录任务组所使用的物理资源。本质上来说,cgroups
是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
2. 为什么使用 cgroups?
其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器Docker 及 k8s 中的 pod 就使用了cgroups 提供的资源限制能力来完成 cpu,内存等部分的资源控制。
比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。
3. cgroups 的用途
Resource limitation
: 限制资源使用,例:内存使用上限/cpu 的使用限制Prioritization
: 优先级控制,例:CPU 利用/磁盘 IO 吞吐Accounting
: 一些审计或一些统计Control
: 挂起进程/恢复执行进程
4. cgroups可以控制的子系统
子系统 | 功能描述 |
---|---|
blkio |
对块设备的 IO 进行限制。 |
cpu |
限制 CPU 时间片的分配。 |
cpuacct |
生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录。 |
cpuset |
给 cgroup 中的任务分配独立的 CPU(多处理器系统)和内存节点。 |
devices |
限制设备文件的创建,和对设备文件的读写。 |
freezer |
暂停/恢复 cgroup 中的任务。 |
memory |
对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告。 |
perf_event |
允许 perf 观测 cgroup 中的 task。 |
二、pidstat
功能:
pidstat
是 sysstat
的一个命令,用于监控全部或指定进程的 CPU、内存、线程、设备 IO 等系统资源的占用情况。Pidstat 第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
语法:
shell
pidstat [选项] [<时间间隔>] [<次数>]
参数:
-u
: 默认参数,显示各进程的 CPU 使用统计-r
: 显示各进程的内存使用统计-d
: 显示各进程的 IO 使用情况-p
: 指定进程号(ALL
表示所有进程)-C
: 指定命令-l
: 显示命令名和所有参数
安装- Ubuntu:
sudo apt install sysstat -y
- CentOS:
sudo yum install sysstat -y
示例:
- 默认查询:
pidstat
如上默认是-u,即cpu使用情况
UID
:进程所属用户的用户IDPID
:进程ID%usr
:用户空间占用比例%system
:内核空间占用比例%guest
:虚拟机占用比例%wait
:进程等待CPU的时间占比%CPU
:CPU占用比例CPU
:CPU核心编号Command
:进程对应的命令名
- 查看内存占用情况
pidstat -r
minflt/s
:次要缺页异常频率majflt/s
:主要缺页异常频率VSZ
:虚拟内存占用大小RSS
:物理内存占用大小%MEM
:物理内存占用百分比
- 按命令名称查询,如指定mysql:
pidstat -C mysql
- 指定时间间隔和查询次数
pidstat 1 100
:每隔1秒查询一次,查询100次。
三、stress
功能:
stress 是 Linux 的一个压力测试工具,可以对 CPU、Memory、IO、磁盘进行压力测试。
语法 :
shell
stress [OPTION [ARG]]
参数:
-c, --cpu N
: 产生 N 个进程,每个进程都循环调用 sqrt 函数产生 CPU 压力。-i, --io N
: 产生 N 个进程,每个进程循环调用 sync 将内存缓冲区内容写到磁盘上,产生 IO 压力。通过系统调用 sync 刷新内存缓冲区数据到磁盘中,以确保同步。如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生 IO 压力。在 SSD 磁盘环境中尤为明显,很可能 lowait 总是 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:
sudo apt install stress -y
- CentOS:
sudo yum install stress -y
示例:
接下来我们使用每一个选项演示一遍,打开两个窗口,一个用来压力测试,一个用来监控。
监控:pidstat -C stress -p ALL -u 2 1000
测试:stress -c 1
效果:
监控:pidstat -C stress -p ALL -u 2 1000
测试:stress -i 1
效果:
监控:pidstat -C stress -p ALL -r 2 1000
测试:stress -m 1 --vm-bytes 50m
效果:
监控:pidstat -C stress -p ALL -d 2 1000
测试:stress -d 1
效果:
-cgroups版本查看:cat /proc/filesystems | grep cg
- 子系统查看:
cat /proc/cgroups
- 挂载信息查看:
mount | grep cgroup
- 进程控制组查看:
cat /proc/$$/cgroup
四、内存控制
以cgroup版本演示
-
创建内存控制组:
1.1 查看cgroup找到内存子系统挂载目录:
mount | grep cgroup
1.2 进到内存控制目录,创建目录test
cd /sys/fs/cgroup/memory
mkdir test
cd test
1.3 查目录 -l
-
设置内存上限
2.1 看原来的值:
cat memory.limit_in_bytes
2.2 写入新的值,比如20MB,即20971520字节:
echo "20971520" > memory.limit_in_bytes
2.3 检查:
cat memory.limit_in_bytes
-
创建两个新窗口
- 压力测试:
stress -m 1 --vm-bytes 50m
- 监测:
pidstat -C stress -p ALL -r 2 1000
- 压力测试:
-
进程pid放到tasks文件里
echo "2611" > tasks
效果:被限制只能申请20MB内存而程序申请50MB,进程退出。
五、cpu控制
-
创建CPU控制组
1.1
mount | grep cgroup
1.2 找的cpu控制目录并进入,
cd /sys/fs/cgroup/cpu
1.3 创建控制组目录,
mkdir test_cpu
-
打开两个新窗口
2.1 压力测试,启动进程把cpu打满:
stress -c 1
2.2 监测:
pidstat -C stress -u -p ALL 2 1000
-
修改cfs_quota_us
3.1 查看cpu.cfs_quota_us:
cat cpu.cfs_quota_us
3.2 修改cpu.cfs_quota_us:
echo "20000" > cpu.cfs_quota_us
3.3 检查cpu.cfs_quota_us:
cat cpu.cfs_quota_us
cfs_period_us
:表示一个 CPU 带宽,单位为微秒。系统总 CPU 带宽,默认值 100000(即 100ms)。cfs_quota_us
:表示 Cgroup 可以使用的 CPU 带宽,单位为微秒。cfs_quota_us
为 -1 时,表示使用的 CPU 不受 Cgroup 限制。cfs_quota_us 的最小值为1000(1ms)
,最大值为1000000(1s)
。
所以我们将 cfs_quota_us 的值设置为 20000(即 20000/100000 = 20%),即可限制 test_cpu 控制的进程的 CPU 利用率最多为 20%。
- 进程pid放到tasks文件里
echo "1806" > tasks
效果:cpu占比最高只能到20%
非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!