我有以下问题:动态生成的某些进程有吃100%CPU的倾向.我想将所有匹配某些标准(例如进程名称)的进程限制为一定量的CPU百分比.
我试图解决的具体问题是利用折叠@ home工作流程.我能想到的最好的解决方案是定期执行的perl脚本,并使用cpulimit实用程序来限制进程(如果您对更多细节感兴趣,请查看此博客文章).它有效,但它是一个黑客:/
有任何想法吗?我想将流程的处理留给操作系统:)
再次感谢您的建议,但我们仍然错过了这一点:)
"slowDown"解决方案基本上就是"cpulimit"实用程序所做的.我仍然需要关注哪些进程要减速,一旦工作进程完成就终止"slowDown"进程,并为新的进程进程启动新的进程.这正是我用Perl脚本和cron工作所做的.
主要问题是我事先不知道要限制哪些流程.它们是动态生成的.
也许有办法将一个用户的所有进程限制为一定的CPU百分比?我已经设置了一个用户来执行folding @ home作业,希望我能用/etc/security/limits.conf文件来限制他.但是我能到达的最近的是每个用户的总CPU时间......
如果有一些东西可以让你说:"这个用户的进程的所有CPU%使用量的总和不能超过50%",这将是很酷的.然后让流程争夺50%的CPU优先级......
伙计们,感谢您的建议,但这不是关于优先级 - 即使有足够的CPU时间,我也希望限制CPU%.这些进程已经处于低优先级,因此它们不会导致任何性能问题.
我只想阻止CPU长时间以100%运行......
Dat*_*eek 21
我有一个类似的问题gzip
.
假设我们想要减少gzip
进程的CPU :
gzip backup.tar & sleep 2 & cpulimit --limit 10 -e gzip -z
Run Code Online (Sandbox Code Playgroud)
选项:
sleep
有用,因为cpulimit
有时没有gzip
立即拿起新的过程--limit 10
将gzip
CPU使用率限制为10%-z
进程结束cpulimit
时自动关闭gzip
另一种选择是运行cpulimit
守护进程.
bla*_*999 13
我不记得了,并且不认为在unix调度程序中有这样的东西.您需要一个控制其他进程的小程序,并执行以下操作:
loop
wait for some time tR
send SIGSTOP to the process you want to be scheduled
wait for some time tP
send SIGCONT to the process.
loopEnd
Run Code Online (Sandbox Code Playgroud)
比率tR/tP控制cpu负载.
这是一个小概念证明."忙"是一个耗尽你的cpu时间并且你希望通过"slowDown"减速的程序:
> cat > busy.c:
main() { while (1) {}; }
> cc -o busy busy.c
> busy &
> top
Tasks: 192 total, 3 running, 189 sleeping, 0 stopped, 0 zombie
Cpu(s): 76.9% us, 6.6% sy, 0.0% ni, 11.9% id, 4.5% wa, 0.0% hi, 0.0% si
Mem: 6139696k total, 6114488k used, 25208k free, 115760k buffers
Swap: 9765368k total, 1606096k used, 8159272k free, 2620712k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26539 cg 25 0 2416 292 220 R 90.0 0.0 3:25.79 busy
...
> cat > slowDown
while true; do
kill -s SIGSTOP $1
sleep 0.1
kill -s SIGCONT $1
sleep 0.1
done
> chmod +x slowDown
> slowDown 26539 &
> top
Tasks: 200 total, 4 running, 192 sleeping, 4 stopped, 0 zombie
Cpu(s): 48.5% us, 19.4% sy, 0.0% ni, 20.2% id, 9.8% wa, 0.2% hi, 2.0% si
Mem: 6139696k total, 6115376k used, 24320k free, 96676k buffers
Swap: 9765368k total, 1606096k used, 8159272k free, 2639796k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26539 cg 16 0 2416 292 220 T 49.7 0.0 6:00.98 busy
...
Run Code Online (Sandbox Code Playgroud)
好吧,那个脚本需要更多的工作(例如,要关心INTR-up,并让受控过程继续,以防它在那一刻被停止),但你明白了.我也会在C或类似的地方编写那个小脚本,并从命令行参数计算cpu比率....
问候
我认为在Linux中没有解决方案来限制CPU使用率,但是有一种可接受的方法可以将任何进程限制为某种CPU使用率:http://ubuntuforums.org/showthread.php?t = 992706
如果他们删除信息,这里再次
安装包装
安装cpulimit包.码:
sudo apt-get install cpulimit
安装gawk包.码:
sudo apt-get install gawk
创建CPULIMIT DAEMON文件
使用root权限打开文本编辑器并将bellow守护程序脚本文本保存到新文件/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
Run Code Online (Sandbox Code Playgroud)
CPU_LIMIT如果要将每个进程的CPU消耗省略到任何其他百分比(20%),请在上面的脚本中更改此变量.如果您有SMP计算机(超过1个CPU或CPU超过1个核心),请阅读"如果使用SMP计算机"一章.
DAEMON_INTERVAL如果您想要更多/更少的定期检查,请在上面的脚本中更改此变量.间隔以秒为单位,默认设置为3秒.
BLACK_PROCESS_LIST和WHITE_PROCESSES_LIST变量BLACK_PROCESSES_LIST仅限制指定的进程.如果变量为空(默认),则所有违规过程都是有限的.
变量WHITE_PROCESSES_LIST限制除此变量中定义的进程之外的所有进程.如果变量为空(默认),则所有违规过程都是有限的.
BLACK_PROCESSES_LIST和WHITE_PROCESSES_LIST中的一个或两个变量必须为空 - 定义两个变量是不合逻辑的.
您可以使用分隔符"|"在这两个变量之一中指定多个进程 (没有双引号).示例:如果你想cpulimit除mysql以外的所有进程,firefox和gedit进程设置变量:WHITE_PROCESSES_LIST ="mysql | firefox | gedit"
在开机时间自动启动DAEMON的程序
为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
Run Code Online (Sandbox Code Playgroud)
码:
sudo chown root:root /etc/init.d/cpulimit
Run Code Online (Sandbox Code Playgroud)
码:
sudo chmod 755 /etc/init.d/cpulimit
Run Code Online (Sandbox Code Playgroud)
将脚本添加到启动过程目录:代码:
sudo update-rc.d cpulimit默认值
重新启动以检查脚本是否在引导时启动cpulimit守护程序:代码:
sudo重启
手动检查,停止,启动和重启DAEMON
注意:本教程中的守护进程和服务具有相同的含义.
注意:对于使用Ubuntu 8.10之前的用户(如Ubuntu 8.04 LTS)而不是service命令,请使用"sudo /etc/init.d/cpulimit status/start/stop/restart"语法或使用命令安装sysvconfig包:sudo apt-get安装sysvconfig
检查cpulimit服务是否正在运行检查命令返回:如果服务正在运行,则"cpulimit守护程序正在运行",如果服务未运行,则"cpulimit守护程序未运行".码:
sudo service cpulimit status
Run Code Online (Sandbox Code Playgroud)
启动cpulimit服务您可以手动启动cpulimit守护程序,它将开始省略CPU消耗.码:
sudo service cpulimit start
Run Code Online (Sandbox Code Playgroud)
停止cpulimit服务停止命令会停止cpulimit守护程序(因此不会限制新进程),并且还会设置所有现有的有限进程以完全访问CPU,就像cpulimit未运行之前一样.码:
sudo service cpulimit stop
Run Code Online (Sandbox Code Playgroud)
重新启动cpulimit服务如果更改/usr/bin/cpulimit_daemon.sh中的某些变量设置,如CPU_LIMIT,DAEMON_INTERVAL,BLACK_PROCESSES_LIST或WHITE_PROCESSES_LIST,则在更改设置后必须重新启动服务.码:
sudo service cpulimit restart
Run Code Online (Sandbox Code Playgroud)
没有守护进程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%,因为守护进程必须在3秒的间隔内捕获违规进程(默认情况下在脚本中设置)
我在英特尔双核CPU计算机上测试了这个代码 - 其行为类似于SMP计算机.不要忘记top命令和cpulimit默认情况下在Irix模式下运行,其中20%表示一个CPU的20%.如果有两个CPU(或双核),那么总CPU%可以是200%.在top命令中,可以使用命令I关闭Irix模式(在运行top命令时按+ i)并打开Solaris模式,其中CPU的总量除以CPU的数量,因此%CPU可以不超过100在任何数量的CPU计算机上%.请在顶部手册页中阅读有关top命令的更多信息(搜索I命令).另请阅读cpulimit官方页面中有关cpulimit如何在SMP计算机上运行的更多信息.
但是cpulimit守护进程如何在SMP计算机上运行?始终处于Irix模式.因此,如果您希望在2-CPU计算机上花费20%的CPU功率,那么40%应该用于cpulimit守护程序脚本中的CPU_LIMIT变量.
如果你想摆脱cpulimit守护进程,你可以通过删除cpulimit守护进程并卸载cpulimit程序来清理你的系统.
停止cpulimit守护程序代码:
sudo service cpulimit stop#停止cpulimit守护进程和所有cpulimit进程
从启动过程中删除守护程序代码:
sudo update-rc.d -f cpulimit remove#删除符号链接
删除启动程序代码:
sudo rm /etc/init.d/cpulimit#删除cpulimit启动脚本
删除cpulimit守护程序代码:
sudo rm /usr/bin/cpulimit_daemon.sh#删除cpulimit守护程序脚本
卸载cpulimit程序代码:
sudo apt-get删除cpulimit
卸载gawk程序如果您不需要此程序用于任何其他脚本,则可以远程执行.码:
sudo apt-get删除gawk
关于作者的说明
我刚刚为cpulimit编写了守护进程(上面的bash脚本).我不是cpulimit项目的作者.如果您需要有关cpulimit程序的更多信息,请阅读官方cpulimit网页:http://cpulimit.sourceforge.net/ .
此致,Abcuser
当您可以使用renice调整进程的优先级时,为什么要限制CPU的百分比?使用renice并设置低优先级允许进程仍然使用100%的处理器(如果可用),但任何其他具有更高优先级的进程将在需要时获得该进程,几乎没有明显的延迟.
在使用 的系统中systemd
,您可以使用如下命令运行具有最大 CPU 使用率的单个进程:
sudo systemd-run --scope --uid=1000 -p CPUQuota=20% my_heavy_computation.sh
Run Code Online (Sandbox Code Playgroud)
这将使用多达 20% 的单个 CPU 核心(或 CPU 线程,如果使用超线程)。
我看到至少有两个选择:
归档时间: |
|
查看次数: |
35458 次 |
最近记录: |