signed

QiShunwang

“诚信为本、客户至上”

CpuLimit脚本进程CPU使用率限制

2021/6/3 15:52:01   来源:

第零章 序

在嵌入式平台调试程序的时候,经常会遇到进程占用cpu资源过高的情况,导致系统的稳定性降低,我们怎么来解决这个问题呢?
我们可以通过cpulimit工具来限制每个进程的cpu使用率,提供系统的整体稳定性。

cpulimit 命令的工作原理

为进程预设一个 cpu 占用率门限,并实时监控进程是否超出此门限,若超出则让该进程暂停运行一段时间。cpulimit 使用 SIGSTOP 和 SIGCONT 这两个信号来控制进程。它不会修改进程的 nice 值,而是通过监控进程的 cpu 占用率来做出动态调整。

cpulimit 的优势是可以控制进程的cpu使用率的上限值。但与 nice 相比也有缺点,那就是即使 cpu 是空闲的,进程也不能完全使用整个 cpu 资源。

第一章 安装及使用


wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

上面的命令行,会先从从 GitHub 上将源码下载到本地,然后再解压、编译、并安装到 /usr/bin 目录下。
现在就可以使用cpulimit命令了!

举例:

cpulimit –e httpd –l 40 #限制httpd(进程名)的cpu使用率为40%
cpulimit –e /usr/local/bin/httpd –l 40
cpulimit –p 2960 –l 55 #限制pid为2960的进程的CPU占用为55%

-e httpd, –exe=httpd,两者等同。
-l 40, –limit=40, 两者等同。
具体可以参考cpulimit -h帮助文档。

来看一个实例:

限制mysqld进程的CPU使用率在200%以内:

使用前:

这里写图片描述

使用后:

使用之后,cpu使用率被限制,因为是cpu使用率在动态变动,cpulimit不能非常及时准确的调整,偶尔会有超过200%,但是不会超过太多。

img

第二章 脚本控制CPU


创建脚本文件cpulimit.sh

#!/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=20

# 限制进程使用百分之多少,如果程序为多线程,单个cpu限制为85,如果为多核心,就需要按照比例写,例如cpu为2c,像限制多线程占比80%,就写170
LIMIT_CPU=30
# 日志
LOG_DIR=/data/cpulimit/log/

# 超过阀值进程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

接着只需使用sh cpulimit.sh,这样程序就会获取CPU超百分之20的进程程序,然后CpuLImit就会限流到百分之30,并且记录限流日志。

如果需要不定时的启动,则可以在脚本中定下循环控制器,持续运行main。