认真是我们
参与这个社会的方式

Linux VPS通过安装CPULimit来限制CPU使用率V2

原帖:https://ubuntuforums.org/showthread.php?t=992706


安装cpulimit&gawk

sudo apt-get install cpulimit
sudo apt-get install gawk

 

创建文件

cpulimit_daemon.sh

#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================

# Variables
CPU_LIMIT=20       	# Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3  	# Daemon check interval in seconds
BLACK_PROCESSES_LIST=   # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST=   # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.

# 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

 

保存至/usr/bin/cpulimit_daemon.sh

  • CPU_LIMIT: 这是每个程序能使用的最大CPU资源。默认值为 20%。
  • DAEMON_INTERVAL: 这是脚本检查CPU情况的间隔时间,默认值为3秒。
  • BLACK_ PROCESS_ LIST: 这是指定只监视某些特定进程时用的黑名单。有多个进程的话,可以用 “|” 隔开。 例如, “mysql|firefox|gedit”。
  • WHITE_ PROCESSES_ LIST: 这是指定某些特定进程不用监视时用的白名单。 用法同上。
  • 注意: 黑名单和白名单至少要有一个为空白——不能同时使用这两者。

修改文件权限

sudo chmod 755 /usr/bin/cpulimit_daemon.sh

 

cpulimit

原话是

Open text editor with root privileges and save bellow script to new file /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

 

修改其访问权限并使其开机自启动

sudo chown root:root /etc/init.d/cpulimit
sudo chmod 755 /etc/init.d/cpulimit
sudo update-rc.d cpulimit defaults

 

重启

sudo reboot

 

MANUALLY CHECK, STOP, START AND RESTART DAEMON

sudo service cpulimit status

sudo service cpulimit start

sudo service cpulimit stop

sudo service cpulimit restart

 

UNINSTALL CPULIMIT DAEMON AND CPULIMIT PROGRAM

sudo service cpulimit stop # Stop cpulimit daemon and all cpulimited processes

sudo update-rc.d -f cpulimit remove # Remove symbolic links

sudo rm /etc/init.d/cpulimit # Delete cpulimit boot-up script

sudo rm /usr/bin/cpulimit_daemon.sh # Delete cpulimit daemon script

sudo apt-get remove cpulimit

sudo apt-get remove gawk

 

 

没有故事 也没有酒

点也没用点也没用