加载中…
个人资料
loongene
loongene
  • 博客等级:
  • 博客积分:0
  • 博客访问:115,258
  • 关注人气:11
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

用Cpulimit和脚本自动控制CPU使用率

(2013-09-13 09:22:02)
标签:

cpulimit

分类: linux

1、

cpulimit --pid `ps aux|awk '{if($3 > 20) print $2}'` --limit 10

 

2、转载:http://blog.csdn.net/wafly/article/details/7868451

Linux下有《cpulimit》软件可以对cpu使用进行控制,可以达到保护系统服务的目的

但这个软件使用起来有诸多限制,并且只能对现已存在的进程进行限制

因此就有了以下脚本,设置此脚本为随机自启动即可,它会对所有进程(包括新建进程)进行监控并限制(3秒检测一次,CPU限制为75%)

当然需要服务器上安装了cpulimit才行,另外需要将log路径修改为本机路径

  1. #!/bin/bash  
  2.   
  3. while true do  
  4.   id=`ps -ef grep cpulimit grep -v "grep" awk '{print $10}' tail -1 
  5.   nid=`ps aux awk '{ if $3 75 print $2 }' head -1 
  6.   if "${nid}" != "&& "${nid}!= "${id}" then  
  7.     cpulimit -p ${nid} -l 75  
  8.     echo "[`date`] CpuLimiter run for ${nid} `ps -ef grep ${nid} awk '{print $8}' head -1`" >> /home/wafly/workspace/log/CpuLimiter.log  
  9.   fi  
  10.   sleep 3  
  11. done 

3、转载:http://blog.sina.com.cn/s/blog_81026f690100re8e.html

本教程只测试于 Ubuntu 8.04 LTS 或者 Ubuntu 10.04 LTS (其他版本的Ubuntu也应该适用)


Linux上面比较头痛的就是CPU使用量因为某个进程急速上涨,所以本教程就是教给你如何控制单个进程最高不能消耗20%的CPU资源,对于VPS使用者来说是绝对的福音


1 安装必要工具

sudo apt-get install cpulimit

sudo apt-get install gawk


2 新建一个进程文件,执行

vi /usr/bin/cpulimit_daemon.sh

然后把下面的代码复制进去

#!/bin/bash

# ==============================================================

# CPU limit daemon - set PID's max. percentage CPU consumptions

# ==============================================================


# Variables

CPU_LIMIT=20           # 1 可以自定义单线程最高CPU使用量,默认20%,这里是指单核的20%,双核其实是10%,四核既是5%

DAEMON_INTERVAL=3      # 2 进程监视器触发事件,默认3秒

BLACK_PROCESSES_LIST=   # 3 黑名单

WHITE_PROCESSES_LIST=   # 4 白名单


# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.

if [[ -n "$BLACK_PROCESSES_LIST" &&  -n "$WHITE_PROCESSES_LIST" ]] ; then    # If both variables are defined then error is produced.

   echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."

   exit 1

elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command

   NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"

elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command

   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"

else

   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"

fi


# Search and limit violating PIDs

while sleep $DAEMON_INTERVAL

do

   NEW_PIDS=$(eval "$NEW_PIDS_COMMAND")                                                                    # Violating PIDs

   LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}')                                          # Already limited PIDs

   QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')   # PIDs in queue


   for i in $QUEUE_PIDS

   do

       cpulimit -p $i -l $CPU_LIMIT -z &   # Limit new violating processes

   done

done


复制完代码注意修改上面的1,2,3,4 注意黑名单和白名单只能使用一个,另一个需要留空,也就是说如果你黑名需要控制的是apache2|firefox|vsftp (多个程序以 | 来区分),那么其他程序就自动进入白名单而不用填写,同理,你把apache2|firefox|vsftp加入白名单,那么其他程序就自动进入黑名单而被进程监视。


3 给上面创立的文件加root权限

sudo chmod 700 /usr/bin/cpulimit_daemon.sh


4 创建新的自动启动文件

vi /etc/init.d/cpulimit

然后把下面的代码复制进去

#!/bin/sh

#

# Script to start CPU limit daemon

#

set -e


case "$1" in

start)

if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | wc -l) -eq 0 ]; then

    nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 &

    ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }'

else

    echo " * cpulimit daemon can't be started, because it is already running"

fi

;;

