登录节点cgroup限制CPU和内存

1. 背景

业务集群提供了几个供用户登陆的Linux服务器。用户除了能够做正常的文件操作以外,还能够编译和提交远程计算。但是用户有的喜欢或者无意识地使用本地(即登录节点)进行计算(使用登录节点CPU和内存),对于共享的资源来说,这是对我们业务系统和其他用户的“伤害”

因此迫切需要对用户可使用资源进行限制。限制的技术也就是Linux内核机制Cgroup

2. 操作

2.1 查看cgroup是否可用

登录节点,通过service cgconfig status查看cgroup机制已经启动,挂载点为/cgroup目录。

2.2 配置限制脚本

因为登录的用户过多,所以直接针对用户的程序进行限制。首先创建一个限制脚本,如下:

#!/bin/bash

# 1. mkdir sub-system
CPU_CGROUP=/cgroup/cpu/$(hostname)
MEM_CGROUP=/cgroup/memory/$(hostname)

mkdir -p ${CPU_CGROUP} ${MEM_CGROUP}

# 2. write file
CPU_LIMIT=${CPU_CGROUP}/cpu.cfs_quota_us
MEM_SW_LIMIT=${MEM_CGROUP}/memory.memsw.limit_in_bytes
MEM_LIMIT=${MEM_CGROUP}/memory.limit_in_bytes
CPU_TASK=${CPU_CGROUP}/tasks
MEM_TASK=${MEM_CGROUP}/tasks

# 3. set num
#6 core
CPUNUM=600000
#10G
#MEMNUM=31897681920
MEMNUM=10737418240
MEMSWNUM=10737418240
echo ${CPUNUM} > ${CPU_LIMIT}
echo ${MEMNUM} > ${MEM_LIMIT}
echo ${MEMSWNUM} > ${MEM_SW_LIMIT}

# 4. work
for user in $(/usr/bin/who|grep -v root|awk '{print $1}'|sort|uniq)
do

	for pid in $(/usr/bin/pgrep -u ${user})
	do
		echo ${pid} >> ${CPU_TASK} 2>/dev/null
		echo ${pid} >> ${MEM_TASK} 2>/dev/null
	done
done	

上述脚本主要包括:

  • 设置可用CPU资源
  • 设置可用内存(交换分区)资源
  • 遍历用户程序pid,然后设置不同pid可用CPU

2.3 创建定时任务

在登录节点执行crontab -e,内容:

*/1 * * * * /bin/bash /root/cgroup_limit.sh

3 . 测试

分别测试计算密集型和内存耗费型脚本,可以查看设置结果,CPU限制在6个核心使用,而超出10G内存,会被OOM

原文地址:https://www.cnblogs.com/liwanliangblog/p/13260240.html