【问题标题】:Limiting certain processes to CPU % - Linux将某些进程限制为 CPU % - Linux
【发布时间】:2008-12-22 18:21:49
【问题描述】:

我有以下问题:一些动态生成的进程倾向于占用 100% 的 CPU。我想将所有符合某些条件(例如进程名称)的进程限制为一定数量的 CPU 百分比。

我要解决的具体问题是利用 fold@home 工作进程。我能想到的最佳解决方案是定期执行并使用 cpulimit 实用程序来限制进程的 perl 脚本(如果您对更多细节感兴趣,请查看blog post)。它有效,但它是一个黑客:/

有什么想法吗?我想把进程的处理留给操作系统:)


再次感谢您的建议,但我们仍然没有抓住重点:)

“slowDown”解决方案本质上是“cpulimit”实用程序所做的。我仍然必须注意要减慢哪些进程,一旦工作进程完成就终止“slowDown”进程并为新的工作进程启动新进程。这正是我使用 Perl 脚本和 cron 作业所做的。

主要问题是我事先不知道要限制哪些进程。它们是动态生成的。

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

如果有一些东西可以让你说: “此用户进程的所有 CPU % 使用率总和不能超过 50%”。然后让进程根据它们的优先级争夺那 50% 的 CPU...


各位,感谢您的建议,但这与优先级无关 - 即使有足够的可用 CPU 时间,我也想限制 CPU 百分比。这些进程的优先级已经很低,因此不会导致任何性能问题。

我只是想防止 CPU 长时间 100% 运行...

【问题讨论】:

  • 为什么这是一件坏事?如果它们得到适当的处理,它们不应该干扰任何其他过程。他们只会(实际上)得到所有剩余的周期......
  • 阅读博客文章,他似乎希望 CPU 有一些空闲时间,这样它们就不会运行得那么热。这就是我停止使用 SETI@Home 的原因——我的 CPU 没有持续很长时间,因为它们一直很热。
  • 是的,尽管运行 SETI@Home,但我从未因过热而导致 CPU 故障。而且我从来没有使用过比处理器附带的零售 HSF 单元更高级的东西。
  • 也许他在共享主机环境中,想要限制他的 CPU 时间,这样他的帐户就不会被“锁定”
  • 如果他的流程处理得当,他就不应该影响其他人的表现。他的进程只有在其他地方不使用时才会占用 CPU。

标签: linux limit cpu


【解决方案1】:

gzip 有一个稍微类似的问题。

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

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

选项:

  • 我发现 sleep 很有用,因为 cpulimit 有时不会立即启动新的 gzip 进程
  • --limit 10gzip CPU 使用率限制为 10%
  • gzip进程完成时-z自动关闭cpulimit

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

