cgroup cpu和memory参数配置和测试

安装

sudo apt install cgroup-tools

测试程序

测试cpu占用率

执行指令

while : ; do : ; done &

执行指令

sudo echo 20000 > ./cpu.cfs_quota_us

表示每100ms占用20ms,也就是最多占用20%

如果添加多个进程表示这些进程一起最多占用20%。
所以一个进程需要一个resouce group来控制

测试memory

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <thread>

#define MEM_LENGTH 1024*1024*100 // 100Mb
#define MEM_MAX 8
int main(void)
{
	std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 30));
	char *mem = NULL;
	int i = 0;
	for(; i < MEM_MAX; i++)
    {
		mem = (char*) malloc(MEM_LENGTH); 
		if(mem != NULL)
        {
			memset(mem, 0, MEM_LENGTH);
		}
		// if(i == 10)
        // {
		// 	std::this_thread::sleep_for(std::chrono::milliseconds(60));
		// }
	}
	while(1)
    {
		i++;
	}
	return 1;
}

后台执行并得到pid

在sleep前加入cgroup可以监控memory使用,没加入cgroup时分配的memory不计入。

没有在分配内存时加入sleep:
top -p pid 发现内存占用800Mb
image

先分配500Mb再sleep 30s再分配1000Mb时
在sleep时加入内存限制:
image

参数

通用参数

  • cgroup.clone_children: 当此文件设置为非零值时,新创建的子cgroup会继承父cgroup的内存限制。
  • cgroup.procs: 包含当前隶属于该cgroup的进程ID(PID)。通过向该文件写入或删除PID,可以将进程加入或移出该cgroup。

memory参数

  • memory.failcnt:记录 cgroup 内存使用超过限制的次数。
  • memory.stat:包含更详细的内存使用统计信息,如分配、回收、交换等。
  • memory.usage_in_bytes:当前 cgroup 已使用的内存总量。
  • memory.kmem.max_usage_in_bytes:show max kernel memory usage recorded
  • memory.soft_limit_in_bytes:set/show soft limit of memory usage
  • memory.force_empty:trigger forced page reclaim. 触发强制页面回收

cpuacct参数

  • cpuacct.stat: 显示cgroup中所有进程自加入以来累计的CPU使用统计信息,包括用户态(user)、内核态(system)和其他时间(如软中断、硬中断等)。
  • cpuacct.usage : 报告一个cgroup中所有任务(包括其子孙层级中的所有任务)使用CPU的总时间(纳秒),该文件时可以写入0值的,用来进行重置统计信息。
  • cpuacct.usage_percpu: 报告一个cgroup中所有任务(包括其子孙层级中的所有任务)在每个CPU使用CPU的时间(纳秒)。
  • cpuacct.usage_user: 报告一个cgroup中所有任务(包括其子孙层级中的所有任务)使用用户态CPU的总时间(纳秒)。
  • cpuacct.usage_sys: 报告一个cgroup中所有任务(包括其子孙层级中的所有任务)使用内核态CPU的总时间(纳秒)。
  • cpuacct.usage_percpu_sys:报告一个cgroup中所有任务(包括其子孙层级中的所有任务)在每个CPU上使用内核态CPU的时间(纳秒)。

cpu参数

  • cpu.cfs_period_us:配置调度周期长度
  • cpu.cfs_quota_us 表示 cgroup 在一个调度周期内允许使用的最大 CPU 时间(微秒)

比如cpu.cfs_period_us配置为50000,cpu.cfs_quota_us配置为2000,cpu占用率最高就是4%

配置方法

memory配置

memory.force_empty

echo 1 > ./memory.force_empty
触发强制页面回收,回收的也是加入cgroup后的内存

cgroup版本的区别

组织方式:

cgroup v1以文件系统层次结构的形式组织cgroup。每个cgroup都是一个目录,包含了相应的控制文件和子cgroups。
而v2则将所有cgroup视为平等,并且通过统一挂载点管理。

子系统配置

在v1中,不同类型的资源被称为“子系统”,例如CPU、内存、IO等。每个子系统都有一个对应的控制器来管理该资源。
在v2中,所有子系统都已经合并到单个hierarchy中,并由一个统一的控制器来管理。

其他相关配置

设置nice值
renice 10 11243
设置进程优先级
chrt --pid 20 11243

posted @   227569hy  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示