次のコマンドを使用して、PythonプロセスがCPUを50%しか使用できないようにすることができました。
cpulimit -l 50 -e python
しかし、Nodeで同じ操作を試みると、プロセスはまったく検出されません。知っている人はいますか?ps aux
見ることができるので、何がnode
欠けているのかわかりません。
cpulimit -l 50 -e node
私が実行しているプラットフォームはUbuntu 14.04ですが、この問題はLinuxバージョンとは関係がないようです。
私の現在の仕事は
cpulimit -l 50 -p $(pidof node)
ただし、これはノードプロセスの新しいインスタンスを検出できないことを意味します。
答え1
cpulimit
私たち全員が知っているように、状況によっては正しく機能しません。時にはうまく機能しますが(単純なシングルスレッドアプリケーションでは)、他の場合(ほとんどのマルチスレッドまたはマルチプロセス)は機能しません。
技術的には、CPUlimitが制限されないようにする2つの問題があります。まず、実行しようとするプログラムは、生成されたスレッドが生成されたスレッドの子ではない方法でスレッドまたはプロセスを生成します。これにはいくつかの理由がありますが、ややまれです。
第二に、SIGSTOPは「処理」できる信号ではありません。しかし、信号は非同期です。したがって、スレッドaは缶フォークスレッドbである。スレッドbが起動すると、スレッドaにSIGSTOPシグナルが発行される可能性がありますが、スレッドbはシグナルなしで開始されます。
SIGSTOPはまた、「可能であれば」プロセスを一時停止します。時には、特にディスクioの場合、スレッドは一時停止されません。私が考えることができる最も一般的なのはディスクIOです。
つまり、SIGSTOP(cpulimitが使用するもの)は1つのスレッドと他のすべてのサブスレッドを停止すると仮定しますが、他のプロセスを開始できる複雑なマルチスレッドアプリケーションで予想どおりに動作するわけではありません。この場合、既存のスケジュール制約を使用すると、より良いサービスを受けることができます。
答え2
@Mark Plotnickのコメントに基づいて、ついに理由を見つけました。
ls -l "/proc/$(pidof node)/exe"
返品
lrwxrwxrwx 1 antony antony 0 Aug 27 13:04 /proc/4414/exe -> /usr/bin/nodejs
だからnode
私は使うべきですnodejs
次のコマンドは有効です
cpulimit -l 50 -e nodejs
アップデート:これは本当に完璧なソリューションではありません。はい、プロセスをcpulimit
検出することができます。ただし、永続スクリプトをnodejs
実行すると、警告なしにスクリプトが早期に終了する可能性があります。nodejs
cpulimit
nodejs
アップデート2:コンソール/ターミナルはnodejsプロセスが停止しているとマークされていますが、実際にはnodejsはまだバックグラウンドで実行されています。