CGroups资源控制实战【Linux】

CGroups资源控制实战

  • [1. 基础知识](#1. 基础知识)
    • [1.1 pidstat](#1.1 pidstat)
    • [1.2 stress](#1.2 stress)
  • [2. 实操一、cgroups信息查看](#2. 实操一、cgroups信息查看)
  • [3. 实操二、使用cgroups对内存进行控制](#3. 实操二、使用cgroups对内存进行控制)
  • [4. 实操三、使用cgroups对cpu进行控制](#4. 实操三、使用cgroups对cpu进行控制)

1. 基础知识


1.1 pidstat


1. 概述

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

2. 语法:

bash 复制代码
pidstat [选项] [<时间间隔>] [<次数>]
  • 参数:
    • -u:默认参数,显示各进程的CPU使用统计;
    • -r:显示各进程的内存使用统计;
    • -d:显示各进程的IO使用情况;
    • -p: 指定进程号,ALL表示所有进程;
    • -C:指定命令;
    • -l:显示命令名和所有参数。

3. 安装(Ubuntu)

bash 复制代码
#卸载
apt remove sysstat -y
# 安装
apt install sysstat -y

1.2 stress


1. 概述

  • stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。

2. 语法

bash 复制代码
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个不断执行writeunlink函数的进程(创建文件,写入内容,删除文件)
      • --hdd-bytes B:指定文件大小。
    • -t, --timeout N:在N秒后结束程序;
    • -q, --quiet:程序在运行的过程中不输出信息。

3. 安装(Ubuntu)

bash 复制代码
#卸载
apt remove stress -y
#安装
apt install stress -y

2. 实操一、cgroups信息查看


1. cgroups版本查看

  • 使用命令:cat /proc/filesystems | grep cg
    • 可以看到,我的机器上支持两个版本的cgroup

2. cgroups子系统查看

  • 使用命令:cat /proc/cgroups
    • 查看能控制哪些资源。

3. cgroups挂载信息查看

  • 使用命令:mount | grep cgroup
    • 控制组的存储目录。

4. 查看一个进程上的cgroups限制

  • cat /proc/$$/cgroup找到当前进程的cgroup目录,然后带上前缀/sys/fs/cgroup/...就可以查看该进程的cgroup目录具体内容了。

3. 实操二、使用cgroups对内存进行控制


1. 创建任务组:

  • /sys/fs/group/下创建一个目录myapp,目录中的内容会自动生成:

2. 启动一个stress进程

  • stress -m 1 --vm-bytes 50m:开一个进程,占用50m内存。

3. pidstat监控stress进程

  • pidstat -C stress -p ALL -r 2 100000:监控命令stress关联的所有进程,每两秒打印一次,打印100000。

4. 为任务组添加内存限制

  • echo "20M" > /sys/fs/cgroup/myapp/memory.max:设置20M的内存限制。
  • echo "0" > /sys/fs/cgroup/myapp/memory.swap.max:完全禁用内存交换。

5. 将stress进程pid加入任务组

  • echo "2789" > /sys/fs/cgroup/myapp/cgroup.procs

6. 观察现象

  • stress进程立即停止:
  • 监控丢失,因为进程终止了:
  • 内存限制成功。

4. 实操三、使用cgroups对cpu进行控制


1. 启用子级cpu限制

  • echo "+cpu" > /sys/fs/cgroup/cgroup.subtree_control:cgroup.subtree_control文件设置开启的子级限制有哪些,看到下图中开启了cpu限制,内存限制和pid限制。

2. 为任务组设置20%的cpu限制

  • echo "20000 100000" > /sys/fs/cgroup/myapp/cpu.max

3. 启动cpu占用约100%的stress进程,并开始监控

  • stress -c 1
  • 启动监控:pidstat -C stress -u -p ALL 2 100000
  • 可以看到cpu几乎打满。

4. 将进程pid加入任务组,并查看监控信息

  • echo "2814" > /sys/fs/cgroup/myapp/cgroup.procs
  • 查看监控:
  • 可以看到,cpu占用率直线下降,最终稳定在了20%。

相关推荐
发量惊人的中年网工13 分钟前
AI服务器托管怎么选机房?GPU集群对机柜、电力和网络的硬要求
服务器·网络·人工智能
盐焗鹌鹑蛋14 分钟前
【Linux】权限
linux
窝子面16 分钟前
认识Docker与启动容器与镜像的关系
运维·docker·容器
玖玥拾29 分钟前
Unity 3D 笔记(十五)Unity/C# Socket 网络笔记4
服务器·网络·unity·c#
小此方30 分钟前
Re:Linux系统篇(四十六)信号篇·四:一文串联操作系统底层:时钟中断、内核态切换、系统调用与 Linux 信号处理全解析
linux·驱动开发·信号处理
编程序的员36 分钟前
使用OpenTelemetry来监控GoLang应用
运维·golang·monitoring·apm·opentelemetry
羑悻的小杀马特2 小时前
把随身WiFi改成网盘聚合器:中兴F50挂载本地存储+夸克网盘实战
运维·服务器·人工智能·网盘·openlist
无人生还别怕2 小时前
如何制作一个linux标准iso镜像
linux·iso·opencloudos·openanolisos
Yana.nice10 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
2601_9605679612 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化