Der Kontext: Ich arbeite an einem Java-basierten Netzwerk-Server, der versehentlich Rohre leckt. Alle paar Tage erreicht es sein Limit von 40.000 Dateideskriptoren und stirbt. Mit lsof
auf dem Server vor dem Tod zeigt es mit Rohren erstickt ist. Die Rohre verbinden sich mit sich selbst und nicht mit einem anderen Prozess.Aufzeichnung der Java-Stack-Trace bei einem bestimmten Systemaufruf?
Kein Teil der Codebasis erstellt oder verwendet Rohre - das können wir sehen.
Einige ältere Version der JVM haben erstellt & durchgesickert ein Rohr beim Erstellen eines Sockels, jedoch zeigt dies auf Java 1.7.0_75, die ich glaube, dass nicht diesen Bug leiden.
Meine Frage ist: die moderne Toolchain Linux verwenden (wie perf) ist es möglich, den Prozess Snapshot, wenn es die pipe(2)
Systemaufruf ruft - die meiner Meinung nach ist die einzige Möglichkeit, Rohre erzeugt werden. Ist es außerdem möglich, einen Java-Stack-Trace von diesem zu erhalten?
Angesichts dieser Informationen sollte es möglich sein, die Frage zu beantworten "Wer schafft Rohre, und warum?"
Ich schlage vor, Sie sind undicht 'Selectors'. – EJP
Verwenden Sie LD_PRELOAD, um "pipe" durch eine eigene Funktion zu ersetzen. – Nykakin
@EJP - eine faszinierende Idee. Wie könnten Sie daraus eine konkrete Diagnose machen? –