Thread Wie findet man stack usage des aktuellen Perl-Prozesses heraus ? (17 answers)
Opened by barney at 2024-08-30 18:24

haj
 2024-09-03 18:33
#196692 #196692
User since
2015-01-07
557 Artikel
BenutzerIn

user image
2024-09-03T05:57:34 barney
Ja, und komischerweise macht es einen Unterschied ob man STDOUT und STDERR benutzt. Siehe die Kommentare in meinem Testskript.

Der Unterschied kommt daher, dass Du mit say etwas auf STDOUT schreibst, aber nichts auf STDERR. Versuche es mal mit einer Kombination von warn und say, bei mir führt das dann zu gleichen Lauflängen.

Wenn man das Programm mal in den GDB einspannt, wird es etwas klarer: Das ganze ist eine "deep recursion". Die :encoding-Layer sind tatsächlich Schichten, jeder Aufruf von binmode packt eine neue Schicht drauf. Das verbraucht nicht nur (wenig) Speicher, es wird auch zunehmend langsamer. Der Tod tritt dann beim Abarbeiten der zigtausend Schichten ein, wenn tatsächlich eine Ausgabe stattfindet.

Beim Absturz weist mein GDB eine Stack-Tiefe von 104794 aus, je drei pro Layer (PerlIOBuf_write, PerlIOEncode_flush, Perl_PerlIO_flush), und entspricht damit ziemlich genau den 34924 Iterationen, die Du gefunden hast.

Dass PerlIO in "Schichten" arbeitet, hat ja schon einen gewissen Sinn, aber ich kann mir keinen Anwendungsfall mit tausend Schichten vorstellen... da könnte Perl schon eine Bremse einbauen. Dabei werden möglicherweise noch ein paar Programme auffliegen, die binmode in der I/O-Schleife aufrufen.

View full thread Wie findet man stack usage des aktuellen Perl-Prozesses heraus ?