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