Apache tuning ... mal wieder

caomhan

New Member
Hi Leute,

ich befasse mich derzeit mit dem Aufmotzen des Apaches unter folgendem System:

Hetzner EQ4:
i7-950
8 GB Ram
Debian Squeeze 64 Bit
mit Plesk

Folgendes habe ich bereits gemacht:

Aufteilung an RAM:
MySQL: 2,5 GB
Apache: ca. 3,5 GB
Rest (Mail / System): 2 GB

Würdet ihr anders aufteilen?

MySQL läuft wirklich super. Geht rauf bis 2,5 GB (davon 1 GB Query Cache), wenn er das braucht (aktuell nur in den "ab" Benchmarks) - tuning primer bestätigt das. Der "Rest" ist auch scheinbar völlig ausreichend mit 2 GB. Nur Apache bereitet mir aktuell etwas Probleme.

Hier zunächst meine Settings (Prefork) vom Apache:

Code:
Timeout 5
KeepAlive On
MaxKeepAliveRequests 250
KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         15
    ServerLimit             220
    MaxClients              220
    MaxRequestsPerChild     3000
</IfModule>

Für Apache rechne ich pro Prozess mit ca. 16 MB (Huschi rechnet in seinen Artikeln mit 12 MB, komme ich aber eher nicht dran). Demnach bei 3,5 GB für Apache 3500 / 16 = ca. 220 MaxClients.

Soweit sollte das ja korrekt sein.

Wenn ich nun mit diesen Settings einen Becnhmark wie diesen hier starte:
ab -n 1000 -c 100 http://www.example.org/

Läuft alles wunderbar, Auch ein zweites und drittes mal. Wenn ich jedoch danach einen Benchmark auf ein anderes Projekt auf dem Server starte:
ab -n 1000 -c 100 http://www.example2.org/

Schmiert die gesamte Kiste vollkommen ab mit einer Load gegen 140 wie in htop zu sehen. Erstaunlicherweise geht der RAM in diesen fällen NIE über 4000 - 4300 MB hinaus und er fängt an den Swap (mit 2 GB) vollzuknallen.

Dabei hätte ich doch noch fast 4 GB?!
Wenn ich das jetzt mal umrechne:

4300 MB (auf die er maximal geht) - 2500 MB (für MySQL die beim Becnhmark auch schön beansprucht werden) = 1800 MB für Apache und System.

Ziehen wir davon noch ca. 800-1000 MB für System / Mail / Spamd ... ab kommen wir auf ca. 1000 MB.

1000 MB / 16 MB (pro Apache Prozess) = 62 MaxClients

Stelle ich Apache auf 50 MaxClients funktioniert alles gut ohne vollständig abzuschmieren oder den Swap volllaufen zu lassen. Auch noch mit 80 MaxClients, wenn ich mich recht entsinne.

Aber warum?
Ist vielleicht ein RAM Riegel kaputt?
Wieso nutzt er den restlichen Speicher nicht?
Ich würde diesen gerne für Apache "reservieren".
Oder habe ich vielleicht einen ganz groben Denk-/Rechenfehler?

Zur Info: Die "swappiness" habe ich auf 15 heruntergesetzt.

"free" zeigt folgenden RAM (aktuell - Normalbetrieb - ohne Becnhmarks):
Code:
# free
             total       used       free     shared    buffers     cached
Mem:       8190820    3061592    5129228          0      20480     479404
-/+ buffers/cache:    2561708    5629112
Swap:      2102456          0    2102456

Ich freue mich auf euer Feedback!

Schon mal vielen Dank!

Grüße,
caom

PS: Warum liegen eigentlich alle PHP-FCGI Childs nur unter dem ersten Apache Child? Ist das normal? Sollte er hier nicht auch mal auf andere Apache Childs verteilen?

