Da dieses Blog zur Zeit auf einem vServer läuft und dieser nur über begrenzten RAM verfügt habe ich die Apache2 und MySQL Konfiguration dahingehend etwas optimiert.
Aufgelistet sind nur alle von mir manuell angepassten Werte.
Die Apache2 config
In Ubuntu zu finden unter /etc/apache2/apache2.conf
StartServers 1
MinSpareServers 1
MaxSpareServers 3
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 5000
Erklärung:
StartServers: Bestimmt, wieviele Serverprozesse beim Start generiert werden.
MinSpareServers: Die Mindestanzahl zu laufender Apache2 Prozesse. Wenn weniger laufen, wird die hier angegeben Anzahl erzeugt.
MaxSpareServers: Genau das gleiche wie darüber, nur das diese Zahl die Maximal zu laufenden Apache2 Prozesse angibt
MaxClients: Gibt die Maximale Anzahl an Threads an, welche gleichzeitig gestartet werden. Diese sollte einen gewissen Wert nicht überschreiten. Wird dieser Wert überschritten, gibt ServerLimit die Absolute Höchstgrenze an.
ServerLimit: Gibt die absolute Höchstgrenze der maximalen Threads an, welche gestartet werden. Sollte immer höher bzw. genauso hoch wie MaxClients sein.
MaxRequestsPerChild: Gibt die Gesamtzahl an Anfragen an, die erfolgen dürfen bevor ein Kindprozess beendet wird.
Außerdem sollte man den Apache2 als mpm_prefork statt als worker laufen lassen. Dies sollte aber gerade bei einer Apache2 / PHP Kombi schon gegeben sein. Alternativ kann man PHP auch mit Apache2-worker zum laufen bringen. Hierfür wird dann aber CGI nötig. Weitere Informationen zu Apache2- worker in Verbindung mit PHP findet man hier.
Desweiteren empfielt es sich unnötige Module zu deaktivieren und auf .htaccess Dateien zu verzichten. Zum Deaktivieren kann man bequemerweise den befehl
a2dismod [modulname]
verwenden. Zum aktivieren von Modulen gibt es das equivalent a2enmod. Den gleichen Befehl gibt es auch noch für einzelne Seiten bzw vhost Konfigurationen (a2dissite und a2ensite).
Die MySQL config
In Ubuntu zu finden unter /etc/mysql/my.cnf
key_buffer = 2M
max_allowed_packet = 2M
thread_stack = 128K
thread_cache_size = 8
myisam_sort_buffer_size = 4M
read_buffer_size = 512K
read_rnd_buffer_size = 512k
table_cache = 8
skip-bdb
skip-innodb
no-auto-rehash
[isamchk]
key_buffer = 8M
sort_buffer_size= 8M
[mysqlhotcopy]
interactive-timeout
Erklärung:
max_allowed_packet: Wenn der MySQL Server ein Paket größer als max_allowed_packet empfängt, schließt er die Verbindung und gibt den “paket too large” Fehler aus.
thread_cache_size: gibt an, wieviele Threads der Server cachen darf, um sie bei erneuter Benutzung aus dem Cache aufzurufen
myisam_sort_buffer_size: Die max. Größe des Buffers beim sortieren von MyISAM Indexes während eines Reperaturvorgangs pder beim erstellen von Indexes via CREATE INDEX oder ALTER TABLE. Der max. erlaubte Wert ist 4GB
table_cache: Die anzahl der offenen Tabellen pro Thread
skip-bdb: Deaktiviert BarkleyDB und verbraucht somit weniger Speicher
skip-innodb: Deaktiviert InnoDB und verbraucht wesentlich weniger Speicher
Eine vollständige Auflistung aller Systemvariablen für MySQL findet sich hier
Um die ganze Konfiguration jetzt noch zu testen gibt es ein einfach Kommandozeilen-Tool. Sowohl für Windows, wie auch OS X bzw Linux. Es handelt sich hierbei um Apache Benchmark (ab). Um diesen zu starten gibt man folgendes ein:
ab -c 20 -n 1000 localhost/index.php
Dies startet 1000 requests von denen jeweils max. 20 parallel laufen und die index.php aufrufen.
Der Benchmark sollte jedeoch, um möglichst realistische Werte zu vermitteln nicht vom Server gestartet werden sondern von irgendwo außerhalb. Außerdem empfiehlt es sich, diesen nicht auf eine Produktiv-System loszulassen.
Invite your friends to this article!