云计算百科
云计算领域专业知识百科平台

【Docker】资源控制

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:Docker_秦jh_的博客-CSDN博客

  9efbcbc3d25747719da38c01b3fa9b4f.gif​​​​

目录

目的

基础知识

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 才能风靡全球

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【Docker】资源控制
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!