"ps fax" Ausgabe nach Benchmark
Code:
19517 ?        Ss     0:00 /usr/sbin/apache2 -k start
19524 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19532 ?        S      0:05  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19533 ?        S      0:05  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19537 ?        S      0:04  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19538 ?        S      0:04  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19539 ?        S      0:04  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19545 ?        S      0:02  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19547 ?        S      0:02  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19549 ?        S      0:02  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19555 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19558 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19560 ?        S      0:02  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19569 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19570 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19571 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19575 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19578 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19581 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19589 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19592 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19593 ?        S      0:01  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19608 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19609 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19610 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19611 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19612 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19613 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19614 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19615 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19616 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19617 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19630 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19636 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19637 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19648 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19649 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19650 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19651 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19661 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19662 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19663 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19664 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19665 ?        S      0:00  |   \_ /usr/bin/php5-cgi -c /var/www/vhosts/example.org/etc/php.ini
19526 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19527 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19528 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19529 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19530 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19536 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19546 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19548 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19550 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19551 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19557 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19561 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19563 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19565 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19572 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19573 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19574 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19576 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19577 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19579 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19580 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19582 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19585 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19586 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19587 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19588 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19590 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19591 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19628 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19629 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19632 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19633 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19634 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19635 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19640 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19641 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19643 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19644 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19645 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19646 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19647 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19656 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19657 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19658 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19659 ?        S      0:00  \_ /usr/sbin/apache2 -k start
19660 ?        S      0:00  \_ /usr/sbin/apache2 -k start



-- Update --
Gerade mal memtester laufen lassen.
Der kann wunderbar 8 GB RAM nutzen.
Kaputt wird er wohl also nicht sein.
 
Last edited by a moderator:
Für Apache rechne ich pro Prozess mit ca. 16 MB (Huschi rechnet in seinen Artikeln mit 12 MB, komme ich aber eher nicht dran).
Die Daten aus den Artikeln sind natürlich auch in eine andere technische Zeitspanne einzusortieren. Damals hatten Server noch nicht soviel Speicher und PHP-Scripte waren auch noch nicht so Speicher hungrig.
Du sollst aber nicht rechnen, sondern den realen Speicherverbrauch von Apache nehmen.

Demnach bei 3,5 GB für Apache 3500 / 16 = ca. 220 MaxClients.
D.h. Du willst 220 Prozess (plus MySQL und den ganzen Rest) auf Deinem kleinen i7 laufen lassen? Damit kommst Du (wenn man mal wirklich annimmt es währen 8-CPU-Kerne [hust-hust]) auf 27 Apache-Prozesse pro Kern.

Kleine Fragen dazu:
Womit rechnet dann MySQL?
Und wie viel Speicher verbrauchen Deine FastCGI-Prozesse?
Ich glaub da hast Du etwas zu "kurz" gedacht. ;)

huschi.
 
Ich habe (als ich das Ganze gestern bemerkt habe) die Config zunächst wie folgt belassen (damit arbeitet er ja zuverlässig alle Benchmarks ab):

Code:
<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         15
    ServerLimit             50
    MaxClients              50
    MaxRequestsPerChild     3000
</IfModule>

Die Daten aus den Artikeln sind natürlich auch in eine andere technische Zeitspanne einzusortieren. Damals hatten Server noch nicht soviel Speicher und PHP-Scripte waren auch noch nicht so Speicher hungrig.
Du sollst aber nicht rechnen, sondern den realen Speicherverbrauch von Apache nehmen.

Hier einmal der aktuelle Speicherverbrauch aller Apache und FCGI Prozesse im Normalbetrieb von heute früh ("web-Nummern" sind nur grob und nicht exakt):

Code:
 9340 /usr/sbin/apache2 -k start
