首页 > 系统相关 >【Linux内核】Cgroup原理和使用

【Linux内核】Cgroup原理和使用

时间:2024-11-01 13:48:18浏览次数:1  
标签:Cgroup cpuacct us CPU 内核 cgroup Linux 进程 cpu

1.Cgroup简介

cgroups(Control Groups)是Linux内核的一个特性,用于对进程组的物理资源(如CPU、内存、磁盘I/O等)进行细粒度的控制和监控。cgroups可以帮助你限制、记录和隔离资源使用,但它本身并不直接用来“拉高CPU负载”。相反,cgroups通常用于限制进程可以使用的资源量,以防止它们消耗过多资源而影响系统上的其他进程。

如果用户想要某个进程或进程组能够获得更多的CPU时间,以通过调整cgroups的CPU配额来实现。以下操作需要以root权限来操作,具体配置步骤如下:

1.创建Cgroup

首先创建一个新的cgroup,通常在/sys/fs/cgroup/cpu目录下:

sudo mkdir /sys/fs/cgroup/cpu/my_cgroup

2.加入进程

2.1 将一个进程加入到这个cgroup中

sudo echo <PID> /sys/fs/cgroup/cpu/my_group/cgroup.procs

<PID>是想要控制的进程的进程ID

2.2 将多个进程添加到这个cgroup的cgroup.procs文件中

echo <PID1> | sudo tee -a /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs
echo <PID2> | sudo tee -a /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs

其中 <PID1>, <PID2>, ... 是你想要控制的进程的进程ID。使用 tee -a命令可以追加内容到文件中,而不会覆盖现有内容。

3.调整CPU配额

可以通过cpu.shares文件来调整cgroup的CPU份额。这个值表示cgroup中的进程相对于系统中其他进程的相对权重

echo 1024 > /sys/fs/cgroup/cpu/my_cgroup/cpu.shares

1024是一个权重值,可以根据需要调整它

4.设置CPU配额和周期

如果想要更精细的控制,可以使用cpu.cfs_quota_us和cpu.cfs_period_us来设置CPU配额和周期

echo 50000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_period_us

这里的cpu.cfs_quota_us是配额,cpu.cfs_period_us是周期。这个设置表示在每个周期(100000微妙)内,cgroup中的进程最多可以使用50000微妙的CPU时间。

如果需要测试系统的CPU负载能力,也可以考虑使用Stress或stress-ng这样的工具来生成负载,来帮助测试系统在高负载下的表现。

2.Cgroup的CPU子系统

cgroupcpu子系统用于控制和监控进程组的CPU资源使用情况。在 /sys/fs/cgroup/cpu/路径下,可以找到一系列的文件和子目录,它们用于配置和查看cgroup的CPU相关属性。以下是一些常见的属性及其说明:

本地Ubuntu下cgroup的属性:

user@/sys/fs/cgroup/cpu$ ls
cgroup.clone_children  cpuacct.usage_percpu_sys   cpu.stat
cgroup.procs           cpuacct.usage_percpu_user  docker
cgroup.sane_behavior   cpuacct.usage_sys          notify_on_release
cpuacct.stat           cpuacct.usage_user         release_agent
cpuacct.usage          cpu.cfs_period_us          system.slice
cpuacct.usage_all      cpu.cfs_quota_us           tasks
cpuacct.usage_percpu   cpu.shares                 user.slice

1.cgroup.procs

  • 这个文件包含了属于该cgroup的所有进程的PID列表。你可以将进程添加到这个文件中,以将其加入到对应的cgroup。

2.cpu.shares

  • 这个文件定义了cgroup中进程的相对CPU时间份额。数值越高,进程获得的CPU时间越多。默认情况下,所有cgroup的 cpu.shares值都是1024。

3.cpu.cfs_period_us

  • 这个文件定义了CPU时间配额的周期,单位是微秒(us)。它与 cpu.cfs_quota_us配合使用,定义了进程的CPU使用率限制。

4.cpu.cfs_quota_us

  • 这个文件定义了cgroup中所有进程的CPU时间配额,单位是微秒(us)。如果设置了这个值,那么在 cpu.cfs_period_us定义的周期内,cgroup中的进程只能使用这么多的CPU时间。

5.cpu.stat

  • 这个文件提供了cgroup中进程的CPU使用统计信息,包括CPU时间、运行次数、阻塞次数等。

6.cpuacct.usage

  • 这个文件显示了cgroup中所有进程使用的总CPU时间,单位是纳秒(ns)。

7.cpuacct.usage_percpu

  • 这个文件显示了每个CPU上cgroup中所有进程使用的CPU时间,单位是纳秒(ns)。

8.notify_on_release

  • 这个文件用于控制当cgroup中的最后一个进程退出时是否发送通知。

9.cgroup.clone_children

  • 控制当一个进程fork或clone时,其子进程是否自动加入到同一个cgroup。

