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%。

相关推荐
满天星83035777 小时前
【MySQL】表的基本查询(上)
linux·服务器·数据库·mysql
yuanlaile7 小时前
Linux Docker、Swarm、K8s分布式部署全集解析
linux·docker·kubernetes·k8s实战
dajun1811234567 小时前
信息系统运维管理全流程详解 在线画图工具绘制运维流程图表技巧
运维·数据库·信息可视化·流程图·旅游·论文笔记
皮卡蛋炒饭.7 小时前
库制作与原理
linux·学习
PyHaVolask7 小时前
Linux实用工具与技巧
linux·运维·chrome
不才小强7 小时前
Linux开发环境搭建指南
linux·运维·服务器
syjy27 小时前
(含下载)WP Mail SMTP Pro WordPress插件使用教程
运维·服务器·wordpress·wordpress插件
海参崴-7 小时前
三足鼎立:Linux、苹果macOS与微软Windows的前世今生及核心差异
linux·microsoft·macos
信创DevOps先锋7 小时前
中国企业DevOps工具链选型趋势:本土化与安全可控成核心指标
运维·安全·devops
RisunJan7 小时前
Linux命令-mysqlshow(显示MySQL中数据库相关信息)
linux·数据库·mysql