【讨论】:

    【解决方案2】:

    我不记得也不认为在 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
    ...
    

    好的,该脚本需要更多的工作(例如,要注意被 INTR-upted 并让受控进程继续,以防它在那一刻停止),但你明白了。我也会用 C 或类似语言编写那个小脚本,并从命令行参数计算 cpu 比率....

    问候

    【讨论】:

    • cpulimit 命令以这种方式工作。它监控您定义的流程。如果一个进程使用超过限制,它会挂起该进程。 -- 可以在Github查看源码。
    【解决方案3】:

    我认为在 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 守护进程文件

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

    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"

    1. 在引导时自动启动守护进程的过程

    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 守护进程: 代码:

      须藤重启

    3. 手动检查、停止、启动和重新启动守护进程

    注意:本教程中的守护进程和服务具有相同的含义。

    注意:对于使用 Ubuntu 8.10 之前(如 Ubuntu 8.04 LTS)而不是服务命令的用户,请使用“sudo /etc/init.d/cpulimit status/start/stop/restart”语法或使用以下命令安装 sysvconfig 包:sudo apt-get install sysvconfig

    检查 cpulimit 服务是否正在运行 检查命令返回:如果服务正在运行,则返回“cpulimit daemon is running”,如果服务未运行,则返回“cpulimit daemon is not running”。 代码:

    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 守护程序检查 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 秒的间隔捕获违规进程(默认在脚本中设置)

    1. 如果使用 SMP 计算机

    我已经在 Intel 双核 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 变量。

    1. 卸载 CPULIMIT 守护进程和 CPULIMIT 程序

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

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

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

    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 remove gawk

    7. 关于作者的说明

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

    问候, 施虐者

    【讨论】:

    • 有限制使用的解决方案,见:bash -c "help ulimit"
    • 远非健壮,但它有点工作。在我的情况下,如果我使用top,它会弄乱tty,它会说它没有运行,但否则它可以完成工作。非常感谢!
    • ulimit 不是限制%的解决方案
    • 我从未见过如此夸张的东西。使用 cgroup。
    【解决方案4】:

    我遇到了类似的问题,线程中提供的其他解决方案根本没有解决它。我的解决方案现在适用于我,但不是最理想的,特别是对于进程由 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 信号时不会重新连接。另一件事是,如果它是一个导致过热的交互式程序(比如某个 Web 浏览器插件!),那么它会在我正在做的事情中间冻结,同时等待 CPU 冷却。让 CPU 缩放在全局级别处理此问题会更好,但问题是我的 CPU 上只有两个可选设置,并且慢速设置不足以防止过热。

    在这里再次重申一下,这与进程优先级、重新调整完全无关,显然与停止长时间运行的作业无关。这与防止 CPU 利用率长时间保持在 100% 有关,因为硬件在满负荷运行时无法足够快地散热(空闲 CPU 产生的热量比满载 CPU 少)。

    其他一些可能有帮助的明显可能性是:

    在 BIOS 中整体降低 CPU 速度

    更换散热器或重新涂抹导热凝胶,看看是否有帮助

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

    更换CPU风扇

    [编辑] 注意:当我在 BIOS(华硕 p5q pro turbo)中禁用可变风扇速度时,100% CPU 不会再过热。在 CPU 满载时,每个内核的最高温度为 49 摄氏度。

    【讨论】:

      【解决方案5】:

      使用 cgroups 的 cpu.shares 不会做任何 nice 值不会做的事情。听起来您想要实际限制进程,这绝对可以做到。

      您将需要使用一两个脚本,和/或编辑 /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 时间,无论发生什么其他情况。

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

      就进程而言,它以 100% 的速度运行。

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

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

      如您所见,该进程仍在消耗所有空闲的 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

      【讨论】:

        【解决方案6】:

        在使用systemd 的系统中,您可以使用如下命令以最大 CPU 使用率运行单个进程:

            sudo systemd-run --scope --uid=1000 -p CPUQuota=20% my_heavy_computation.sh
        

        这将使用多达 20% 的单个 CPU 内核(或 CPU 线程,如果使用超线程)。

        【讨论】:

        • 谢谢,我很高兴我 11 年前提出的问题仍然得到答案(新的和更好的) - 感觉就像一辈子以前
        【解决方案7】:

        我还需要限制某些进程的 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:

        【讨论】:

        • 您可以使用进程名称而不是每次使用-e 标志来查找PID,例如cpulimit -e [process_name] -l 5
        【解决方案8】:

        您可以使用 cgroups 限制 CPU 时间。操作系统将像您在问题中要求的那样处理资源管理。

        这是一个带有示例的 wiki:https://wiki.archlinux.org/index.php/Cgroups

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

        【讨论】:

          【解决方案9】:

          我看到至少两个选项:

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

          【讨论】:

          • ulimit -t 不是一个好建议,当它的 total 执行时间超过某个阈值时,这将杀死进程,当你只想限制一个时绝对不可取过程。
          【解决方案10】:

          PS + GREP + 不错

          【讨论】:

            【解决方案11】:

            nice 命令可能会有所帮助。

            【讨论】:

            • nice 不控制进程可以使用的 CPU 的最大百分比。 niceness 被转换为进程优先级,而不是 CPU 使用率的百分比
            【解决方案12】:

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

            【讨论】:

            • RLIMIT_CPU 不控制可以使用的 CPU 的最大百分比;它控制进程可以使用的最大秒数。进程在通过软限制时将收到 SIGXCPU 信号,在超过硬限制时将收到 SIGKILL。
            • 那是一个C函数调用。在终端中,您可以使用 ulimit。见bash -c "help ulimit"。它使用 setrlimit
            【解决方案13】:

            在那里抛出一些睡眠调用应该会强制进程在一段时间内离开 CPU。如果您每分钟睡眠 30 秒,那么您的进程在那一分钟内的平均 CPU 使用率不应超过 50%。

            【讨论】:

              【解决方案14】:

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

              无论如何,您可以编写一个脚本,在负载过高时为特定 PID 执行“kill -SIGSTOP PID”,并在一切恢复正常时终止 -SIGCONT... PID 可以通过以下方式确定使用“px aux”命令,因为我看到它显示 CPU 使用率,并且您应该能够使用该列对列表进行排序。我认为这整个事情都可以在 bash 中完成......

              【讨论】:

                【解决方案15】:

                您可以降低 CPU 频率。这样您就不必担心各个流程。当您需要更多 CPU 时,将频率调高。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-10-03
                  • 1970-01-01
                  • 2011-12-02
                  • 1970-01-01
                  • 2018-07-17
                  相关资源
                  最近更新 更多