10388 /usr/bin/php5-cgi -c /var/www/vhosts/...web2.../etc/php.ini
10652 /usr/bin/php5-cgi -c /var/www/vhosts/...web3.../etc/php.ini
10668 /usr/bin/php5-cgi -c /var/www/vhosts/...web2.../etc/php.ini
14968 /usr/sbin/apache2 -k start
15192 /usr/sbin/apache2 -k start
15232 /usr/sbin/apache2 -k start
15252 /usr/sbin/apache2 -k start
15272 /usr/sbin/apache2 -k start
15452 /usr/sbin/apache2 -k start
15764 /usr/sbin/apache2 -k start
15776 /usr/sbin/apache2 -k start
15780 /usr/sbin/apache2 -k start
15800 /usr/sbin/apache2 -k start
15812 /usr/sbin/apache2 -k start
15840 /usr/sbin/apache2 -k start
15884 /usr/sbin/apache2 -k start
15996 /usr/sbin/apache2 -k start
16724 /usr/bin/php5-cgi -c /var/www/vhosts/...web1.../etc/php.ini
17016 /usr/sbin/apache2 -k start
18188 /usr/sbin/apache2 -k start
32468 /usr/bin/php5-cgi -c /var/www/vhosts/...web4.../etc/php.ini
38144 /usr/bin/php5-cgi -c /var/www/vhosts/...web5.../etc/php.ini
38984 /usr/bin/php5-cgi -c /var/www/vhosts/...web6.../etc/php.ini
39212 /usr/bin/php5-cgi -c /var/www/vhosts/...web7.../etc/php.ini
40184 /usr/bin/php5-cgi -c /var/www/vhosts/...web1.../etc/php.ini
40372 /usr/bin/php5-cgi -c /var/www/vhosts/...web8.../etc/php.ini
40948 /usr/bin/php5-cgi -c /var/www/vhosts/...web2.../etc/php.ini
41296 /usr/bin/php5-cgi -c /var/www/vhosts/...web9.../etc/php.ini
41428 /usr/bin/php5-cgi -c /var/www/vhosts/...web2.../etc/php.ini
42056 /usr/bin/php5-cgi -c /var/www/vhosts/...web2.../etc/php.ini
43128 /usr/bin/php5-cgi -c /var/www/vhosts/...web10.../etc/php.ini
43176 /usr/bin/php5-cgi -c /var/www/vhosts/...web4.../etc/php.ini
43300 /usr/bin/php5-cgi -c /var/www/vhosts/...web6.../etc/php.ini
43756 /usr/bin/php5-cgi -c /var/www/vhosts/...web9.../etc/php.ini
47164 /usr/bin/php5-cgi -c /var/www/vhosts/...web4.../etc/php.ini
49920 /usr/bin/php5-cgi -c /var/www/vhosts/...web11.../etc/php.ini
53156 /usr/bin/php5-cgi -c /var/www/vhosts/...web11.../etc/php.ini
54948 /usr/bin/php5-cgi -c /var/www/vhosts/...web11.../etc/php.ini
58904 /usr/bin/php5-cgi -c /var/www/vhosts/...web8.../etc/php.ini
60136 /usr/bin/php5-cgi -c /var/www/vhosts/...web12.../etc/php.ini
60392 /usr/bin/php5-cgi -c /var/www/vhosts/...web13.../etc/php.ini
60548 /usr/bin/php5-cgi -c /var/www/vhosts/...web12.../etc/php.ini
61928 /usr/bin/php5-cgi -c /var/www/vhosts/...web13.../etc/php.ini
64368 /usr/bin/php5-cgi -c /var/www/vhosts/...web12.../etc/php.ini
69564 /usr/bin/php5-cgi -c /var/www/vhosts/...web8.../etc/php.ini
72980 /usr/bin/php5-cgi -c /var/www/vhosts/...web14.../etc/php.ini
76232 /usr/bin/php5-cgi -c /var/www/vhosts/...web14.../etc/php.ini
76252 /usr/bin/php5-cgi -c /var/www/vhosts/...web6.../etc/php.ini
77572 /usr/bin/php5-cgi -c /var/www/vhosts/...web14.../etc/php.ini

