Fragen? Antworten! Siehe auch: Alternativlos
Wenn man das nicht explizit ausgeschaltet hat, probiert er es dann nochmal ganz ohne Verzeichnisnamen, d.h. direkt foo/bar.html.gz. Das ist schön flexibel, aber der Worst case sind sechs open-Syscalls.
Um das ein bisschen einzuschränken, probiert gatling www.fefe.de:80 bzw. default per chdir, nicht als Pfadbestandteil von open. Aber da ist immer noch viel Optimierungspotential.
Die offensichtliche Optimierung wäre, dass man einen Cache einführt. Die Dateien nicht immer gleich wieder zumachen und neu öffnen, sondern offen behalten. Das hätte auch gleich den Vorteil, dass wenn fünf Leute die selbe Datei downloaden, dass ich die dann nur einmal öffnen muss, und nur ein Handle ausgeben muss. Der Nachteil wäre, neben der dann nötigen Buchhaltung, dass ich mitkriegen muss, wenn eine der Dateien sich ändert oder weg ist. Und das stellt sich als recht aufwendig heraus.
Das Standard-API unter Unix ist, einfach alle paar Sekunden per stat() nochmal nachzugucken. Unix Linux gibt es ein Spezial-API, mit dem man sich unterrichten lassen kann, wenn sich eine Datei ändert. Das klingt gut, aber es ist nicht das, was ihr euch jetzt intuitiv vorstellen mögt.
Nehmen wir mal an, ich öffne die Datei www.fefe.de:80/foo/bar.html.gz und nutze dieses API, um über Änderungen informiert zu werden. Nehmen wir weiter an, eines der Verzeichnisse in dem Pfad wird umbenannt. Dann würde mir dieses API nicht sagen, dass sich die Datei geändert hat, denn sie hat sich ja nicht geändert. Sie ist nur unter dem Namen nicht mehr ansprechbar. Schlimmer noch: Was, wenn es www.fefe.de:80 nicht gab und gatling daher default genommen hat, und dann legt jemand ein Verzeichnis oder Symlink unter dem Namen an?
Ich müsste also mit dem Spezial-API nicht nur die Datei sondern alle Pfade auf dem Weg überwachen. Das ist ja schon mal echt unschön.
Aber jetzt denken wir mal einen Schritt weiter. Was wenn einer der Pfade ein Symlink ist, und der verweist, sagen wir mal, auf /mnt/platz, und jetzt ändert jemand unter /mnt die Namen, so dass sich das Ziel des Symlinks ändert?
Mir erscheint gerade, dass dieses API zwar in der Theorie schön klingt, aber in der Praxis ungeeignet ist.
Ein Ausweg wäre vielleicht, dass man einfach alle gecacheten Deskriptoren nach 10 Sekunden wegschmeißt. Aber das ist ja iiih-bäh.
Kennt zufällig jemand einen httpd, der so eine Optimierung, wie ich sie mir vorstelle, implementiert hat?
Update: nginx hat so eine Option, und lighttpd hat einen stat()-Cache. Allerdings sind die beide so Heuristiken, die ich gerne vermieden hätte. Vielleicht bin ich da unrealistisch, aber mein Anspruch an ein modernes Betriebssystem von 2016 wäre, dass man da ohne so Gammel-Heuristiken und „na ich liefer doch aber höchstens 10 Sekunden lang was falsches aus“ arbeiten kann.