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

我有以下问题:一些dynamic生成的进程倾向于占用100%的CPU。 我想限制所有进程匹配一些标准(例如进程名称)到一定数量的CPU百分比。

我试图解决的具体问题是利用folding @ home工作进程。 我能想到的最好的解决scheme是定期执行的perl脚本,并使用cpulimit实用程序来限制进程(如果您对更多细节感兴趣,请查看此博客文章 )。 它的工作,但它是一个黑客:/

有任何想法吗? 我想离开处理的操作系统:)


再次感谢您的build议,但我们仍然错过了这一点:)

“slowDown”解决scheme本质上就是“cpulimit”工具。 我仍然需要关注哪些进程要放慢速度,一旦完成工作进程就杀掉“slowDown”进程,并为新的进程启动新进程。 这正是我用Perl脚本和cron作业所做的。

主要的问题是,我不知道什么stream程限制。 它们是dynamic生成的。

也许有办法将一个用户的所有进程限制在一定数量的CPU百分比? 我已经设置了一个用户来执行folding @ home作业,希望能够限制他/etc/security/limits.conf文件。 但最近我可以得到的是每个用户的总CPU时间…

如果有一些东西可以让你说:“这个用户进程的所有CPU使用率的总和不能超过50%”,这将是很酷的。 然后让这些进程为这个50%的CPU争取他们的优先权。


伙计们,感谢您的build议,但这不是关于优先事项 – 即使有足够的CPU时间,我也想限制CPU%。 这些进程的优先级已经很低,所以不会导致任何性能问题。

我只想阻止CPU长时间运行100%…

Solutions Collecting From Web of "将某些进程限制为CPU% – Linux"

我有一个类似gzip问题。

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

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

选项:

  • 我发现sleep很有用,因为cpulimit有时并没有立即拿起新的gzip程序
  • --limit 10限制gzip CPU使用率到10%
  • -zgzip进程结束时自动关闭cpulimit

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

我不记得,也不认为在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负载。


这是一个概念证明。 “busy”是一个耗尽你的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 ... 

好的,那个脚本需要做更多的工作(例如,为了照顾被介入,让被控制的过程继续下去,以防在那个时候停止),但是你明白了。 我也会用C或类似的语言编写这个小脚本,并从一个命令行参数中计算出CPU的比率。

问候

我认为在Linux中没有办法限制CPU的使用,但有一个可接受的方式来限制任何进程到某个CPU使用率: http : //ubuntuforums.org/showthread.php?t=992706

如果他们删除信息,这里再次


  1. 安装软件包

  2. 安装cpulimit软件包。 码:

    sudo apt-get install cpulimit

  3. 安装gawk软件包。 码:

    sudo apt-get install gawk

  4. 创建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 
  1. 根据您的环境需求改变变量

