Node.JSプロセスはcpulimitによって検出されません。

Node.JSプロセスはcpulimitによって検出されません。

次のコマンドを使用して、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実行すると、警告なしにスクリプトが早期に終了する可能性があります。nodejscpulimitnodejs

アップデート2:コンソール/ターミナルはnodejsプロセスが停止しているとマークされていますが、実際にはnodejsはまだバックグラウンドで実行されています。

関連情報