Linux系统cgroups资源精细化控制基础

文章目录

一、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

功能:

pidstatsysstat的一个命令,用于监控全部或指定进程的 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

示例:

  1. 默认查询:pidstat

如上默认是-u,即cpu使用情况

  • UID:进程所属用户的用户ID
  • PID:进程ID
  • %usr:用户空间占用比例
  • %system:内核空间占用比例
  • %guest:虚拟机占用比例
  • %wait:进程等待CPU的时间占比
  • %CPU:CPU占用比例
  • CPU:CPU核心编号
  • Command:进程对应的命令名
  1. 查看内存占用情况pidstat -r
  • minflt/s:次要缺页异常频率
  • majflt/s:主要缺页异常频率
  • VSZ:虚拟内存占用大小
  • RSS:物理内存占用大小
  • %MEM:物理内存占用百分比
  1. 按命令名称查询,如指定mysql: pidstat -C mysql
  2. 指定时间间隔和查询次数
    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.1 查看cgroup找到内存子系统挂载目录:mount | grep cgroup

    1.2 进到内存控制目录,创建目录test

    • cd /sys/fs/cgroup/memory
    • mkdir test
    • cd test

    1.3 查目录 -l

  2. 设置内存上限

    2.1 看原来的值:cat memory.limit_in_bytes

    2.2 写入新的值,比如20MB,即20971520字节:echo "20971520" > memory.limit_in_bytes

    2.3 检查:cat memory.limit_in_bytes

  3. 创建两个新窗口

    • 压力测试:stress -m 1 --vm-bytes 50m
    • 监测:pidstat -C stress -p ALL -r 2 1000
  4. 进程pid放到tasks文件里

    • echo "2611" > tasks
      效果:被限制只能申请20MB内存而程序申请50MB,进程退出。

五、cpu控制

  1. 创建CPU控制组

    1.1 mount | grep cgroup

    1.2 找的cpu控制目录并进入,cd /sys/fs/cgroup/cpu

    1.3 创建控制组目录,mkdir test_cpu

  2. 打开两个新窗口

    2.1 压力测试,启动进程把cpu打满:stress -c 1

    2.2 监测:pidstat -C stress -u -p ALL 2 1000

  3. 修改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%。

  1. 进程pid放到tasks文件里
    • echo "1806" > tasks
      效果:cpu占比最高只能到20%

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!

相关推荐
cui__OaO1 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
小狗爱吃黄桃罐头1 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
秃了也弱了。2 小时前
WireShark:非常好用的网络抓包工具
网络·测试工具·wireshark
小晶晶京京2 小时前
day34-LNMP详解
linux·运维·服务器
画个太阳作晴天2 小时前
A12预装app
linux·服务器·前端
fengyehongWorld2 小时前
Linux crontab定时任务
linux·运维
shuangrenlong3 小时前
ubuntu更新chrome版本
linux·chrome·ubuntu
碎像3 小时前
Linux上配置环境变量
linux·运维·服务器
起个昵称吧4 小时前
线程相关编程、线程间通信、互斥锁
linux·算法