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