🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:Docker_秦jh_的博客-CSDN博客
目录
目的
基础知识
pidstat
stress
实操一、cgroups信息查看
cgroups版本查看
cgroups子系统查看
cgroups挂载信息查看
查看一个进程上的cgroup限制
实操二、使用cgroups对内存进行控制
实操三、使用cgroups对cpu进行控制
前言
💬 hello! 各位铁子们大家好哇。
今日更新了Docker相关内容 🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
目的
能够查看cgroups基本信息,了解容器化中,操作系统是真正的资源控制层,对cpu 和内存的控制有一定的理解。
基础知识
pidstat
pidstat 是 sysstat 的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备 IO 等系统资源的占用情况。Pidstat第一次采样显示自系统启动开始的各项统计信息, 后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间 来获得所需的统计信息。
语法:
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
参数:
- -u:默认参数,显示各进程的CPU使用统计
- -r:显示各进程的内存使用统计
- -d:显示各进程的IO使用情况
- -p:指定进程号,ALL表示所有进程
- -C:指定命令
- -l:显示命令名和所有参数
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:程序在运行的过程中不输出信息
实操一、cgroups信息查看
cgroups版本查看

如果看到cgroup2,表示支持cgroup v2
如何确定系统使用的版本?

cgroups子系统查看
cgroupv1查看

cgroupv2查看

cgroups挂载信息查看
cgroupv1挂载
可以看到默认存储位置为 /sys/fs/cgroup

cgroupv2挂载

查看一个进程上的cgroup限制
cgroupv1版本查看:
以当前shell进程为例,查看进程的cgroup

比如cpu在user.slice,我们可以找到这个目录,里面有对init进程的详细限制信 息

cgroupv2版本查看
以当前shell进程为例,查看进程的cgroup

比如cpu在user.slice,我们可以找到这个目录,里面有对init进程的详细限制信 息

实操二、使用cgroups对内存进行控制
cgroupv1操作
创建内存的cgroup,很简单我们进入到cgroup的内存控制目录 /sys/fs/cgroup/memory,我们创建目录test_memory


可以看到内存限制文件已经自动在test_memory中创建完成了,cgroups 文件系 统会在创建文件目录的时候自动创建相应的配置文件


配置cgroup的策略为最大使用20M内存

启动1个消耗内存的进程,每个进程占用50M内存

打开一个新的shell窗口B窗口,使用pidstat查看状态,红色为进程id


打开一个新的shell C窗口,将进程id移动到我们的cgroup策略

可以看到进程无法申请到足够内存退出

可以看到进程消失了

cgroupv2 操作
查看当前的控制,确认memory是支持的

cgroup v2 挂载在/sys/fs/cgroup,创建子cgroup目录


配置cgroup的策略为最大使用20M内存

启动1个消耗内存的进程,每个进程占用50M内存

打开一个新的shell窗口B窗口,使用pidstat查看状态,红色为进程id

打开一个新的shell C窗口,将进程id移动到我们的cgroup策略

可以看到进程无法申请到足够内存退出

可以看到进程消失了

实操三、使用cgroups对cpu进行控制
cgroupv1 操作
创建内存的cgroup,很简单我们进入到cgroup的内存控制目录 /sys/fs/cgroup/cpu,我们创建目录 test_cpu,可以看到系统会自动为我们创建cgroup 的cpu策略


打开新的shell 窗口B窗口,使用stress模拟一个任务,cpu使用率为100

可以看到cpu的使用率为100%

打开新的shell窗口C窗口,我们设置cproup的cpu使用率为30%,cpu使用率 的计算公式cfs_quota_us/cfs_period_us
1)cfs_period_us:cfs_period_us 表示一个 cpu 带宽,单位为微秒。系统总 CPU 带 宽 ,默认值100000。
2)cfs_quota_us:cfs_quota_us 表示 Cgroup 可以使用的 cpu 的带宽,单位为微秒。 cfs_quota_us 为-1,表示使用的 CPU 不受 cgroup 限制。cfs_quota_us 的最小值为1ms(1000),最大值为1s。
所以我们将cfs_quota_us的值设置为30000 ,从理论上讲就可以限制test_cpu控 制的进程的cpu利用率最多是30% 。

我们可以看到进程的PID为62577,我们将该进程放到tasks文件进行控制

B窗口中可以看到我们监控的cpu的使用率由100%降低为30%

cgroupv2 操作
创建内存的cgroup,很简单我们进入到cgroup的内存控制目录/sys/fs/cgroup/, 我们创建目录test_cpu,可以看到系统会自动为我们创建cgroup的cpu策略



打开新的shell 窗口B窗口,使用stress模拟一个任务,cpu使用率为100

可以看到cpu的使用率为100%


打开新的shell窗口C窗口,我们设置cproup的cpu使用率为30%,cpu使用率 的计算公式cfs_quota_us/cfs_period_us
1)cfs_period_us:cfs_period_us 表示一个 cpu 带宽,单位为微秒。系统总 CPU 带 宽 ,默认值100000。
2)cfs_quota_us:cfs_quota_us 表示 Cgroup 可以使用的 cpu 的带宽,单位为微秒。 cfs_quota_us 为-1,表示使用的 CPU 不受 cgroup 限制。cfs_quota_us 的最小值为 1ms(1000),最大值为1s。
所以我们将cfs_quota_us的值设置为30000 ,从理论上讲就可以限制test_cpu控 制的进程的cpu利用率最多是30% 。

我们可以看到进程的PID为4782,我们将该进程放到procs文件进行控制
![]()
B窗口中可以看到我们监控的cpu的使用率由100%降低为30%

至此我们成功的模拟了对内存和cpu的使用控制,而docker本质也是调用这些的API 来完成对资源的管理,只不过docker的易用性和镜像的设计更加人性化,所以docker 才能风靡全球
网硕互联帮助中心






评论前必须登录!
注册