web-dev-qa-db-ja.com

cpulimitがプロセスを停止させるのはなぜですか?

Networkxパッケージを使用してグラフ上でいくつかのアルゴリズムを実行するpythonスクリプトを実行しています。

スクリプトは

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使用率を制限したいと思います。

このプロセスでCPU制限を使用して、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
2
lily

これは予想される動作です。

cpulimitは、CPUリソースを大量に消費するとプロセスを一時停止し、一定時間後にプロセスを再開します。

また、スクリプトが入力を待っているかどうかを確認しますか?その場合、スクリプトも停止状態になります。

Stdinをリダイレクトして、cpulimitを再度実行してください(例:python run.py < /dev/null &

2
daisy

マンページから:

cpulimitは、常にSIGSTOPおよびSIGCONTシグナルをプロセスに送信して、プロセスを制御できることを確認し、プロセスが消費するCPUの平均量を制限します。これにより、ジョブが停止したことを示す誤解を招く(迷惑な)ジョブ制御メッセージが表示される可能性があります(実際には停止したが、すぐに再開された)。これにより、SIGSTOP/SIGCONTを検出または依存するインタラクティブシェルで問題が発生する可能性もあります。たとえば、ジョブをフォアグラウンドに配置して、すぐに停止してバックグラウンドで再開したことを確認できます。

ソース: http://manpages.ubuntu.com/manpages/xenial/man1/cpulimit.1.html

→つまり、プロセスはバックグラウンドで実行され続けますが、シェルが接続されていないということは、シェルに問題があることを意味します。

達成したいことに応じて、出力に依存している場合は出力をファイルにリダイレクトするか、インタラクティブセッションが必要な場合はシェルを再接続できます。

0
Carl Ambroselli