D.h. Du willst 220 Prozess (plus MySQL und den ganzen Rest) auf Deinem kleinen i7 laufen lassen? Damit kommst Du (wenn man mal wirklich annimmt es währen 8-CPU-Kerne [hust-hust]) auf 27 Apache-Prozesse pro Kern.

Naja gut, wenn man sich das mal so ansieht :) Also haben Kisten die "MaxClients" und "ServerLimit" derart hoch eingestellt haben auch entsprechend 2 Xeon mit 6 Kernen oder mehr?!

MaxClients und ServerLimit so zu setzen, dass jeder der 8 Threads nur ein Prozess abarbeitet ist aber auch eher unnötig, oder? Dan kämen die kleineren "Standardserver" (wie meiner) ja nur auf 8 MaxClients/ServerLimit :)? Demnach würde aber wohl die Load egal bei welchen Bedingungen immer schön niedrig (unter 1) sein - zumindest wenn man das Ganze nur auf den Apache bezieht. Versteh ich das gerade richtig?!

Womit rechnet dann MySQL?
Und wie viel Speicher verbrauchen Deine FastCGI-Prozesse?

Tja bei 27 Prozessesn pro Thread wohl mit gar nichts mehr :) Aber ist das der Grund dem RAM nur bis 4,5 GB zu nutzen und danach alles vollzuswappen? Eigentlich doch auch nicht, oder?

Die FCGI Prozesse benötigen in der Ausgabe oben bis zu 80 MB.

PS: Verblüffend ist ja sowieso, dass die genannten Benchmarks auch mit ServerLimit / MaxClients 50 exakt gleich verlaufen wie mit 220. Wobei bei 100 gleichzeitigen Zugriffen im Benchmark das Ganze bei 50 MaxClients doch auch langsamer sein sollte?!

Puuh oder ich hab wirklich die größten Denkfehler.

Ich weiß gerade gar nicht mehr, was ich überhaupt rechnen soll :)
Apache Prozess mit 20 MB + 80 MB für FCGI dazu? Dann kommen wir bei 3,5 GB auf: 3500 / (20 + 80) = 35? Sollen das meine MaxClients sein?

Gibt es eine Ausgabe mit der ich ermitteln und schon zusammenrechnen kann, wieviel Apache und alle Childs zusammen an RAM brauchen? FCGI Prozesse gleicher "Webs" werden ja nicht einfach addiert, oder?

Code:
49920 /usr/bin/php5-cgi -c /var/www/vhosts/...web11.../etc/php.ini
53156 /usr/bin/php5-cgi -c /var/www/vhosts/...web11.../etc/php.ini
54948 /usr/bin/php5-cgi -c /var/www/vhosts/...web11.../etc/php.ini

Bei den 3 Childs läge der reale RAM verbrauch ja dennoch "nur" bei 55 MB, oder?

Dank und Grüße!

PS: Wie viele Prozesse / Kern würdest du denn empfehlen?


Update:

Nur mal rein theoretisch:

Habe gerade zum Test einmal MaxClients und ServerLimit auf 5 gesetzt.
Benchmark unwesentlich langsamer, und die CPU Usage demnach bei 8 Threads unter 100%.
Aber wenn der Benchmark "sowieso" gleich schnell ist und der Server "gleich gut/schnell abarbeiten" kann, wofür sollte ich dann die MaxClients/ServerLimit höher als z.B. 8 setzen?

Ob nun die CPU einen laufenden Prozess nach dem anderen abarbeitet oder der Apache die Queue übernimmt - eher "fast" wurscht?!

Der RAM Verbauch geht zwar dann nur gegen 160MB oder (mit FCGI eingerechnet 800 MB).

Habe ich auf Grund der CPU einfach keine größeren Vorteile MaxClients/ServerLimit höher als 8 zu setzen?


Update 2:

