Linux-Duplikate und zusätzliche Prozesse in ps-Ausgabe

655
Nathan

Ich verwende den Linux- psBefehl, um die RSS-Größe der Prozesse in einem Docker-Container zu überwachen. Wenn die Gesamt-RSS einen Schwellenwert überschreitet, schließe ich die Tests ab und suche nach Speicherregressionen.

Hier ist die gesamte psAusgabe aus einem Docker-Container.

 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] 

Der Java-Prozess (pid: 357) erstellt kurzlebige untergeordnete Prozesse. In der obigen Ausgabe sehen Sie 2 dstat Python-Prozesse, ps, ls und [NDR-347] ". Diese wurden alle vom Java-Prozess erstellt.

Manchmal sehe ich einen doppelten untergeordneten Prozess (dh denselben Befehl), aber eine andere Prozess-ID (nicht gezeigt). Warum sehe ich einen doppelten untergeordneten Prozess? Ich denke, das ist eine Art Linux- oder Docker-Artefakt. Was ist das Artefakt?

Seit psüber einem Jahr überwache ich die Ausgabe. Zum ersten Mal sehe ich einen zusätzlichen Prozess "[NDR-347]" (pid: 1333) mit fast der gleichen RSS. Der Java-Prozess (pid: 357) nennt die Threads "NDR- #", daher finde ich es merkwürdig, dass der Befehl eines untergeordneten Prozesses der Name eines Threads aus dem Java-Prozess sein würde. Der zusätzliche Vorgang verdoppelt das RSS und löst ein Problem aus. Das Problem ist nicht reproduzierbar. Dies deutet darauf hin, dass PID 1333 sehr kurzlebig ist und nicht gefangen wird ps. Die Gesamt-RSS beträgt 12,07 GB und ohne den zusätzlichen Prozess 6,07 GB. Was ist dieser zusätzliche Prozess? Warum hat es so eine riesige RSS?

Edit: Der genaue psBefehl ist ...

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

1 Antwort auf die Frage

1
RalfFriedl

Sie haben einen Java-Prozess, der andere Programme ausführt.

Wie bei jedem anderen Prozess, der ein anderes Programm ausführen möchte, ist der erste Schritt der fork. Dieser gegabelte Prozess erbt die Speicherkarte des übergeordneten Elements. Dieser Speicher wird gemeinsam genutzt, daher wird kein zusätzlicher Arbeitsspeicher benötigt.

Der nächste Schritt forkist execveder neue Prozess. Der execvegibt den gesamten Speicher frei und ordnet den Speicher aus dem neuen Programm zu.

Normalerweise execvefolgt das sehr bald nach dem fork, daher ist es unwahrscheinlich, dass Sie einen Prozess in diesem Zustand abfangen, aber gelegentlich wird dies geschehen.

Wenn Sie wissen, dass die verzweigten Java-Prozesse den Namen enthalten NDR-, sollten Sie diese Prozesse in Ihrem speziellen Fall einfach ignorieren.

Vielen Dank! Ich habe bereits die Codeänderungen vorgenommen, um diesen Vorgang zu ignorieren. Auf einer stark belasteten Maschine kann sich die Zeit zwischen "Fork" und "Execve" verlängern. Dies kann der Fall sein, wenn ich dies eher sehe. Nathan vor 5 Jahren 0