Einige Fragen - fopen, proftp, Apache-Direktiven, RAM-Nutzung

s24!

Registered User
Guten Abend,

ich bitte den Threadtitel zu entschuldigen - wollte nicht für jede Frage in einem anderen Unterforum einen neuen Thread aufmachen.

1. Kann ich fopen() irgendwie in seiner Funktion pro vHost begrenzen? Mein Problem ist, dass ich z.B. automatisierte Portscans vermeiden will, ohne fopen() komplett abzuschalten. Wie kann man das regeln, wie regeln das große Webhoster?

2. Auf meinem vServer läuft proftpd. Nun habe ich neulich nicht mit Filezilla, sondern mit Nautilus (Dateimanager unter Ubuntu) eine FTP-Verbindung hergestellt und anschließend einen Kopiervorgang von ca. 200 Dateien gestartet. Dieser wurde zunächst langsamer und ging dann gar nicht mehr weiter. top zeigte mir diverse laufende proftpds; Filezilla meldete, dass der FTP nicht erreichbar sein. proftpd ließ sich weder per init.d noch mit killall beenden. Nach zehn Minuten (das ist der eingestellte Timeout in der proftpd.conf) ging's wieder.
Als Workaround habe ich die maximal erlaubten Instanzen etwas hochgestellt sowie den Timeout deutlich heruntergeregelt. Das kann aber alles nicht die Lösung sein - ich würde gerne die Instanzen pro IP oder FTP-User beschränken. Möglich? Wie? :)

3. Inwieweit wirken sich geladene PHP-Module auf die Performance und den RAM-Verbrauch aus?

4. Apache2-Tuning: Ich habe viel über die Direktiven gelesen, dennoch verstehe ich manche Dinge nicht so recht. Ich vermute einfach mal, dass ich den worker MPM verwende (ist doch geläufiger, oder?) und dass daher nur der Kram zwischen <IfModule mpm_worker_module> und dem dementsprechenden </IfModule> dafür relevant ist, richtig? Dort habe ich folgende Einträge:
StartServers: Verstehe ich. Anzahl an Apache2-Prozessen unmittelbar nach dem Starten.
MaxClients: Maximale Anzahl an gleichzeitigen Verbindungen / Anfragen (wo ist der Unterschied? - richtig?
MinSpareThreads: "minimum number of worker threads which are kept spare" - Leerlaufende Threads. Aber was sind nun Prozesse und was Threads?
Und woran sollte man sich beim Einstellen dieser Direktive orientieren?
MaxSpareThreads: Same here. ;)
ThreadsPerChild: Eine konstante Nummer an Threads pro Prozess, okay. Aber: Wie kriegt der Apache eine konstante Anzahl hin, wenn z.B. die Min/MaxSpareThreads deutlich unter den ThreadsPerChild liegen? Zudem: Inwiefern macht hier ein hoher oder niedriger Wert Sinn; wie wirkt sich das aus?
MaxRequestsPerChild: Maximale Anzahl an Anfragen, die ein Prozess verarbeitet, bevor er stirbt - wo liegen hier Vor- und Nachteile bei hohen / niedrigen Werten?

5. Mein vServer hat 2048 MB RAM. Diese sind auch ständig voll, top => "cached" sagt mir aber, dass ein absoluter Großteil gar nicht "wirklich" gebraucht wird, sondern eben als Cache verwendet wird. Zu diesem Sachverhalt folgende Fragen:
- Kann ich das Cache-Verhalten von Linux beeinflussen?
- Warum liegt so viel im Cache? Das ist ein reiner Webserver mit FTP, PHP und MySQL...
- Was wird gecached?
- Kriegt Linux auch z.B. 16 GB RAM schnell "vollgecached" und meine Sorge ist völlig unberechtigt? Sprich, zählt der benutzte RAM abzüglich des Caches deutlich mehr oder sollte man auch mit Cache den RAM nicht vollkriegen? Mein Notebook zu Hause kriegt seine 4 GB RAM defintiv nie voll, cached aber auch viel.


Ich danke im Voraus für jegliche Antwort auf diesen doch recht lang gewordenen Thread! :)



greez
 
Kann ich fopen() irgendwie in seiner Funktion pro vHost begrenzen?
Es gibt mehr als nur fopen. fsockopen, Streams, Sockets, ...
Du kannst URL-Zugriffe verbieten was jedoch auch viele sinnvollen Applikationen aussperrt.