Ist es bei kleinen MaxClients / ServerLimit Werten eigentlich angebracht KeepAlive auf Off zu stellen? Ansonsten hatte ich KeepAlive On mit Timeout von 2.

Habe jetzt mal folgende Settings:
Code:
Timeout 5
KeepAlive Off
MaxKeepAliveRequests 250
KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         10
    ServerLimit             32
    MaxClients              32
    MaxRequestsPerChild     3000
</IfModule>
 
Last edited by a moderator:
Also haben Kisten die "MaxClients" und "ServerLimit" derart hoch eingestellt haben auch entsprechend 2 Xeon mit 6 Kernen oder mehr?!
Oder einen schlechten Admin. :D

MaxClients und ServerLimit so zu setzen, dass jeder der 8 Threads nur ein Prozess abarbeitet ist aber auch eher unnötig, oder?
Natürlich. Denn die Prozesse verursachen ja auch viel Idletime.

Aber ist das der Grund dem RAM nur bis 4,5 GB zu nutzen und danach alles vollzuswappen?
Das müsste man auf der Maschine selbst untersuchen.
Aber letztendlich ist es eine Entscheidung des Kernels, ob geswappt wird oder nicht.

Ich weiß gerade gar nicht mehr, was ich überhaupt rechnen soll :)
Apache Prozess mit 20 MB + 80 MB für FCGI dazu? Dann kommen wir bei 3,5 GB auf: 3500 / (20 + 80) = 35? Sollen das meine MaxClients sein?
Prinzipiell korrekt. Allerdings würden hierfür auch die Mittelwerte funktionieren.
Du darfst nicht vergessen, dass Server-Tuning immer speziell auf die Maschine und die Nutzung abgestimmt wird. Es gibt also kein Formel-Berechnung für die richtigen Werte. Ein großer Teil ist Try+Error. Und in sofern war Dein Ansatz schon richtig. Du weißt bereits wo gewisse Grenzen liegen. Und Fine-Tuning bedeutet diese Grenzen möglichst dicht zu erreichen, aber nicht zu überschreiten.

Das Problem bei Dir sind die FastCgi-Daemons. Die sind viel schwieriger zu berechnen und vorher zu sehen als das gute alte mod_php.
Daher solltest Du auch nicht nur den ab-Benchmark nutzen da er niemals die Auslastung aus dem realen Leben Simulieren kann. Nimm parallel auch einen Webdownloader dazu, der ganze Websites runter zieht. Stelle den auf möglichst viele Slots und lass von möglichst vielen Maschinen unterschiedliche Websites vom Server ziehen. Das kommt eher an "real live" dran.

Desweiteren könntest Du Dir überlegen auf das Worker-MPM zu wechseln falls gar kein mod_php (oder mod_perl, mod_python, etc.) zum Einsatz kommt. Das spart in dem Falle viel Speicher.

/edit:
Auch immer dran denken: Performance-Tuning ist ein fortlaufender Prozess. Mit jeder kleinsten Änderung muss eigentlich eine Überprüfung und Anpassung erfolgen. Z.B. Änderungen einer Website, Software-Update (sowohl vom System als auch der PHP-Scripte), Websites kommen dazu oder gehen weg, Website wird populärer, etc.
Das gilt für Apache genauso wie für MySQL.

huschi.
 
Last edited by a moderator:
Oder einen schlechten Admin.

Daher frage ich ja nach :D

Das müsste man auf der Maschine selbst untersuchen.
Aber letztendlich ist es eine Entscheidung des Kernels, ob geswappt wird oder nicht.

Wie kann ich das am besten überprüfen?
Wo finde ich denn die Kernel Config "hau.den.swap.voll.ab = 4800M" :D?

Es scheint mir so, als würde nur der Apache der Swap vollaufen lassen.
Hab nun MySQL mal etwas mehr RAM zugeteilt (da der Apache diesen ja aktuell "eh nicht effektiv nutzt"). Mal schauen wie es sich über den Tag verhält.

