Hallo CK,
...
Tut mir leid, hier habe ich Quark erzählt.
Mach Dir nix draus. Passiert mir auch immer wieder. :-)
Wie auch immer, es lohnt sich trotzdem, den Apachen abzuspecken, da auch der Speicher der
Module mitkopiert werden muss. Auch wenn das on demand passiert, es muss geschehen.
Sind die Module eigentlich quasi mit einkompiliert oder werden sie on-demand geladen? Im letzteren Fall würde durch zusätzliche Module beim forken kein Overhead entstehen.
Korrekt. fork() gibt für den Kind-Prozess 0 zurück und die PID für den Eltern-Prozess.
Gut zu wissen. Falls man mal doch damit programmiert.
Der Overhead für den Stackframe sollte nicht allzu viel sein. Und Resourcen wie
DB-Verbindungen sind ohnehin Prozessgebunden und werden beim fork nicht dupliziert.
Klar werden sie. Es wird eine exakte, 100%ige Kopie von dem Prozess angelegt. Deshalb
sollte man mit offenen DB-Handles oder ähnlichem auch nicht fork()en, es wird ein- und
dieselbe Verbindung benutzt in dem Fall.
Ich würde sagen auch das ist so formuliert falsch.
Ne.
Na jetzt bin ich ja mal gespannt ...
Eher (so denk ich mir) ist es so, daß es ein httpd-Vaterprozess gibt der Anfragen
entgegen nimmt und für diese zunächst ein eigenen Kindprozess erzeugt (sofern kein
freier Kindprozess zur Verfügung steht) der diese Anfrage dann erst bearbeitet und die
Antwort an den Browser zurückgibt.Jo. Und wo habe ich etwas anderes behauptet? ;-)
Ok. Direkt behauptet hast Du es nicht.
Die fork() wird also immer von diesem (keine Resourcen belegenden) Vaterprozess gemacht
Falsch. Der Vaterprozess hat alle Module geladen, die Konfiguration geparsed, etc, pp.
Das ist halt die Frage ob der Apache wirklich alle Module beim Start lädt oder erst on-demand. Den Apache-Quellcode habe ich dummerweise gerade nicht zur Hand. :-)
und nicht von einem laufenden Kindprozess der evtl. schon eine DB-Verbindung offen hat.
Was hat das eine mit dem anderen zu tun? Du hast gesagt, eine DB-Verbindung wird durch
fork() nicht kopiert. Ich habe gesagt, das ist falsch, sie wird durchaus kopiert. Nun
erzählst du mir, dass der Apache-Main-Prozess keine DB-Handels offen hat. Äh, ja, und?
Das war offenbar ein Missverständnis bzw. wir haben etwas aneinander vorbeigeredet.
Also nochmal:
Wenn Du ein Prozess forkst, der ein DB-Handle offen hat so hat der neue Prozess diesen Handle natürlich auch.
Ich habe aber behauptet, daß der Apache aber nicht so vorgeht sondern DB-Handles und andere Resourcen immer von Kindprozessen des httpd geöffnet werden wärend der Vaterprozess von dem die forks erzeugt werden natürlich keine offnen Handles hat. Dementsprechend hat der Apache auch kein Problem mit Resourcen (wie DB-Handles) beim forken.
Jetzt klar?
Alles in Hinblick auf die Ausgangsdiskussion in der es darum ging ob sich ein dedizierter Apache lohnt (weil beim forken zuviel Overhead entsteht) oder nicht. Und ich war eben der Meinung so groß ist der Resourcenverbrauch nicht als das sich ein abgespeckter Apache lohnt.
Mehr Klarheit würde bringen, wenn man wüßte ob Module on-demand geladen werden oder nicht. Das sie als eigene Dateien vorliegen spricht dafür. Die Art wie sich eingebunden werden dagegen. Wie ist das Ganze denn nun?
Gruß
MichaelB