我认为在 Linux 中没有限制 cpu 使用率的解决方案,但是有一种可接受的方法可以将任何进程限制为特定的 CPU 使用率:http ://ubuntuforums.org/showthread.php?t=992706
如果他们删除信息,这里又是
安装包
安装 cpulimit 包。代码:
sudo apt-get install cpulimit
安装 gawk 包。代码:
sudo apt-get install gawk
创建 CPULIMIT 守护进程文件
以 root 权限打开文本编辑器并将下面的守护程序脚本文本保存到新文件 /usr/bin/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
- 根据您的环境需求更改变量
CPU_LIMIT 如果您想将每个进程的 CPU 消耗忽略为除 20% 之外的任何其他百分比,请在上述脚本中更改此变量。如果您有 SMP 计算机(多于 1 个 CPU 或多于 1 个内核的 CPU),请阅读下面的“如果使用 SMP 计算机”一章。
DAEMON_INTERVAL 如果您想要更多/更少的定期检查,请在上面的脚本中更改此变量。间隔以秒为单位,默认设置为 3 秒。
BLACK_PROCESS_LIST 和 WHITE_PROCESSES_LIST 变量 BLACK_PROCESSES_LIST 仅限制指定的进程。如果变量为空(默认),则所有违规进程都会受到限制。
变量 WHITE_PROCESSES_LIST 限制除此变量中定义的进程之外的所有进程。如果变量为空(默认),则所有违规进程都会受到限制。
变量 BLACK_PROCESSES_LIST 和 WHITE_PROCESSES_LIST 之一或两者必须为空 - 定义两个变量是不合逻辑的。
您可以使用分隔符“|”在这两个变量之一中指定多个进程 (不带双引号)。示例:如果您想对除 mysql、firefox 和 gedit 进程之外的所有进程进行 cpulimit 设置变量:WHITE_PROCESSES_LIST="mysql|firefox|gedit"
在引导时自动启动守护进程的过程
为root用户设置文件权限:代码:
sudo chmod 755 /usr/bin/cpulimit_daemon.sh
以 root 权限打开文本编辑器并将下面的脚本保存到新文件 /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
- 将文件的所有者更改为 root:
代码:
sudo chown root:root /etc/init.d/cpulimit
- 更改权限:
代码:
sudo chmod 755 /etc/init.d/cpulimit
将脚本添加到启动程序目录: 代码:
sudo update-rc.d cpulimit 默认值
重新启动以检查脚本是否在启动时启动 cpulimit 守护进程: 代码:
须藤重启
手动检查、停止、启动和重新启动守护进程
注意:本教程中的守护进程和服务具有相同的含义。
注意:对于使用 Ubuntu 8.10 之前的用户(如 Ubuntu 8.04 LTS)而不是服务命令,请使用“sudo /etc/init.d/cpulimit status/start/stop/restart”语法或使用命令安装 sysvconfig 包:sudo apt-get安装 sysvconfig
检查 cpulimit 服务是否正在运行 检查命令返回:如果服务正在运行,则返回“cpulimit daemon is running”,如果服务未运行,则返回“cpulimit daemon is not running”。代码:
sudo service cpulimit status
启动 cpulimit 服务 您可以手动启动 cpulimit 守护程序,它将开始忽略 CPU 消耗。代码:
sudo service cpulimit start
停止 cpulimit 服务 Stop 命令停止 cpulimit 守护进程(因此不会限制新进程),并且还设置所有现有的受限进程以完全访问 CPU,就像在 cpulimit 未运行之前一样。代码:
sudo service cpulimit stop
重新启动 cpulimit 服务 如果您更改 /usr/bin/cpulimit_daemon.sh 中的某些变量设置,例如 CPU_LIMIT、DAEMON_INTERVAL、BLACK_PROCESSES_LIST 或 WHITE_PROCESSES_LIST,那么在更改设置后您必须重新启动服务。代码:
sudo service cpulimit restart
- 使用或不使用 CPULIMIT 守护程序检查 CPU 消耗
没有守护进程 1. 停止 cpulimit 守护进程(sudo service cpulimit stop) 2. 在后台执行 CPU 密集型任务 3. 执行命令:top 并检查 %CPU 列 每个进程的 %CPU 结果可能超过 20%。
打开守护进程 1. 启动 cpulimit 守护进程(sudo service cpulimit start) 2. 在后台执行相同的 CPU 密集型任务 3. 执行命令:top 并检查 %CPU 列 %CPU 的结果应该是每个进程的最大 20%。注意:不要忘记一开始 %CPU 可以超过 20%,因为 daemon 必须以 3 秒的间隔捕获违规进程(默认在脚本中设置)
- 如果使用 SMP 计算机
我已经在英特尔双核 CPU 计算机上测试了此代码 - 其行为类似于 SMP 计算机。不要忘记 top 命令和 cpulimit 默认在 Irix 模式下运行,其中 20% 表示一个 CPU 的 20%。如果有两个 CPU(或双核),则总 %CPU 可以是 200%。在 top 命令中,可以使用命令 I 关闭 Irix 模式(在运行 top 命令时按 +i)并打开 Solaris 模式,其中 CPU 总量除以 CPU 数量,因此 %CPU 不能超过 100 % 在任意数量的 CPU 计算机上。请在顶级手册页中阅读有关顶级命令的更多信息(搜索 I 命令)。另请阅读 cpulimit 官方页面中有关 cpulimit 如何在 SMP 计算机上运行的更多信息。
但是 cpulimit 守护进程是如何在 SMP 计算机上运行的呢?始终处于 Irix 模式。因此,如果您想在 2-CPU 计算机上花费 20% 的 CPU 功率,则应将 40% 用于 cpulimit 守护程序脚本中的 CPU_LIMIT 变量。
- 卸载 CPULIMIT 守护进程和 CPULIMIT 程序
如果您想摆脱 cpulimit 守护进程,您可以通过删除 cpulimit 守护进程并卸载 cpulimit 程序来清理您的系统。
停止 cpulimit 守护进程代码:
sudo service cpulimit stop # 停止 cpulimit 守护进程和所有 cpulimited 进程
从启动过程中删除守护程序代码:
sudo update-rc.d -f cpulimit remove # 删除符号链接
删除开机程序代码:
sudo rm /etc/init.d/cpulimit #删除cpulimit启动脚本
删除 cpulimit 守护进程代码:
sudo rm /usr/bin/cpulimit_daemon.sh #删除cpulimit daemon脚本
卸载cpulimit程序代码:
sudo apt-get 删除 cpulimit
卸载 gawk 程序 如果您不需要此程序用于任何其他脚本,您可以远程安装它。代码:
sudo apt-get 删除 gawk
关于作者的说明
我刚刚为 cpulimit 编写了守护进程(上面的 bash 脚本)。我不是 cpulimit 项目的作者。如果您需要更多关于 cpulimit 程序的信息,请阅读官方 cpulimit 网页:http ://cpulimit.sourceforge.net/ 。
问候, 施虐者