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

相关推荐
昵称什么的不存在5 小时前
WPeChatGPT 插件使用教程(转载)
linux·逆向
码农hbk5 小时前
xv6 源码精读(二)开启MMU、一致性映射页表
linux·服务器
雪碧聊技术5 小时前
Linux命令过关挑战
linux·运维·数据库
liulilittle5 小时前
在 Android Shell 终端上直接运行 OPENPPP2 网关路由配置指南
android·linux·开发语言·网络·c++·编程语言·通信
GoodTimeGGB5 小时前
轻量服务器Lighthouse + 1Panel + Halo,三步打造你的专属网站
服务器·1panel·lighthouse·建站·halo
ayaya_mana5 小时前
CentOS 7 安装指定内核版本与切换内核版本
linux·运维·centos
uncle_ll5 小时前
Sherpa 语音识别工具链安装指南(Linux CPU 版)
linux·nlp·语音识别·tts·sherpa
你什么冠军?6 小时前
云计算与服务器概述
运维·服务器·云计算
UNbuff_06 小时前
Linux top 命令使用说明
linux·运维·服务器