webdevqa.jp.net

ps出力でのLinuxの重複および追加プロセス

Linux psコマンドを使用して、Dockerコンテナー内からプロセスのRSSサイズを監視しています。 RSSの合計がしきい値を超えると、テストに失敗し、メモリのリグレッションを探し始めます。

これは、Dockerコンテナ内からのps出力全体です。

 PID %CPU      RSS Threads COMMAND
   1  0.0     2616       1 sh /test/Build/unittest.sh
   7  3.3    44240       1   /usr/bin/Xvfb :1 -screen 0 ...
  17  1.5    10824       1   /usr/bin/fluxbox
 357  690  6292244     324   Java -server -Xmx2g ...
 490  0.4     7852       1     /usr/bin/python /usr/bin/dstat ...
 491  0.7     7812       1     /usr/bin/python /usr/bin/dstat ...
1331  0.0     3040       1     /usr/bin/ps -AHww --format ...
1332  0.0      380       1     /usr/bin/ls --all ...
1333  0.0  6292248       1     [NDR-347]

Javaプロセス(pid:357)は、短命の子プロセスを作成します。上記の出力では、2つのdstat Pythonプロセス、ps、ls、および[NDR-347] "を確認できます。これらはすべてJavaプロセスによって作成されました。

子プロセスが重複している(つまり、同じコマンド)が、プロセスIDが異なる(表示されていない)場合があります。子プロセスが重複しているのはなぜですか?これはある種のLinuxまたはDockerアーティファクトだと思います。そのアーティファクトは何ですか?

psの出力を1年以上監視しています。初めて、ほぼ同じRSSを持つ追加のプロセス「[NDR-347]」(pid:1333)が表示されます。 Javaプロセス(pid:357)はスレッドに「NDR-#」という名前を付けているので、子プロセスのコマンドがJavaプロセスのスレッドの名前になるのは奇妙だと思います。余分なプロセスはRSSを2倍にし、問題を引き起こします。問題は再現できません。これは、pid 1333が非常に短命であり、psによって捕捉されないことを私に示唆しています。 RSSの合計は12.07GBで、追加のプロセスを除いた場合は6.07GBです。この余分なプロセスは何ですか?なぜこんなに巨大なRSSがあるのですか?

編集:正確なpsコマンドは...

ps -Ahww --format pid,%cpu,rss:8,nlwp=Threads,command
1
Nathan

他のプログラムを実行するJavaプロセスがあります。

別のプログラムを実行したい他のプロセスと同様に、最初のステップはforkです。このフォークされたプロセスは、親のメモリマップを継承します。このメモリは共有されているため、実際には追加のRAMを使用しません。

forkの後の次のステップは、新しいプロセスをexecveすることです。 execveはすべてのメモリを解放し、新しいプログラムからメモリをマップします。

通常、execveforkの直後に続くため、この状態でプロセスをキャッチする可能性はほとんどありませんが、発生する場合があります。

特定のケースでは、フォークされたJavaプロセスにNDR-という名前が含まれていることがわかっている場合は、これらのプロセスを無視する必要があります。

1
RalfFriedl