10.cgroup.sane_behavior

  • 控制cgroup的行为是否为“sane”模式,即是否对旧的cgroup版本提供向后兼容性

11.cpuacct.usage_all

  • 显示cgroup中所有进程使用的总CPU时间,包括用户态、内核态以及被阻塞的时间。

12.cpuacct.usage_percpu_sys

  • 显示每个CPU上cgroup中所有进程使用的内核态CPU时间,单位是纳秒(ns)。

13.cpuacct.usage_percpu_user

  • 显示每个CPU上cgroup中所有进程使用的用户态CPU时间,单位是纳秒(ns)。

14.cpuacct.usage_user

  • 显示cgroup中所有进程使用的内核态CPU时间,单位是纳秒(ns)。

15.release_agent

  • 指定一个脚本或程序,当cgroup中的最后一个进程退出时,该脚本或程序将被执行。

16.task

  • cgroup.procs类似,包含当前cgroup中所有进程的PID列表。

这些文件和目录提供了cgroup的配置和监控功能,允许管理员对进程组的CPU资源使用进行细粒度的控制和监控。

标签:Cgroup,cpuacct,us,CPU,内核,cgroup,Linux,进程,cpu
From: https://www.cnblogs.com/Wangzx000/p/18519443

相关文章

  • Windows内核驱动-进程回调
    一、核心代码一共三部分:定义回调函数注册回调移除回调#include<ntddk.h>//定义回调函数,在后续实现VOIDProcessNotifyRoutine( _Inout_PEPROCESSProcess,//进程对象,这是个不透明结构,不建议强行使用其中的字段 _In_HANDLEProcessId,//进程ID _In_......
  • 截图工具 for Linux --- 你用过吗?
    截图工具forLinuxLinux系统在桌面、嵌入式、服务器等多领域的广泛应用,催生了各种需求的截图工具。从简单的命令行工具到复杂的图形化应用,Linux的截图工具逐渐发展并适应了不同的图形后端架构,如X11和Wayland。本篇将从这两大后端的视角出发,介绍Linux截图工具的种类、功能......
  • 0-petalinux 问题记录-VFS: Cannot open root device fs or unknown-block(0,0): erro
    0-petalinux问题记录-VFS:Cannotopenrootdevicefsorunknown-block(0,0):error-6这个问题是对SD卡分区之后,ext4分区写入一个文件系统之后的现象,不能正常启动,通过log可以看出来是能找到sd卡的分区,提示需要增加引导,可是在镜像构建的时候UBoot那里面已经设置过了,参数没......
  • 0-petalinux 问题记录-VFS: Cannot open root device fs or unknown-block(0,0): erro
    0-petalinux问题记录-VFS:Cannotopenrootdevicefsorunknown-block(0,0):error-6这个问题是对SD卡分区之后,ext4分区写入一个文件系统之后的现象,不能正常启动,通过log可以看出来是能找到sd卡的分区,提示需要增加引导,可是在镜像构建的时候UBoot那里面已经设置过了,参数没......
  • 性能测试|linux服务器搭建JMeter+Grafana+Influxdb监控可视化平台
    前言在当前激烈的市场竞争中,创新和效率成为企业发展的核心要素之一。在这种背景下,如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。而在软件开发过程中,性能测试是一项不可或缺的环节,它可以有效的评估一个系统、应用或者软件的性能指标。然而,如何提升性能测试效......
  • linux特殊符号
    1.特殊符号***********************************#**********************************#:注释、备注、批注,系统自动忽略,不执行。#系统不执行被#号注释的内容[root@localhosthtml]##[root@localhosthtml]#***********************************;*******************......
  • linux 哪些字符需要转义
    linux字符需要转义的有:1、空格;2、反斜杠(\);3、引号;4、美元符号($);5、感叹号(!);6、斜杠(/);7、竖线(|);8、等号(=)。空格是一个特殊字符,通常用于分隔命令参数或文件名。如果文件名或路径中包含空格,需要使用反斜杠(\)进行转义。例如,如果文件名是“myfile.txt”,则需要写成“my\file.txt”。......
  • linux引导程序有哪些
    Linux引导程序是Linux操作系统启动的关键组成部分。本文将介绍Linux引导程序的各种类型和作用,包括以下几个核心观点:1、引导加载程序(Bootloader)的作用;2、GRUB和LILO等常见引导加载程序;3、UEFI引导方式和传统BIOS引导方式的区别;4、Linux内核的启动过程。通过深入了解这些内容,你将更......
  • linux线程池
    线程池:*一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应......
  • Linux操作系统网站提示“Internal Server Error”报错
    可能原因及解决方法服务器资源超载解决方法:检查服务器资源使用情况,如CPU、内存和磁盘空间。如果资源使用率过高,考虑优化应用或升级服务器配置。PHP版本过低解决方法:检查当前PHP版本,并确保与WordPress兼容。可以通过以下命令查看PHP版本:   PHP文件配置错......