Docker基础-cgroup

cgroup

  • cgroup
    • 什么是 cgroups
    • 为什么使用 cgroups
    • cgroups 的用途
    • cgroups 可以控制的子系统
    • 基础命令
      • pidstat
      • stress
    • cgroup试验
      • cgroups 信息查看
        • cgroups 版本查看
        • cgroups 子系统查看
        • cgroups 挂载信息查看
        • 查看一个进程上的 cgroup 限制
      • 使用 cgroups 对内存进行控制
      • 使用 cgroups 对 cpu 进行控制

cgroup

什么是 cgroups

cgroups(Control Groups) 是 linux 内核提供的一种机制, 这种机制可以根据需求把一 系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。 简单说, cgroups 可以限制、记录任务组所使用的物理资源。本质上来说, cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

为什么使用 cgroups

其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 及 k8s 中的 pod 就使用了 cgroups 提供的资源限制能力来完成 cpu,内存等部分的资源控制。

比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。

cgroups 的用途

Resource limitation: 限制资源使用,例:内存使用上限/cpu 的使用限制
Prioritization: 优先级控制,例: CPU 利用/磁盘 IO 吞吐
Accounting: 一些审计或一些统计
Control: 挂起进程/恢复执行进程

cgroups 可以控制的子系统

bikio对块设备的IO进行限制
cpu限制CPU时间片的分配
cpuacct生成cgroup 中的任务占用资源的报告,与cpu挂载在同一目录
cpuset给cgroup 中的任务分配独立的CPU和内存节点
devices限制设备文件的创建和对设备文件的读写
freezer暂停/恢复 cgroup 中的任务
memory对cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告
perf_event允许 perf 观测 cgroup 中的task
net_clscgroup 中的任务创建的数据报文的类型标识符,这让 Linux 流量控制器(tc指令)可以识别来自特定cgroup任务的数据包,并进行网络限制
hugetlb限制使用的内存页数量
pids限制任务的数量
rdma限制 RDMA 资源(cgroup2版本才有这个功能)

基础命令

pidstat

作用:用于监控全部或指定进程的 CPU、内存、线程、设备IO 等系统资源的占用情况。 pidstat 第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

语法:

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]

参数:

  • -u:默认参数,显示各进程的 CPU 使用统计

  • -r:显示各进程的内存使用统计

  • -d:显示各进程的 IO 使用情况

  • -p:指定进程号,ALL 表示所有进程

  • -C:指定命令

  • -l:显示命令名和所有参数

示例:

查看指定进程所占用内存的使用情况
在这里插入图片描述
每隔1秒监控一次mysql进程使用内存情况,总共监控1000次
在这里插入图片描述

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:程序在运行的过程中不输出信息

示例:

创建 1一个进程,对cpu来进行压力测试

stress -c 1

cgroup试验

cgroups 信息查看

cgroups 版本查看

查看支持的版本
在这里插入图片描述

cgroups 子系统查看

可以查看到可以控制的资源
在这里插入图片描述

cgroups 挂载信息查看

查看控制组的存储路径
在这里插入图片描述

查看一个进程上的 cgroup 限制

下面的示例是通过以一个进程来如何找到自己的控制组

1.以当前 shell 进程为例,查看进程的 cgroup

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

使用 cgroups 对内存进行控制

1.创建内存的 cgroup 控制组,我们进入到 cgroup 的内存控制目录/sys/fs/cgroup/memory,我们创建目录 test_memory

[root@VM-0-11-centos memory]# mkdir test_memory
[root@VM-0-11-centos memory]# ls
cgroup.clone_children memory.kmem.slabinfo memory.memsw.limit_in_bytes memory.swappiness
cgroup.event_control memory.kmem.tcp.failcnt memory.memsw.max_usage_in_bytes memory.usage_in_bytes
cgroup.procs memory.kmem.tcp.limit_in_bytes memory.memsw.usage_in_bytes memory.use_hierarchy
cgroup.sane_behavior memory.kmem.tcp.max_usage_in_bytes memory.move_charge_at_immigrate notify_on_release
memory.failcnt memory.kmem.tcp.usage_in_bytes memory.numa_stat release_agent
memory.force_empty memory.kmem.usage_in_bytes memory.oom_control tasks
memory.kmem.failcnt memory.limit_in_bytes memory.pressure_level test_memory
memory.kmem.limit_in_bytes memory.max_usage_in_bytes memory.soft_limit_in_bytes YunJing
memory.kmem.max_usage_in_bytes memory.memsw.failcnt memory.stat

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

[root@VM-0-11-centos memory]# cd test_memory/
[root@VM-0-11-centos test_memory]# ll
total 0
-rw-r–r-- 1 root root 0 Sep 12 14:27 cgroup.clone_children
–w–w–w- 1 root root 0 Sep 12 14:27 cgroup.event_control
-rw-r–r-- 1 root root 0 Sep 12 14:27 cgroup.procs
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.failcnt
–w------- 1 root root 0 Sep 12 14:27 memory.force_empty
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.failcnt
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.limit_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.max_usage_in_bytes
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.slabinfo
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.tcp.failcnt
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.tcp.limit_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.tcp.max_usage_in_bytes
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.tcp.usage_in_bytes
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.kmem.usage_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.limit_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.max_usage_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.memsw.failcnt
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.memsw.limit_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.memsw.max_usage_in_bytes
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.memsw.usage_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.move_charge_at_immigrate
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.numa_stat
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.oom_control
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.soft_limit_in_bytes
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.stat
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.swappiness
-r–r–r-- 1 root root 0 Sep 12 14:27 memory.usage_in_bytes
-rw-r–r-- 1 root root 0 Sep 12 14:27 memory.use_hierarchy
-rw-r–r-- 1 root root 0 Sep 12 14:27 notify_on_release
-rw-r–r-- 1 root root 0 Sep 12 14:27 tasks

