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