为什么 cpulimit 使进程停止?

为什么 cpulimit 使进程停止?

我正在运行一个 python 脚本,它使用 networkx 包在图上运行一些算法。

脚本是

import networkx as nx
from networkx.algorithms.approximation import clique

G = nx.read_adjlist("newman_one_mode.adj")
print "the number of nodes in the graph is: " + str(G.number_of_nodes())
max_clique_nodes = clique.max_clique(G)
print "the clique nodes are: " + str(max_clique_nodes)

它需要很长时间并且CPU使用率很高(99%),所以我想限制它的CPU使用率。

我在此进程上使用 cpulimit 将 cpu 使用率限制为 60%

cpulimit -p 29780 -l 60

但是,当我使用它时,该过程被停止,如下所示

[lily@geland academic]$ python run.py
the number of nodes in the graph is: 16264

[1]+  Stopped                 python run.py

出了什么问题以及如何处理这种情况?谢谢!

侧面信息: 如果我不运行cpulimit,进程会运行很长时间然后被杀死,我不知道为什么,也许是因为资源被耗尽。

[lily@geland academic]$ python run.py
the number of nodes in the graph is: 16264
[1]+  Terminated              python run.py
Killed

答案1

这是预期的行为。

cpulimit 在进程消耗过多 CPU 资源时暂停该进程,并在一定时间后恢复该进程。

还要检查您的脚本是否正在等待输入?如果是这样,您的脚本也将进入停止状态。

尝试重定向 stdin 并再次运行 cpulimit,例如python run.py < /dev/null &

答案2

你可能会更好好的因为这种方式cpulimit有点 hack,并且可能与 shell 作业控制和其他机制配合不佳。

由于nice这是操作系统改变调度优先级的功能,因此这比cpulimit允许进程以所需的速度运行直到超过一定百分比,然后收到 SIGSTOP 信号,然后进入睡眠状态要平滑得多。 ,和一个信号控制。

举一个简单的例子,考虑这个“将一堆零复制到无处可去”的 shell 脚本:

$ cat waster
#!/bin/sh
dd if=/dev/zero of=/dev/null count=${1}000000

$ time ./waster 5     # takes about 3.7 seconds on my machine
$ time ./waster 10    # takes about 7.4 seconds, no surprise

现在同时运行它们:

$ time ./waster 5 & time ./waster 10 &

它们需要 7.1 秒和 11.1 秒,因为它们正在争夺 CPU。但如果我添加nice

$ time ./waster 5 & time nice -n 19 ./waster 10 &

那么第一个需要大约 4.0 秒,而“nice”需要 12.9 秒,因为“nice”采用尽可能低的优先级,从而使第一个能够占用尽可能多的 CPU 资源。并且任何进程都不会停止。

答案3

从联机帮助页:

cpulimit 始终向进程发送 SIGSTOP 和 SIGCONT 信号,以验证它是否可以控制该进程并限制其消耗的平均 CPU 量。这可能会导致误导性(烦人的)作业控制消息,表明作业已停止(实际上已停止,但立即重新启动)。这还可能导致检测或依赖于 SIGSTOP/SIGCONT 的交互式 shell 出现问题。例如,您可能将一个作业放在前台,却发现它立即停止并在后台重新启动。

来源:http://manpages.ubuntu.com/manpages/xenial/man1/cpulimit.1.html

→ 这意味着您的 shell 存在问题,该进程继续在后台运行,但您的 shell 未附加。

根据您想要实现的目标,如果您依赖于输出,您可以将输出重定向到文件,或者如果您需要交互式会话,则可以重新附加 shell。

相关内容