一, 背景
近日在客户系统运维中发现, 有系统在定时脚本执行期间会将 Linux 系统 CPU 利用率跑满, 导致其他服务受到影响, 故查阅资料发现有大神写的 CPU 利用率限制程序.
地址: CPU Usage Limiter for Linux http://cpulimit.sourceforge.net/
根据此编写脚本, 配合定时任务放置在服务器上, 达到限制程序 CPU 情况, 可根据自己系统 CPU 核心数进行参数配置, 会记录 CPU 超过阀值的日志, 可供后期进行查看分析.
二, 脚本
Git 地址:
- #!/bin/bash
- # auth:kaliarch
- # func:sys info check
- # version:v1.0
- # sys:centos6.x/7.x
- set -e
- [ $(id -u) -gt 0 ] && exit 1
- # CPU 使用超过百分之多少进行限制
- PEC_CPU=80
- # 限制进程使用百分之多少, 如果程序为多线程, 单个 CPU 限制为 85, 如果为多核心, 就需要按照比例写, 例如 CPU 为 2c, 像限制多线程占比 80%, 就写 170
- LIMIT_CPU=85
- # 日志
- LOG_DIR=/var/log/cpulimit/
- # 超过阀值进程 pid
- PIDARG=$(ps -aux |awk -v CPU=${PEC_CPU} '{if($3> CPU) print $2}')
- CPULIMITCMD=$(which cpulimit)
- install_cpulimit() {
- [ ! -d /tmp ] && mkdir /tmp || cd /tmp
- wget -c https://github.com/opsengine/cpulimit/archive/v0.2.tar.gz
- tar -zxf v0.2.tar.gz
- cd cpulimit-0.2 && make
- [ $? -eq 0 ] && cp src/cpulimit /usr/bin/
- }
- do_cpulimit() {
- [ ! -d ${LOG_DIR} ] && mkdir -p ${LOG_DIR}
- for i in ${PIDARG};
- do
- MSG=$(ps -aux |awk -v pid=$i '{if($2 == pid) print $0}')
- echo ${MSG}
- [ ! -d /tmp ] && mkdir /tmp || cd /tmp
- nohup ${CPULIMITCMD} -p $i -l ${LIMIT_CPU} &
- echo "$(date) -- ${MSG}">> ${LOG_DIR}$(date +%F).log
- done
- }
- main() {
- hash cpulimit
- if [ $? -eq 0 ];then
- do_cpulimit
- else
- install_cpulimit && do_cpulimit
- fi
- }
- main
三, 测试
3.1 测试脚本
为配合测试利用 python 编写测试脚本来将 CPU 跑满
- #!/bin/env python
- import math
- import random
- a=10000
- b=10000
- c=10000
- sum=0
- for i in range(0,a):
- for j in range(0,b):
- randomfloat=random.uniform(1,10)
- randompow=random.uniform(1,10)
- sum+=math.pow(randomfloat, randompow)
- print "sum is %s" % sum
制作定时任务
3.2 运行脚本
脚本本身本身只使用了一个核心, 跑了两个测试脚本, 将 CPU 跑到 100%
3.3 查看进程
查看已经有两个 cpulimt 进对测试程序进行了 CPU 使用率限制
3.4 查看日志
记录下了 cpulimit 限制时刻的日志
3.5 查看 CPU 利用率
查看 CPU 利用率已经限制到了 85%
来源: http://www.bubuko.com/infodetail-2849607.html