Desweiteren könntest Du Dir überlegen auf das Worker-MPM zu wechseln falls gar kein mod_php (oder mod_perl, mod_python, etc.) zum Einsatz kommt. Das spart in dem Falle viel Speicher.

Ist aber mit Plesk nicht so einfach, oder?
Hatte schon mal daran gedacht und dann via apt-get den worker nachinstallieren wollen und apt-get schlug mir dann vor Plesk gesamt zu entfernen, das wollte ich dann doch eher nicht ;)

Vielen Dank soweit!
 
Hey Leute,

ich muss das Thema leider noch mal hochkramen, da ich ab Mittwoch deutlich mehr Traffic erwarte.

Mein System fängt noch immer ab 5/8 GB RAM-Nutzung an den Swap komplett zu füllen (obwohl ich ja noch ca. 3 GB RAM hätte?).

8 GB werden wie gesagt in htop und free angezeigt, genutzt jedoch nicht.

Kann es an den RAM Bänken liegen, die genutzt werden?
Hier ein Auszug (BANK3 ist mittendrin frei):

Code:
dmidecode -t 17
# dmidecode 2.9
SMBIOS 2.5 present.

Handle 0x0025, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0023
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 2048 MB
	Form Factor: DIMM
	Set: None
	Locator: DIMM0
	Bank Locator: BANK0
	Type: Other
	Type Detail: Other
	Speed: 1066 MHz (0.9 ns)
	Manufacturer: Samsung       
	Serial Number: F50AA763
	Asset Tag: AssetTagNum0
	Part Number: M378B5773CH0-CH9  

Handle 0x0027, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0023
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 2048 MB
	Form Factor: DIMM
	Set: None
	Locator: DIMM1
	Bank Locator: BANK1
	Type: Other
	Type Detail: Other
	Speed: 1066 MHz (0.9 ns)
	Manufacturer: Samsung       
	Serial Number: 756D1244
	Asset Tag: AssetTagNum1
	Part Number: M378B5773DH0-CH9  

Handle 0x0029, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0023
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 2048 MB
	Form Factor: DIMM
	Set: None
	Locator: DIMM2
	Bank Locator: BANK2
	Type: Other
	Type Detail: Other
	Speed: 1066 MHz (0.9 ns)
	Manufacturer: Samsung       
	Serial Number: DE0AA763
	Asset Tag: AssetTagNum2
	Part Number: M378B5773CH0-CH9  

Handle 0x002B, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0023
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: No Module Installed
	Form Factor: DIMM
	Set: None
	Locator: DIMM3
	Bank Locator: BANK3
	Type: Other
	Type Detail: Other
	Speed: 1066 MHz (0.9 ns)
	Manufacturer: Manufacturer03
	Serial Number: 00000000
	Asset Tag: AssetTagNum3
	Part Number:                   

Handle 0x002D, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0023
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 2048 MB
	Form Factor: DIMM
	Set: None
	Locator: DIMM4
	Bank Locator: BANK4
	Type: Other
	Type Detail: Other
	Speed: 1066 MHz (0.9 ns)
	Manufacturer: Samsung       
	Serial Number: DC0AA763
	Asset Tag: AssetTagNum4
	Part Number: M378B5773CH0-CH9  

Handle 0x002F, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0023
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: No Module Installed
	Form Factor: DIMM
	Set: None
	Locator: DIMM5
	Bank Locator: BANK5
	Type: Other
	Type Detail: Other
	Speed: 1066 MHz (0.9 ns)
	Manufacturer: Manufacturer05
	Serial Number: 00000000
	Asset Tag: AssetTagNum5
	Part Number:

Oder sollte es daran definitiv nicht liegen?

Danke und Gruß,
caom
 
Ich muss gerade nochmals den aktuellen Stand melden: Fakt ist:

35 MaxClients - läuft
MySQL: 2,2 GB
Apache: ca. 700 MB (bei 35)
System + Rest: 1,2 GB