3.配置 cgroup 的策略为最大使用 20M 内存
在这里插入图片描述
4.启动 1 个消耗内存的进程,每个进程占用 50M 内存
在这里插入图片描述
5.打开一个新的 shell 窗口 B 窗口,使用 pidstat 查看状态
在这里插入图片描述
6.将进程 id 移动到我们的 cgroup 策略

cd /sys/fs/cgroup/memory echo 20968 > tasks

7.可以看到进程无法申请到足够内存退出
在这里插入图片描述
可以看到进程消失了
在这里插入图片描述

使用 cgroups 对 cpu 进行控制

1.创建内存的 cgroup 控制组,我们进入到 cgroup 的内存控制目录 /sys/fs/cgroup/cpu,创建目录 test_cpu,可以看到系统会自动为我们创建 cgroup 的 cpu 策略

[root@VM-0-11-centos cpu,cpuacct]# mkdir test_cpu
[root@VM-0-11-centos cpu,cpuacct]# cd test_cpu/
[root@VM-0-11-centos test_cpu]# ls
cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release
cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares tasks
cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat

2.打开新的 shell 窗口 B 窗口,使用 stress 模拟一个任务, cpu 使用率为 100
在这里插入图片描述
3.可以看到 cpu 的使用率为 接近100%
在这里插入图片描述
4.打开新的 shell 窗口 C 窗口,我们设置 cproup 的 cpu 使用率为 20%, 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 文件里的值设置为 20000 ,从理论上讲就可以限制 test_cpu 控制的进程的 cpu 利用率最多是 20%

echo 20000 > test_cpu/cpu.cfs_quota_us

5.我们可以看到进程的 PID 为 27423,我们将该进程放到 tasks 文件进行控制
在这里插入图片描述
6.B 窗口中可以看到我们监控的 cpu 的使用率由 100%降低为 20%
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新加坡市场最全开发攻略

作为东盟经济的“发动机”&#xff01;新加坡是继纽约、伦敦、香港之后的第四大国际金融中心。据《2022年全球竞争力》报告显示&#xff0c;新加坡是亚洲地区排名最高的&#xff0c;位列全球三甲之一。 同时&#xff0c;新加坡作为东盟(ASEAN)的核心成员国&#xff0c;还是世贸…

算法:经典贪心算法--跳一跳[2]

1、题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 返回到达 nums[n - 1] 的最小跳跃次数。生…

Hugging News #0904: 登陆 AWS Marketplace

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

Android离线文字识别-tesseract4android调用

Android在线文字识别可以调阿里云的接口Android文字识别-阿里云OCR调用__花花的博客-CSDN博客 需要离线文字识别的话&#xff0c;可以调tesseract4android。个人测试效果不是特别理想&#xff0c;但是速度真的很快&#xff0c;VIVO S10后摄照片&#xff0c;80ms内识别完成。现…

王道考研计算机网络

文章目录 计算机网络体系结构计算机网络概述计算机网络的性能指标 计算机网络体系结构与参考模型错题 物理层通信基础基础概念奈奎斯特定理和香农定理编码与调制电路交换、报文交换和分组交换数据报与虚电路 传输介质物理层设备错题 数据链路层数据链路层的功能组帧差错控制检错…

二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了&#xff0c;这里是文章链接 https://blog.csdn.net/qq_45894840/article/details/129490504?spm1001.2014.3001.5501什么是缓冲区溢出 当系统向缓冲区写入的数据多于它可以容纳的数据时&#xff0c;…

从0到1理解ChatGPT原理

目录 写在前面 1.Tansformer架构模型 2.ChatGPT原理 3.提示学习与大模型能力的涌现 3.1提示学习 3.2上下文学习 3.3思维链 4.行业参考建议 4.1拥抱变化 4.2定位清晰 4.3合规可控 4.4经验沉淀 机械工业出版社京东自购链接 写在前面 2022年11月30日&#xff0c;ChatG…

【C语言】库宏offsetof

一.offsetof简介 因此,宏offsetof的作用是: 当你传入结构体的类型及其成员时,它会返回该成员在结构体中的偏移量. 二.offsetof的使用 如下,我们使用offsetof打印一下结构体foo中,成员a,成员b及成员c相对于首地址的偏移量分别是多少: #include <stdio.h> #include …

Vue框架--收集表单数据

下面我们介绍Vue收集表单中的数据。这一节比较重要&#xff0c;需要大家好好听&#xff0c;因为后面数据交互的时候使用的特别的多。

Redis新篇一:认识Redis

首先&#xff0c;很抱歉小伙伴们&#xff0c;前段时间一直都没有更新&#xff0c;我很抱歉&#xff0c;现在开始持续更新Redis相关内容啦&#xff01;有需要的小伙伴们可以持续关注一下小博主的新篇哦~ 希望对你们有帮助&#xff01; 作者&#xff1a;爱撸猫的程序员 博客地址…

Android kotlin开源项目-功能标题目录

目录 一、BRVAH二、开源项目1、RV列表动效&#xff08;标题目录&#xff09;2、拖拽与侧滑&#xff08;标题目录&#xff09;3、数据库&#xff08;标题目录&#xff09;4、树形图(多级菜单)&#xff08;标题目录&#xff09;5、轮播图与头条&#xff08;标题目录&#xff09;6…

Mybatis中传递多个参数的4种方法

现在大多项目都是使用Mybatis了&#xff0c;但也有些公司使用Hibernate。使用Mybatis最大的特性就是sql需要自己写&#xff0c;而写sql就需要传递多个参数。面对各种复杂的业务场景&#xff0c;传递参数也是一种学问。下面给大家总结了以下几种多参数传递的方法&#xff1a; 方…