Wie kann man das regeln, wie regeln das große Webhoster?
Die "Grossen" blockieren in aller Regel alle Ports ausser die ueblichen und setzen auf diese eine Rate-Limit sowie teilweise deep-packet inspection.
Du kannst Ports mittels ipTables fuer jeden Benutzer einzeln freigeben (--match-owner) und somit eine sehr eingeschraenkte Grundfunktion (keinerlei externe Abfragen) vorsetzen welche dann bei Bedarf erweitert wird.
Dies setzt jedoch voraus dass PHP mittels suexec oder suphp eingebunden wurde.

ich würde gerne die Instanzen pro IP oder FTP-User beschränken.
Pro IP mit Firewall ;) (Iptables Modul: connlimit)

proftpd ließ sich weder per init.d noch mit killall beenden.
killall -9 (SIGKILL) sollte das Problem beheben.

Inwieweit wirken sich geladene PHP-Module auf die Performance und den RAM-Verbrauch aus?
Da jedes Modul von Festplatte gelesen, geladen und aktiviert werden muss sollten immer nur die benoetigten Module vorgehalten werden und andere bei Bedarf durch eigene php.ini's zugeladen werden. (Respektiv dynamisch vom Skript laden lassen)
Module welche immer benoetigt werden sollten in die PHP-Binary selbst einkompiliert werden was sie zwar unflexibler aber bedeutend performanter macht.
Der RAM-Verbrauch sowie initiale Ladezeit des PHP-Interpreters steigen mit Modulgroesse und -zahl zirka Linear.

Verbindungen / Anfragen (wo ist der Unterschied?
Wenn du keep-alive deaktiviert hast, kein Unterschied. Ansonsten kann eine Verbindung mehrere -zeitlich getrennten- Anfragen beinhalten.

vermute einfach mal, dass ich den worker MPM verwende (ist doch geläufiger, oder?)
In vielen Setups ist prefork Pflicht, somit ist Raten nicht angebracht ;)
"httpd -l" sollte alle geladene Module von Apache anzeigen und unter anderem auch "worker.c" oder "prefork.c".

Aber was sind nun Prozesse und was Threads?
Hier eine Erklaerung: http://www.ijon.de/comp/tutorials/threads/threads.html

Und woran sollte man sich beim Einstellen dieser Direktive orientieren?
Leerlaufende Prozesse verbrauchen RAM und ein wenig CPU ohne zu arbeiten. Wenn man den Wert hoch stellt verliert man somit ein Stueck der moeglichen Maximalleistung, wenn man ihn niedrig einstellt muss der Server bei einer spontanen Steigerung der BEsucherzahl erst die Prozesse erstellen was wiederum die Zeit bis zum Ausliefern der Webseite vergroessert und die Last auf dem Server erhoeht.
Perfekte Standardwerte gibt es nicht, dies haengt unter anderem von deinem System und der Besuchervariation ab.

Wie kriegt der Apache eine konstante Anzahl hin, wenn z.B. die Min/MaxSpareThreads deutlich unter den ThreadsPerChild liegen
Wenn mich meine Erinnerung nicht truegt sollte das letzteres ein Mehrfaches von oder Gleich MinSpareThreads sein.

MaxRequestsPerChild: Maximale Anzahl an Anfragen, die ein Prozess verarbeitet, bevor er stirbt
Bei 0 (unendlich) ist das Risiko eines Memory-leaks und somit dem Volllaufen des Arbeitsspeichers, ausserdem gibt der Prozess RAM nicht oder nur zoegerlich wieder frei.
Der Wert sollte hoch genug sein um staendigen Overhead wegen Prozesserstellung zu vermeiden und niedrig genug um das Risiko der oben genannten Probleme zu vermeiden, zb 10000

Kann ich das Cache-Verhalten von Linux beeinflussen?
Durch Kernel-Patches schon. Allerdings musst du dann den Kernel wechseln.
Wozu aber willst du? Linux gibt die RAM wieder frei sobald ein Prozess sie braucht. Da RAM viel schneller ist als Festplatte und es keinen Unterschied macht op RAM "voll" oder "leer" ist, kann er doch seinen Cache gerne fuellen.

Warum liegt so viel im Cache? Das ist ein reiner Webserver mit FTP, PHP und MySQL...
Jede einzelne abgerufene Datei des Systems wird gecached. Und "nur" ist gut gesagt, Apache, PHP und MySQL sind weder im RAM-, CPU- noch in dem I/O-Verbrauch zimperlich.

