Kürzlich hatten wir häufige Programm-Abbrüche von einigen Java-Client Programmen. Im Java Stack-Trace war folgendes zu finden:
[STACK] Caused by: java.io.IOException: Premature EOF [STACK] at sun.net.www.http.ChunkedInputStream.readAheadBlocking(Unknown Source) [STACK] at sun.net.www.http.ChunkedInputStream.readAhead(Unknown Source) [STACK] at sun.net.www.http.ChunkedInputStream.read(Unknown Source) [STACK] at java.io.FilterInputStream.read(Unknown Source)
Das Problem tritt in der Klasse ChunkedInputStream in der Methode readAheadBlocking auf. Im Source Code der Methode findet man:
558 /** 559 * If we hit EOF it means there's a problem as we should never 560 * attempt to read once the last chunk and trailers have been 561 * received. 562 */ 563 if (nread < 0) { 564 error = true; 565 throw new IOException("Premature EOF"); 566 }
Der Wert nread wird kleiner 0, wenn das Ende des Datenstroms erreicht ist. Dies kann auch passieren wenn die Gegenseite die Verbindung unerwartet schließt.
Die Serverseite war in diesem Fall ein AIX-System (AIX 7.1 TL5 SP3). Eine Überprüfung der TCP-Verbindungen auf Abbrüche (Drops) mittels netstat ergab:
$ netstat -p tcp | grep drop 361936 connections closed (including 41720 drops) 74718 embryonic connections dropped 0 connections dropped by rexmit timeout 0 connections dropped due to persist timeout 0 connections dropped by keepalive 0 packets dropped due to memory allocation failure 0 Connections dropped due to bad ACKs 0 Connections dropped due to duplicate SYN packets 1438 connections dropped due to max assembly queue depth $
Demnach gab es 1438 Verbindungsabbrüche wegen Erreichen der maximalen TCP Assembly Queue Tiefe (max assembly queue depth). Die Queue Tiefe wird über den neuen Kernel Parameter tcp_maxqueuelen konfiguriert, der als Fix für den CVE-2018-6922 eingeführt wurde (siehe: The CVE-2018-6922 fix (FreeBSD vulnerability) and scp) . Der Defaultwert ist 1000. Bei größeren Paket-Laufzeiten kann es zum Überlauf der Queue kommen.
Nach einer Erhöhung des Kernel-Parameters tcp_maxqueuelen sind keine Verbindungsabbrüche mehr aufgetreten.