CPU_LIMIT如果您想要将每个进程的CPU消耗降低到20%的任何其他百分比,请在上面的脚本中更改此变量。 如果您有SMP计算机(请注意1个CPU或1个以上CPU的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进程设置变量:WHITE_PROCESSES_LIST =“mysql | firefox | gedit”

  1. 在开机时自动启动DAEMON的程序

  2. 为root用户设置文件权限:代码:

    sudo chmod 755 /usr/bin/cpulimit_daemon.sh

  3. 使用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 
  1. 将文件的所有者更改为root:

码:

 sudo chown root:root /etc/init.d/cpulimit 
  1. 更改权限:

码:

 sudo chmod 755 /etc/init.d/cpulimit 
  1. 添加脚本启动程序目录:代码:

    sudo update-rc.d cpulimit默认值

  2. 重新启动以检查脚本是否在启动时启动cpulimit守护进程:代码:

    sudo重启

  3. 手动检查,停止,启动和重新启动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 
  1. 使用或不使用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秒的时间间隔内触发违例进程(默认情况下,在脚本中设置)

  1. 如果使用SMP计算机

我已经在英特尔双核CPU电脑上测试过这个代码,就像SMP电脑一样。 不要忘记,顶级命令,默认情况下cpulimit行为在Irix模式,其中20%意味着一个CPU的20%。 如果有两个CPU(或双核),那么总CPU百分比可以是200%。 在最高命令Irix模式下,可以用命令I(在top命令运行时按+ i)和Solaris模式打开,CPU的总数除以CPU的数量,所以%CPU不能超过100 %在任何数量的CPU电脑上。 请在顶部手册页(查找I命令)中阅读关于top命令的更多信息。 请在cpulimit官方页面阅读更多有关cpulimit如何在SMP计算机上运行的信息。

但是cpulimit守护进程如何在SMP计算机上运行? 始终处于Irix模式。 所以如果你想在2-CPU计算机上花费20%的CPU功率,那么应该在cpulimit守护进程脚本中使用CPU_LIMIT变量的40%。

  1. 卸载CPULIMIT DAEMON和CPULIMIT程序

如果你想摆脱cpulimit守护进程,你可以通过删除cpulimit守护进程和卸载cpulimit程序来清理你的系统。

  1. 停止cpulimit守护进程代码:

    sudo service cpulimit stop#停止cpulimit守护进程和所有的cpulimit进程

  2. 从引导过程中删除守护进程代码:

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

  3. 删除启动程序代码:

    sudo rm /etc/init.d/cpulimit#删除cpulimit启动脚本

  4. 删除cpulimit守护进程代码:

    sudo rm /usr/bin/cpulimit_daemon.sh#删除cpulimit守护进程脚本

  5. 卸载cpulimit程序代码:

    sudo apt-get删除cpulimit

  6. 卸载gawk程序如果你不需要这个程序的任何其他脚本,你可以远程它。 码:

    sudo apt-get删除gawk

  7. 关于作者的笔记

我刚刚为cpulimit(上面的bash脚本)编写了守护进程。 我不是cpulimit项目的作者。 如果您需要更多关于cpulimit程序的信息,请阅读官方的cpulimit网页: http ://cpulimit.sourceforge.net/。

问候,Abcuser

为什么限制CPU的百分比,你可以用renice调整进程的优先级? 使用renice并设置较低的优先级允许进程在处理器可用时仍使用100%的处理器,但是任何其他具有较高优先级的进程都将在需要时得到进程,而几乎没有明显的滞后。

我有一个类似的问题,线程中提出的其他解决方案根本没有解决它。 我的解决方案现在适用于我,但是它并不是最理想的,特别是在进程属于root的情况下。
我现在的解决方法是非常努力地确保我没有任何由root拥有的长时间运行的进程(就像只有用户一样才能进行备份)

我刚刚安装了gnome的硬件传感器小程序,并在CPU上设置了高低温报警,然后为每个报警设置了以下命令:

低:

 mv /tmp/hogs.txt /tmp/hogs.txt.$$ && cat /tmp/hogs.txt.$$ | xargs -n1 kill -CONT 

高:

 touch /tmp/hogs.txt && ps -eo pcpu,pid | sort -n -r | head -1 | gawk '{ print $2 }' >> /tmp/hogs.txt && xargs -n1 kill -STOP < /tmp/hogs.txt 

好消息是我的电脑不再过热和崩溃。 缺点是当终端进程停止时终端进程与终端断开连接,并在获得CONT信号时不重新连接。 另一件事是,如果这是一个导致过热的交互式程序(比如某个网页浏览器插件!),那么它将在我等待CPU冷却的时候冻结。 在全球范围内对CPU进行缩放处理会更好,但是问题是我的CPU上只有两个可选择的设置,慢速设置的速度不足以防止过热。

只是为了重新在这里重复,这与进程优先级,重新启动没有任何关系,显然与停止长时间运行的作业无关。 这与防止CPU利用率保持100%的时间太长有关,因为在满负荷运行时,硬件无法足够快地散发热量(空闲的CPU产生的热量比满载的CPU要少)。

其他一些可能的帮助是:

在BIOS中整体降低CPU速度

更换散热片或重新涂上热凝胶,看看是否有帮助

用一些压缩空气清洁散热器

更换CPU风扇

注意:当我禁用BIOS中的可变风扇速度(asus p5q pro turbo)时,100%的CPU不会再过热。 在CPU完全加载的情况下,每个内核的最高温度为49摄氏度。

我还需要限制某些进程的CPU时间。 Cpulimit是一个很好的工具,但我总是不得不手动找到PID并手动启动cpulimit,所以我想要更方便的东西。

我想出了这个bash脚本:

 #!/bin/bash function lp { ps aux | grep $1 | termsql "select COL1 from tbl" > /tmp/tmpfile while read line do TEST=`ps aux | grep "cpulimit -p $line" | wc -l` [[ $TEST -eq "2" ]] && continue #cpulimit is already running on this process cpulimit -p $line -l $2 done < /tmp/tmpfile } while true do lp gnome-terminal 5 lp system-journal 5 sleep 10 done 

此示例将每个gnome-terminal实例的cpu时间限制为5%,并将每个system-journal实例的cpu时间限制为5%。

在这个例子中,我使用了另一个我创建的名为termsql的脚本来提取PID。 你可以在这里得到它: https : //gitorious.org/termsql/termsql/source/master :

我看到至少有两个选择:

  • 在创建进程的shell中使用“ulimit -t”
  • 在流程创建时使用“nice”或在运行时使用“renice”

PS + GREP + NICE

在那里投入一些睡眠呼叫应该强制CPU停留一段时间。 如果你每分钟睡一次30秒,那么你的进程在那一分钟内的平均CPU使用率应该不会超过50%。

使用cgroups的cpu.shares没有任何好的价值不会做。 这听起来像你想要实际上扼杀过程,这一定可以完成。

您将需要使用一两个脚本,并/或编辑/etc/cgconfig.conf来定义所需的参数。

具体而言,您要编辑值cpu.cfs_period_uscpu.cfs_quota_us 。 然后该进程将被允许以每cpu.cfs_period_us微秒运行cpu.cfs_quota_us微秒。

例如:

如果cpu.cfs_period_us = 50000cpu.cfs_quota_us = 10000,那么无论发生什么事情,进程都会收到最多20%的CPU时间。

在这个屏幕截图中,我给出了CPU时间的2%

2%的CPU时间

就过程而言,它是以100%运行的。

另一方面,设置cpu.shares可以并且仍将使用100%的空闲CPU时间。

在这个类似的例子中,我给了进程cpu.shares = 100 (1024):

cpu.shares

正如你所看到的,这个过程仍然消耗着所有闲置的CPU时间。

参考文献:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups html的

你可以用cgroups限制cpu的时间。 操作系统将处理资源管理就像你问你的问题。

这里是一个wiki的例子: https : //wiki.archlinux.org/index.php/Cgroups

由于已经作为单独用户限制所有用户进程的进程应该是最简单的解决方案。

nice命令可能会有所帮助。

这可以使用setrlimit(2)来完成(具体通过设置RLIMIT_CPU参数)。

你可以缩小CPU频率。 那么你不必担心个别的过程。 当你需要更多的CPU时,请将频率调高。

我真的不明白你为什么要限制CPU时间…你应该限制该机器上的总负载,而负载主要由IO操作决定。 例如:如果我创建一个while(1){}循环,它将得到1.0的总负载,但如果这个循环做了一些磁盘写入负载跳转到2.0 … 4.0。 这就是杀死你的机器,而不是CPU使用率。 CPU使用率可以通过nice / renice轻松处理。

无论如何,你可以创建一个脚本,当负载变得太高的时候,为特定的PID执行一个“kill -SIGSTOP PID”,当一切恢复正常时,将会终止-SIGCONT … PID的确定可以通过使用' px aux'命令,因为我看到它显示CPU使用率,您应该可以使用该列对列表进行排序。 我认为这一切都可以在bash中完成