Mein Notebook zu Hause kriegt seine 4 GB RAM defintiv nie voll, cached aber auch viel.
Ist dein Notebook auf Windows, Linux, BSD? Windows cached bedeutend weniger als Linux (und anders), wenn da die RAM voll ist, ist sie es auch.
Ich habe weder auf einem 16GB RAM Rootserver noch auf meinem Schlepptop zuhause Probleme die RAM mit caching 'voll laufen' zu lassen...
 
Hey d4f,
danke für deine ausführliche Antwort!

Die fopen-Sache werde ich dann bestimmt hinkriegen - ich weiß ja jetzt im Groben, wie's geht. Werde mich diesbezüglich bei Problemen melden. :)

Pro IP mit Firewall (Iptables Modul: connlimit)
Also kann proftpd das nicht von Haus aus? Das stellt doch irgendwie eine Lücke bzw. ein Problem dar, wenn man damit einen FTP-Server kurzfristig killen kann, oder? :/

killall -9 (SIGKILL) sollte das Problem beheben.
Jop, klar. Das hatte ich gar nicht erst angetestet, da nach zehn Minuten ja eh alles wieder lief. :)

Module welche immer benoetigt werden sollten in die PHP-Binary selbst einkompiliert werden was sie zwar unflexibler aber bedeutend performanter macht.
Okay, daran könnte ich mich beizeiten mal versuchen. :)
Frage: Geht das mit Apache-Modulen ähnlich, oder können die nicht einkompiliert werden?

Wenn du keep-alive deaktiviert hast, kein Unterschied. Ansonsten kann eine Verbindung mehrere -zeitlich getrennten- Anfragen beinhalten.
Okay, KeepAlive ist bei mir an. Begrenzt MaxClients in diesem Fall die Anfragen oder die Verbindungen?

"httpd -l" sollte alle geladene Module von Apache anzeigen und unter anderem auch "worker.c" oder "prefork.c".
Hoppla. Da rennt tatsächlich prefork. :D Hat der Nachteile gegenüber dem worker?
Und: der Kram zwischen<IfModule mpm_worker_module> und </IfModule> wird demnach gar nicht beachtet, richtig?

Okay, so viel wusste ich natürlich schon. Dachte, das wäre beim Apache irgendwie was anderes.

Da RAM viel schneller ist als Festplatte und es keinen Unterschied macht op RAM "voll" oder "leer" ist, kann er doch seinen Cache gerne fuellen.
Danke, da vertrau ich einfach mal dem Linux-Kernel. :D

Ist dein Notebook auf Windows, Linux, BSD?
Linux. Habe 4 GB RAM und benutze normalerweise nicht mehr als 2,5 GB - davon 1-2 GB Cache.


greez
 
Das stellt doch irgendwie eine Lücke bzw. ein Problem dar, wenn man damit einen FTP-Server kurzfristig killen kann
Sehr viele Dienste welche nicht single-threaded sind haben dieses Problem (unter anderem Apache mit dem Slowloris-Angriff)
Ich vertraue allerdings eher einer vorgeschalteten Firewall welche die Verbindungen rausfiltert als dass der Prozess das auch noch machen darf.

Geht das mit Apache-Modulen ähnlich, oder können die nicht einkompiliert werden?
Geht aehnlich. Wenn ich mich aber nicht irre werden Apache2-Module nur einmalig beim Serverstart geladen und danach beim Forken/Threaden mit uebergeben, was somit den Vorteil einkompilierter Module vernichtet.

Begrenzt MaxClients in diesem Fall die Anfragen oder die Verbindungen?
Verbindungen. Wenn keep-alive aktiv ist, sollte dessen Timeout aber nicht all zu hoch gesetzt werden (Typischerweise 2-3 s)

Hat der Nachteile gegenüber dem worker?
Nachteile ist subjektiv. In vielen Faellen ist es nicht moeglich Threads zu benutzen (zb bei mod_suexec) sowie sind einige PHP-Module nicht thread-safe. Allerdings muss fuer jeder Client einen eigenen Prozess geforkt werden statt nur einen Thread zu erstellen was mehr Rechenzeit kostet, ausserdem ist die Inter-Prozess Kommunikation 'teurer' als zwischen Threads eines Prozesses.

Und: der Kram zwischen<IfModule mpm_worker_module> und </IfModule> wird demnach gar nicht beachtet, richtig?
Jap.

Danke, da vertrau ich einfach mal dem Linux-Kernel.
In Linus we trust.
Uebrigens zeigt 'htop' im Gegensatz zu 'top' die korrekte RAM-Belastung (minus Cache) an, was fuer einen ersten Blick hilfreich ist.