Gesamt: 4 GB - 4,2 GB

Setze ich die MaxClients hoch, sodass für Apache ca. 2 GB bereitstehen, haben wir beispielsweise folgende Werte:

80 MaxClients - läuft nicht
MySQL: 2,2 GB
Apache: ca. 1,6 GB (bei 80)
System + Rest: 1,2 GB

Gesamt: ca. 5 GB

Im Gesamten sollten mit "MaxClients 80" also ca. 5 GB Gesamt-RAM benötigt werden. Im System sind 8 GB RAM verfügbar, sollte also passen.

Mache ich nun so jedoch einige ApacheBenchmarks auf unterschiedlichste Projekte, schmiert der Server immer bei 4,2 - 4,5 GB Gesamt-RAM Verbrauch ab, swappt voll und nichts geht mehr.

Vielleicht ist es eher ein Apache / FCGI Problem, was dem RAM nicht ausnutzen kann?! Wenn ich "memtester" mit 6 GB mache, kann er sich diese 6 GB auch holen (während das System nebenbei noch mit bis zu 1,5 GB läuft). Er nutzt dann also 7,5 GB und schließt den Test erfolgreich ab.

Ich hoffe, dass noch jemand einen Tipp hat.

Vielen Dank!
 
Danke, steht aber mittlerweile schon auf 10.
Hatte bis heute den Wert auf 15. Keine wirkliche Änderung.

Dennoch vielen Dank!
 
So, Hetzner hat mir nun mal 12 GB Ram reingepackt.
Nun ist die kritische Marke auf 6 GB gesteiegen, danach wird vollgeswappt.

Habe auch gemerkt, dass dann via "free" nur 74 MB frei gezeigt wird, aber 6 GB "cached" wieso gibt er "cached" nicht frei und swappt stattdessen.

Ich weiß, ich Frage immer die gleiche Frage :) Aber immer mit leicht neuen Erkenntnissen.

Schönen Abend und vielen Dank,
caom

* Update *
Hier noch die free Ausgabe

Code:
             total       used       free     shared    buffers     cached
Mem:      12327760   11358100     969660          0       2720    5569656
-/+ buffers/cache:    5785724    6542036
Swap:      2102456    2028072      74384

Wenn ich einfach knallhart weiter "Benchmarke":

Code:
             total       used       free     shared    buffers     cached
Mem:      12327760   12261056      66704          0        724    5844868
-/+ buffers/cache:    6415464    5912296
Swap:      2102456    2102356        100

Quasi the same...Er gibt einfach definitiv den cached Wert nicht mehr frei, obwohl er dringend benötigt werden würde. Ich dachte, das Linux RAM Management sei so exzellent :)?

Das gleiche Verhalten übrigens auch auf meinem Büro Server (an sich gleiche Ausstattung (bessere CPU, 8 GB RAM) und fast gleiches System).

Kann man das "cachen" von Daten in freien RAM kurzzeitig zum Test einmal unterbinden?

Grüße und Dank!
 
Last edited by a moderator:
Abend,

ich habe nun scheinbar den Auslöser für beschriebenes Problem gefunden.
Es ist mein Opcode Cache APC. Der während dem Benchmark den RAM "cached" voll knallt.

Aber: Sollte APC den RAM nicht innerhalb des PHP/Apache2 Prozesses nutzen?!

Und gute Nacht :)!
 
Nur so am Rande: Dir konnte keiner Tips geben, weil man in dem Fall wirklich auf die Maschine schauen muss.

Aber: Sollte APC den RAM nicht innerhalb des PHP/Apache2 Prozesses nutzen?!
Schau Dir dir Prozess-Struktur bei Nutzung von FastCGI an.
Bedenke dass APC kein Apache-Modul sondern ein PHP-Modul ist.

huschi.
 
Hallo zusammen,

was mir aufgefallen ist:

