Hallo Ralph,

Am 16.07.2010 um 11:51 schrieb Ralph Ballier:

> Hallo,
> 
> ich habe zum besseren Testen eine Modelldatei hergestellt, die aus 1024
> Zeilen der Form
> 
> 012345670123456701234567012345670123456701234567012345670123456
> 
> besteht. Dadurch entsteht eine Datei mit genau 65536 Zeichen (die Zeilen
> enden jedesmal bei 6 und nicht 7, weil der Zeilenwechsel \n als eigenes
> Zeichen zählt).
> 
> Rufe ich jetzt
> 
> strace -f -s 200000 -o proto ./httpd
> 
> auf und lade die genannte Datei herunter, so kann ich in proto einigermaßen
> nachvollziehen, was geschieht.
> 
> Nach gut 3000 Zeilen beginnt der Download der Datei.
> Es werden 8192 Zeichen gelesen: 
> 
> read(32, "0123...456\n", 8192) = 8192
> 
> und wieder geschrieben: 
> 
> write(31, "0123...456\n", 8192) = 8192
> 
> Das ganze vollzieht sich in dieser Form siebenmal. Beim achtenmal (dann
> wären ja die 65536 Zeichen vollständig übertragen worden) sieht das Ganze
> ein wenig anders aus:
> 
> read(32, "0123...456\n", 8192) = 8192
> 
> write(31, "0123...456\n", 8192) = 1
> 
> Hier scheint also nur 1 Zeichen geschrieben worden zu sein. Die nachfolgende
> Zeile lautet:
> 
> poll([{fd=31, events=POLLOUT, revents=POLLOUT}], 1, 300000) = 1
> 
> Dann folgen offenbar die noch fehlenden Zeichen:
> 
> write(31, "0123...456\n", 8191) = 8191
> 
> Von ASCII-Nullen ist nichts zu sehen. Aber die übertragene Datei ist fast
> doppelt so lang, weil an ihr reguläres Ende ASCII-Nullen angehängt worden
> sind. wc a65536.pdf liefert
> 
> 1024 1025 122879 a65536.pdf
> 
> Soll ich noch mehr Inhalte der Protokolldatei posten?
> 
> Gruß
> 
> Ralph

Wenn ich Deine Beschreibung des strace-Logfiles richtig verstanden habe, geht 
daraus hervor, dass der Apache zu keinem Zeitpunkt die Nullen schreibt. Sprich, 
er kann dann nichts dafuer. Das Problem ist also an anderer Stelle zu suchen.

Der Apache schreibt korrekte Daten auf den Netzwerksocket, doch der schickt am 
anderen Ende nicht nur das raus, was er vom Apache bekommen hat, sondern mehr 
(eingestreute Nullen). Richtig?

Waehrend strace nachweist, dass die Nullen nicht gesendet werden sollten, 
muesste tcpdump nachweisen koennen, dass sie aber tatsaechlich aus dem anderen 
Ende des Netzwerkstacks rauskommen. (Muss ja. Wenn lynx/wget/curl nicht alle 
kaputt sind.)

Was ist es fuer ein Kernel, welche Version? Was ist sonst noch am 
Netzwerkverkehr beteiligt - irgendwelche Paketfilter?
(Nicht, dass ich auf diese Informationen hin notwendigerweise mit einer Antwort 
dienlich sein kann, aber das sind nun mal die Rahmenbedingungen unter denen der 
Apache laeuft)
Passiert es nur bei bestimmten Netzwerkinterfaces oder auch ueber Localhost?

Du schriebst, dass das Phaenomen von einem Tag auf den anderen auftrat, und nur 
auf Port 80, nicht aber auf Port 81. Zwei Dinge wuerde ich mir als moegliche 
Ursachen denken koennen. Entweder ein Paketfilter, der kaputt ist 
(moeglicherweise nach einer langen Zeit aufhoert korrekt zu arbeiten, nachdem 
irgendein Zaehler uebergelaufen ist), oder ein Kernel, der auf aehnliche Weise 
zu Bruch geht. In beiden Faellen koennte das Problem nach einem Reboot 
"behoben", oder vielmehr verschwunden sein. Und da ist es dann immer schade, 
wenn's weg ist, bevor man es moeglichst genau lokalisiert hat - denn unter 
Umstaenden bekommt man nicht so oft die Chance dazu. 

Peter


--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de"
      unsubscribe-Anfragen an users-de-unsubscr...@httpd.apache.org
           sonstige Anfragen an users-de-h...@httpd.apache.org
--------------------------------------------------------------------------

Antwort per Email an