Habe 4 GB RAM und benutze normalerweise nicht mehr als 2,5 GB - davon 1-2 GB Cache.
Haengt auch davon ab was du damit machst. Wenn er viele IO-Operationen sieht cached er auch entsprechend ;)
(Zumals MySQL wird prima cached was einen enormen Leistungssprung verursachen kann)
 
Wenn ich mich aber nicht irre werden Apache2-Module nur einmalig beim Serverstart geladen und danach beim Forken/Threaden mit uebergeben, was somit den Vorteil einkompilierter Module vernichtet.

Habe ein bisschen danach gegooglet, konnte aber nichts finden. Kann das irgendwer so bestätigen? :)

Verbindungen. Wenn keep-alive aktiv ist, sollte dessen Timeout aber nicht all zu hoch gesetzt werden (Typischerweise 2-3 s)
Was spricht gegen höhere Werte für maximale Performance? Bei nicht allzu hoher Auslastung sollte das doch kein Problem sein. Bis jetzt läuft alles super bei 60 Sekunden. :o

Nachteile ist subjektiv. In vielen Faellen ist es nicht moeglich Threads zu benutzen (zb bei mod_suexec) sowie sind einige PHP-Module nicht thread-safe. Allerdings muss fuer jeder Client einen eigenen Prozess geforkt werden statt nur einen Thread zu erstellen was mehr Rechenzeit kostet, ausserdem ist die Inter-Prozess Kommunikation 'teurer' als zwischen Threads eines Prozesses.
Okay, aber soweit ich weiß, kann ich das auf einem vServer nicht so einfach ändern, richtig?

Uebrigens zeigt 'htop' im Gegensatz zu 'top' die korrekte RAM-Belastung (minus Cache) an, was fuer einen ersten Blick hilfreich ist.
Du bist mein Held. :D Das Ding ist super. ;)

Haengt auch davon ab was du damit machst. Wenn er viele IO-Operationen sieht cached er auch entsprechend.
Ja gut, zu Hause surfe ich nur und schreibe Mails.


Danke!
 
Was spricht gegen höhere Werte für maximale Performance? Bei nicht allzu hoher Auslastung sollte das doch kein Problem sein. Bis jetzt läuft alles super bei 60 Sekunden.
Der Performance-Zuwachs ist nur spuerbar besser waehrend er die Bilder und anderen Elemente laedt, nicht beim Browsen ueber die Seite. Und diese Elemente werden idR alle innerhalb von 2 Sekunden nach dem letzten Element (meist mehrere gleichzeitig) geladen.

Dagegen spricht dass du bei HTTP/1.1 Clients einen deiner MaxClients fuer bis zu 60 Sekunden blockierst und somit ganz schnell ans Limit des Servers kommst.

Okay, aber soweit ich weiß, kann ich das auf einem vServer nicht so einfach ändern, richtig?
Warum solltest du auf einem vServer nicht zwischen Worker und Prefork wechseln koennen?

Ja gut, zu Hause surfe ich nur und schreibe Mails.
Und dann wundern dass Linux einfach nichts findet was er cachen kann? *grins*
 
KeepAlive habe ich jetzt auf 60.

Warum solltest du auf einem vServer nicht zwischen Worker und Prefork wechseln koennen?
Du sagtest ja, das sei teilweise Pflicht, den als prefork laufen zu lassen. Werd mich mal reinlesen.

Und dann wundern dass Linux einfach nichts findet was er cachen kann? *grins*
:D

Noch was: Ich sehe gerade eine Meldung als root, die ich nicht verstehe.
Code:
renice: 15232: setpriority: Keine Berechtigung
Ich bin doch root. oO
 
Auf einem VServer ist root != root
Alles was den Kernel betrifft darf nur der root des Hosts machen, dazu gehört auch das Manipulieren des Prozessmanagments.
 
u sagtest ja, das sei teilweise Pflicht, den als prefork laufen zu lassen. Werd mich mal reinlesen.
Die Pflicht war nicht auf den vServer bezogen sondern auf die Apache-Module. Verschiedene Module sind nicht thread-safe und koennen somit nur unter Prefork betrieben werden, respektiv koennen aufgrund ihrer Technik (zb setuid() ) nur in einem einzelnen Prozess laufen.

Auf einem VServer ist root != root
Um die vor einiger Zeit diskutierte Unterschiede zwischen vServer hervor zu heben;
diese Begrenzung tritt nur bei virtuellen Container (Isolierung) nicht bei Emulierung, Virtualisierung oder Paravirtualisierung zutage, also nur bei OpenVZ und Linux-VServer, nicht bei XEN, KVM, VmWARE, ....
 
Back
Top