1. Hatte fcgi und mod_php als Apache Modul geladen (Plesk Standard?) Habe demnach mod_php entfernt -> Apache Prozess ist nun natürlich kleiner

2. Habe mir ein Shell Script erstellt (siehe unten) um Apache Prozesse & FCGI Prozesse zusammen zu rechnen - der RAM Verbrauch der "cached" wird, wird scheinbar im FCGI Prozess angerechnet, aber eben nicht in htop dargestellt (da teilweise "nur als cached dargestellt"). Das Script zeigt also (hoffentlich) den realen RAM Verbauch von Apache, FCGI und MySQL.

3. FCGI und Apache Config angepasst:
Apache: ca. 1,2 GB
FCGI: ca. 4 GB
MySQL: ca. 5 GB

Der Rest von ca. 1,7 GB ist für System (Mail, Bind, Spamd, Clamd) - sollte noch reichen.

Script:
Code:
#!/bin/sh

while (ping -c 1 localhost > /dev/null)
do
	MEM_APACHE=`ps -e -orss,args= | grep 'apache2' | sed -e 's/\/.*//g' | awk '{sum+=$1}END{print sum/1024}'`
	MEM_PHP=`ps -e -orss,args= | grep 'php5-cgi' | sed -e 's/\/.*//g' | awk '{sum+=$1}END{print sum/1024}'`
	MEM_MYSQL=`ps -e -orss,args= | grep 'mysqld' | sed -e 's/\/.*//g' | awk '{sum+=$1}END{print sum/1024}'`
	MEM_APACHEPHP=`ps -e -orss,args= | grep 'php5-cgi\|apache2' | sed -e 's/\/.*//g' | awk '{sum+=$1}END{print sum/1024}'`
	
	clear
	echo "Apache:        $MEM_APACHE"
	echo "PHP (FCGI):    $MEM_PHP"
	echo "MySQL:         $MEM_MYSQL"
	echo "-----------------------"
	echo "Apache / PHP:  $MEM_APACHEPHP"
	echo "MySQL:         $MEM_MYSQL"
	sleep 0.2
done

exit;

Output vom Script:
Code:
Apache:        158.305
PHP (FCGI):    732.25
MySQL:         2237.26
-----------------------
Apache / PHP:  889.703
MySQL:         2237.26

Hier nochmals kurz meine Config.
Ist irgendetwas totaler Schwachsinn oder verhältnismäßig über-/unterdimensioniert?

Apache
Code:
Timeout 5
KeepAlive Off
MaxKeepAliveRequests 200
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
    StartServers            5
    MinSpareServers         5
    MaxSpareServers         10
    ServerLimit             100
    MaxClients              100
    MaxRequestsPerChild     0
</IfModule>

FCGI
Code:
  FcgidProcessLifeTime 60
  FcgidMaxProcesses 100
  FcgidMinProcessesPerClass 3
  FcgidMaxProcessesPerClass 100
  FcgidMaxRequestsPerProcess 10000
  FcgidMaxRequestLen 1288490188
  FcgidInitialEnv RAILS_ENV production
  FcgidIdleScanInterval 10

MySQL
Code:
# * Fine Tuning
#
key_buffer		        = 128M
join_buffer_size		= 2M
sort_buffer_size        = 2M
myisam_sort_buffer_size = 2M
read_buffer_size        = 2M
read_rnd_buffer_size    = 2M
max_allowed_packet	    = 64M
thread_stack		    = 1M
thread_cache_size       = 64M

myisam-recover          = BACKUP
max_connections         = 325
table_cache             = 4092
table_definition_cache  = 4092
max_heap_table_size     = 128M
tmp_table_size          = 128M
thread_concurrency     	= 16
#
# * Query Cache Configuration
#
query_cache_limit       = 64M
query_cache_size        = 2048M
query_cache_type        = 1

Grüße!
 
Last edited by a moderator:
Back
Top