stop)

CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | wc -l)

CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l)

CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE))

if [ $CPULIMIT_ALL -gt 0 ]; then

    if [ $CPULIMIT_DAEMON -gt 0 ]; then

        ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | xargs kill -9   # kill cpulimit daemon

    fi


    if [ $CPULIMIT_INSTANCE -gt 0 ]; then

        ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9                    # release cpulimited process to normal priority

    fi

    ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }'

else

    echo " * cpulimit daemon can't be stopped, because it is not running"

fi

;;

restart)

$0 stop

sleep 3

$0 start

;;

status)

ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'

;;

esac

exit 0


5 给上面创立的文件加root权限 +

sudo chown root:root /etc/init.d/cpulimit

sudo chmod 755 /etc/init.d/cpulimit


6 添加到启动项

sudo update-rc.d cpulimit defaults


7 重启动

sudo reboot


8 测试 CPU 负载控制器

查看服务状态 sudo service cpulimit status

手动启动服务 sudo service cpulimit start

手动停止服务 sudo service cpulimit stop

手动重启服务 sudo service cpulimit restart


9 卸载 CPU 负载控制器

首先停止 sudo service cpulimit stop

从启动项卸载 sudo update-rc.d -f cpulimit remove

删除启动项文件 sudo rm /etc/init.d/cpulimit

删除进程监视 sudo rm /usr/bin/cpulimit_daemon.sh

卸载程序 sudo apt-get remove cpulimit

卸载程序 sudo apt-get remove gawk

http://linuxtoy.org/archives/cpulimit-2.html

http://www.maketecheasier.com/limit-cpu-usage-of-any-process-in-linux/2010/09/22

Cpulimit 是一款用于控制CPU使用率的工具 (本站之前介绍),这里介绍的是一套用它来自动控制CPU使用率的脚本,原出 Ubuntu Forum。它可以用于防止CPU超载,也可以用黑名单/白名单的方法对某些特殊应用放行,对于服务器是一套有用的工具。

首先安装 cpulimitgawk

sudo apt-get install cpulimit gawk

脚本在此处下载,其中包含 cpulimit_daemon.shcpulimit 两个文件。可用编辑器修改前者实现自定义配置,如下图: cpulimit-daemon

红框部分: CPU_LIMIT: 这是每个程序能使用的最大CPU资源。默认值为 20%。

DAEMON_INTERVAL: 这是脚本检查CPU情况的间隔时间,默认值为3秒。

BLACK_ PROCESS_ LIST: 这是指定只监视某些特定进程时用的黑名单。有多个进程的话,可以用 "|" 隔开。 例如, "mysql|firefox|gedit"。

WHITE_ PROCESSES_ LIST: 这是指定某些特定进程不用监视时用的白名单。 用法同上。

注意: 黑名单和白名单至少要有一个为空白——不能同时使用这两者。

安装:

将 cpulimit_daemon.sh 文件拷贝至 /usr/bin/ ,并修改其访问权限。

sudo cp ~/cpulimit/cpulimit_daemon.sh /usr/bin

sudo chmod 700 /usr/bin/cpulimit_daemon.sh

将 cpulimit 文件拷贝至 /etc/init.d/ ,修改其访问权限并使其开机自启动。

sudo cp ~/cpulimit/cpulimit /etc/init.d/

sudo chown root:root /etc/init.d/cpulimit

sudo chmod +x /etc/init.d/cpulimit

sudo update-rc.d cpulimit defaults

重启系统,守护进程会自动启动。可以在终端中查看和控制状态:

sudo service cpulimit status

检查守护进程是否已启动。 如果没有,用以下命令启动。

sudo service cpulimit start

相反可以用以下命令终止:

sudo service cpulimit stop

卸载:

卸载可参考以下步骤:

1、停止守护进程

sudo service cpulimit stop # 会终止 cpulimit 守护进程和一切受 cpulimit 控制的进程。

2、移除开机自启动

sudo update-rc.d -f cpulimit remove # 移除符号链接

3、删除自启动脚本

sudo rm /etc/init.d/cpulimit

4、删除 cpulimit daemon 文件

sudo rm /usr/bin/cpulimit_daemon.sh

5、卸载 cpulimit 程序

sudo apt-get remove cpulimit

删除 gawk 与否看情况。

sudo apt-get remove gawk

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有