当前位置:  开发笔记 > 编程语言 > 正文

将某些进程限制为CPU% - Linux

如何解决《将某些进程限制为CPU%-Linux》经验,为你挑选了4个好方法。

我有以下问题:动态生成的某些进程有吃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%运行......



1> Datageek..:

我有一个类似的问题gzip.

假设我们想要减少gzip进程的CPU :

    gzip backup.tar & sleep 2 & cpulimit --limit 10 -e gzip -z

选项:

我发现sleep有用,因为cpulimit有时没有gzip立即拿起新的过程

--limit 10gzipCPU使用率限制为10%

-z进程结束cpulimit时自动关闭gzip

另一种选择是运行cpulimit守护进程.



2> blabla999..:

我不记得了,并且不认为在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

比率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
...

好吧,那个脚本需要更多的工作(例如,要关心INTR-up,并让受控过程继续,以防它在那一刻被停止),但你明白了.我也会在C或类似的地方编写那个小脚本,并从命令行参数计算cpu比率....

问候



3> elGEoRgE The..:

我认为在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

    改变变量以满足您的环境需求

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

    将文件所有者更改为root:

码:

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

    更改权限:

码:

sudo chmod 755 /etc/init.d/cpulimit

    将脚本添加到启动过程目录:代码:

    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

启动cpulimit服务您可以手动启动cpulimit守护程序,它将开始省略CPU消耗.码:

sudo service cpulimit start

停止cpulimit服务停止命令会停止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 DAEMON检查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%,因为守护进程必须在3秒的间隔内捕获违规进程(默认情况下在脚本中设置)

    如果使用SMP计算机

我在英特尔双核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变量.

    UNINSTALL CPULIMIT DAEMON和CPULIMIT计划

如果你想摆脱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


ulimit不是限制%的解决方案

4> Kibbee..:

当您可以使用renice调整进程的优先级时,为什么要限制CPU的百分比?使用renice并设置低优先级允许进程仍然使用100%的处理器(如果可用),但任何其他具有更高优先级的进程将在需要时获得该进程,几乎没有明显的延迟.


有理由这样做; 例如,他可能想节省电池电量.即使CPU缩放被锁定在最低量,CPU仍将运行得更热,直接使用更多功率并通过提高风扇速度.而且,一些系统没有特别好地设计用于冷却,并且在这些系统上可能发生过热.
此外,出于测试目的,您可能希望了解在使用较少CPU运行时应用程序的行为方式.
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!