centos7使用cgroup对user进行资源限制

1.概述

本篇介绍在centos7.9(4核1G虚拟机)上使用cgroup对user的资源(cpu,memory)进行限制,达到对普通用户的资源利用限制跟root资源限制生效且效果不同。

适用于多用户登陆节点上对用户限制,避免造成服务节点负载过高,性能下降,节点宕机等问题。

参考教程:https://zhuanlan.zhihu.com/p/528234268

2.部署过程

工具依赖安装

安装依赖:yum -y install libcgroup libcgroup-tools

配置文件处理
配置cgconfig.conf,内容如下:

template users/%u {
    memory {
        memory.limit_in_bytes = 200M;
        memory.memsw.limit_in_bytes = 0M;
    }   
    cpu {
        cpu.cfs_quota_us = 200000;
        cpu.cfs_period_us = 100000;
    }   
}
group  root {
    memory {
        memory.limit_in_bytes = 500M;
    }   
    cpu {
        cpu.cfs_quota_us = 400000;
        cpu.cfs_period_us = 100000;
    }   
}

配置/etc/cgrules.conf,内容如下:

root    cpu,memory              root
*       cpu,memory              users/%u

服务启动

systemctl start cgconfig
systemctl start cgred

当服务启动以后,在/sys/fs/cgroup/cpu//sys/fs/cgroup/memory/目录下,会出现以 root命名和users命名的目录。

root目录下,即是对root用户的资源限制,users目录下是登陆到此节点上普通用户的资源限制。

删除限制

有时候对配置文件/etc/cgconfig.conf和/etc/cgrules.conf修改后,需要重启服务,并先删除之前的配置

systemctl restart cgconfig && systemctl restart cgred

cgdelete -g cpu:/root
cgdelete -g memory:/root
cgdelete -g cpu:/users/xxx
cgdelete -g memory:/users/xxx

3.测试

cpu测试脚本cpu.sh

#!/bin/bash
while_test()
{
    while ((1));
    do
        i=2;
    done
}

run_cpu()
{
    for ((i=0; i<$1; i++));
    do
        while_test &
    done
}

if [ "$#" -ne 1 ]
then
    echo "$0 num"
else
    run_cpu $1
fi

内存测试程序oom.c

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

#define MEGABYTE 1024*1024

int main(int argc, char *argv[]){
        void *myblock = NULL;
        int count = 0;
        float seconds = 0.5;
        while(1)
        {
                myblock = (void *) malloc(MEGABYTE);
                if ( !myblock ) break;
                memset(myblock,1,MEGABYTE);
                sleep(seconds);
                printf("已经分配内存%dMb\n", ++count);
        }
        return 0;
}

gcc -o oom oom.c

root用户的cpu利用测试

执行:bash cpu.sh 4,然后top发现4核心均以用上

10252 root      20   0  113280    392    192 R 100.0  0.0   0:03.98 bash                                                                     
10249 root      20   0  113280    392    192 R  99.7  0.0   0:03.97 bash
10250 root      20   0  113280    392    192 R  99.7  0.0   0:03.97 bash
10251 root      20   0  113280    388    188 R  99.7  0.0   0:03.95 bash 

root用户的内存使用测试

执行:./oom,达到限制阈值后被杀掉

已经分配内存491Mb
已经分配内存492Mb
已经分配内存493Mb
已经分配内存494Mb
已经分配内存495Mb
已经分配内存496Mb
已杀死

普通用户的cpu测试

执行:bash cpu.sh 4,然后top发现只能使用2核心

10608 liwl      20   0  113280    380    188 R  33.3  0.0   0:00.67 bash 
10610 liwl      20   0  113280    384    192 R  33.3  0.0   0:00.66 bash
10611 liwl      20   0  113280    384    192 R  33.3  0.0   0:00.65 bash 
10609 liwl      20   0  113280    384    192 R  27.8  0.0   0:00.67 bash

普通用户的内存测试

执行:./oom后,达到限制阈值被杀掉

已经分配内存188Mb
已经分配内存189Mb
已经分配内存190Mb
已经分配内存191Mb
已经分配内存192Mb
已经分配内存193Mb
已经分配内存194Mb
已经分配内存195Mb
已经分配内存196Mb
已经分配内存197Mb
已经分配内存198Mb
Killed
posted @ 2022-11-25 10:11  liwldev  阅读(867)  评论(1编辑  收藏  举报