7
Apache2/PHP/MySQL Optimierung Patrick Schneider 1. November 2008 Inhaltsverzeichnis 1

Optimierung Apache/PHP/Mysql mit Zend und eAccelerator

Embed Size (px)

DESCRIPTION

Kurze Übersicht was man an einem LAMP/XAMP System optimieren kann

Citation preview

Apache2/PHP/MySQL Optimierung

Patrick Schneider

1. November 2008

Inhaltsverzeichnis

1

1 Vorwort

In der heutigen Zeit finden sich viele Server die auf der Komibnation Apache/PHP/-MySQL (LAMP, XAMP Installation) aufsetzen. Oft werden die einzelnen Komponentenaber nicht weiter beobachtet und optimiert. Zwar reicht es fur kleine Webservices, aberwer einmal großere Seiten betreibt, welche statischen und dynamischen Inhalt bieten,werden schnell die Grenzen erreicht.Daher soll dieser kleine Bericht einige Optimierungstipps bieten, die der Leser bei Bedarfeinsetzen kann. Dieses Dokument bezieht sich auf eine OpenSUSE 10.3 Installation mitApache 2.0.24, PHP 5.2.4 und MySQL 5.0.45.

2 Optimierungsbereiche

Durch den Einsatz von verschiedenen Komponenten, bedarf es eine genauen Analyseum eine gezielte Steigerung zu erhalten. Hierbei muss jede Komponente wahrend derLaufzeit gepruft und optimiert werden. Fur Apache2/PHP kommt das DienstprogrammApacheBench2 zum Einsatz. Es simuliert den Zugriff beliebig vieler Benutzer mit beliebigvielen Zugriffen auf eine Seite. Dafur wurde eine einfache Testseite mit PHP verwendet(siehe Anhang - Listing 1). Fur die Optimierung der MySQL Datenbank verwenden wirdie Dienstprogramme:

• ApacheBench2

• tuning-primer.sh (http://www.day32.com/MySQL/)

Das Skript tuning-primer.sh liefert nach einer Laufzeit von 48 Stunden (der Datenbank)Optimierungshinweise. Zusammen mit ApacheBench2 kann damit eine Konfigurationerstellt werden, die auch hohe Belastungen standhalt.Fur die PHP Optimierung mittels eAccelerator empfiehlt sich auch der Einsatz einerRamdisk. Diese kann ab Kernel 2.6 mithilfe des tmpfs eingerichtet werden (Anhang -Listing 2).

3 Apache

Um Apache2 performant zu betreiben, bedarf es einiger Anpassungen. Als erstes pas-sen wir das MPM Modell ang. Dieses beeinflusst das Verhalten der Child Prozesse vonApache. Hier wird Standardmaßig das prefork Modell verwendet. Es bietet fur kleineZugriffszahlen eine Ausgeglichene Performance, allerdings erstellt Apache teilweise zuviele Prozesse die enorme Rechenleistung beanspruchen. Da die prefork Prozesse wei-tere Child Prozesse separat starten wird hier schnell eine hohe Auslastung des Systemserreicht. Ersetzen werden wir es durch das worker Modell. Hier werden alle Kind Pro-zesse unterhalb des Hauptprozesses gestartet. Verliert so ein Prozess seine Gultigkeit,werden gleichzeitig alle anderen Kind Prozesse beendet. Dadurch kann bei hohen Zu-griffszahlen eine schnellere Erreichbarkeit gewahrleistet werden (falls ein Prozess hangt,

2

wird der Hauptprozess beendet und die Ressourcen sind sofort wieder frei). Durch dieseAnderung muss auch das FastCGI Modul verwendet werden. Hier wird PHP nicht mehrintern uber Apache aufgerufen, sondern uber die CGI Schnittstelle. Hier kann durch eineOptimierung der PHP Prozesses eine hohere Performance und ein besserer Lastenaus-gleich erzielt werden (Multiprozessoren).

4 PHP

Fur PHP wurde, speziell im FastCGI Bereich, einiges optimiert. Dies umfasst die max.Dauer und Wartezeit auf die Skripte.Hier liegt Standardmaßig eine Zeitspanne von 30 Sek. Fur die Ausfuhrungszeit und 60Sek. fur die Wartezeit. Beide werden auf 70 Sek. angepasst.Des Weiteren kann, falls vorhanden, der Zend Optimizer eingesetzt werden. Zend bietetverschiedene Optimierungsstufen an, welche die PHP Ablaufe beschleunigen. Hierbeiwird der normale PHP Code kompiliert und dadurch schneller ausgefuhrt, da dieser nunim Speicher ausgefuhrt wird. Fur die notigen Einstellungen, schauen Sie im Anhangnach (Listing 3). Um den standigen Zugriff auf die Datenbank einzuschranken, kommtdas PHP Modul eAccelerator zum Einsatz. Es cached die PHP Seiten und kann diesebei wiederholten Zugriff (Startseite, alle statischen Seiten) direkt darstellen ohne eineDatenbank Abfrage zu starten. Diese Cache Dateien liegen in einer 512 MB großen RamDisk um eine sehr schnelle Zugriffszeit zu erreichen. Durch das Zwischenspeichern derDaten erreichen wir bei oft besuchten Seiten eine erhohte Geschwindigkeit, da diesenur noch aus dem Speicher gelesen werden mussen. Hier gilt zu beachten, eine richtigeEinstellung zu finden. Auf hochgradig Dynamischen Seiten (AJAX lastig oder standigeAktualisierend) bringt der Einsatz von eAccelerator keinen Vorteil mehr.

5 MySQL

Im Datenbank Bereich konnen die meisten Optimierungen durchgefuhrt werden.Hier stellt sich die Frage, welche Anwendung zum Einsatz kommt. Bei komplexen CMSProgrammen, wie zum Beispiel Typo3 oder Joomla empfiehlt sich der Einsatz des Da-tenbanktyps InnoDB.Dieser bietet mit der ACID Sicherheit (atomicity, consistency, isolation and durability)eine Gewahrleistung fur konsistente Daten. Zwar sind die Abfragen etwas langsamer,allerdings kann durch Transaktionen dieser Nachteil wieder ausgeglichen werden.Haben Sie noch keine Datenbank angelegt, verwenden Sie gleich den InnoDB Typ (sieheMySQL Beschreibung).Existiert bereits eine Datenbank, kann diese leicht konvertiert werden.

mysqldump −−user=p a t r i c k −−password=s q l −−a l l−drop−database \−−no−autocommit −−databases=u n s e r t e s t > datenbank . s q lsed ’ s /ENGINE=MyISAM/ENGINE=INNODB/g ’ datenbank . s q l > datenbank−innodb . s q lmysql −−user=p a t r i c k −−password=s q l < datenbank−innodb . s q l

3

Anhand von mysqldump erstellen wir ein komplettes Abbild der Datenbank. Der Pa-rameter –all-drop-database bewirkt das bei einem Import die alte Datenbank geloschtwird. Fur eine InnoDB ist der weitere Parameter –no-autocommit sehr wichtig. Er be-wirkt das die Datenbank erst nach kompletten Abarbeiten des Dumps eingelesen wird.Ansonsten wird bei jedem Befehl ein Commit ausgefuhrt, bei dem der Import einer100MB Datei bis zu 2 Stunden beanspruchen kann.Um einer Uberlastung vorzubeugen, die durch Ausfuhrung von langen Datenbankab-fragen zustande kommt, setzen wir diese Dauer auf 7 Sekunden. So hat jede Abfrage7 Sekunden Zeit. Uberschreitet es diese Zeit, wird sie abgebrochen und erneut durch-gefuhrt. Hier ist wichtig, das man selbst mittels des Datenbankskriptes misst, wie vielesolcher Abfragen im Echtbetrieb stattfinden. Werden zuviele Abfragen abgebrochen, en-steht ein Teufelskreis welcher nach 10 Versuchen einen Seitenfehler ausgibt (nach 70sekunden bricht PHP die Bearbeitung des Skriptes ab!!!).Auch im Bereich des Cachings wird gezielt optimiert.Erhohen Sie das worker threads caching um eine bessere Auslastung der einzelnen Pro-zesse zu erreichen.Auch der table cache sollte angepasst werden. Setzen Sie ihn als Anfangswert fur einCMS auf 200 und beobachten Sie die Auslastung mithilfe des Datenbankskriptes. Jenach Einsatzzweck (CMS, normale Webseite mit gelegentlicher Abfrage) konnen diekey buffer size und der query cache verringert werden. Je nach Datentypen werden die-se unterschiedlich ausgelastet. Setzen Sie einen Anfangswert von 16M und prufen Siemit Hilfe des Skriptes die Auslastung.Je nach Beansprichung des Servers, sollten Sie die max connections anpassen. BedenkenSie, das jede Abfrage eine Verbindung darstellt. Setzen Sie bspw. bei einem durchschnitt-lichen Zugriff von 50 Benutzern die Verbindungen auf 250.

6 Nachwort

Im Anhang finden Sie die Anpassungen und Optionen des Textes. Setzen Sie diese mitVorbehalt ein. Gerade im MySQL Bereich empfiehlt sich der Einsatz des tuning-primerSkriptes. Es gibt gute Statistiken aus, anhand derer Sie die Anpassungen vornehmenkonnen.Bitte bedenken Sie auch, dass dieses Dokument nur ein Leitfaden ist und zur Anregungdienen soll und keinesfalls einen optimalen Zustand eines Webservers darstellt.

4

7 Anhang

7.1 PHP-Testcode

Listing 1: Test.php<?phpFor ( $x=0; $x <5000; $x++) {

Echo ”Nummer : ” . $x}?>

7.2 Linux Optimierungen

Listing 2: /etc/fstabtmpfs / tmp cache tmpfs de f au l t s , s i z e =512MB 0 0

7.3 MySQL

Listing 3: /etc/my.cnf# Uncomment the f o l l ow i n g i f you are us ing InnoDB t a b l e sinnodb data home dir = / var / l i b /mysql/i n n o d b d a t a f i l e p a t h = ibdata1 :100M: autoextendinnodb log group home di r = / var / l i b /mysql/i n n o d b l o g a r c h d i r = / var / l i b /mysql/# You can s e t . . b u f f e r p o o l s i z e up to 50 − 80 %# of RAM but beware o f s e t t i n g memory usage too h ighi n n o d b b u f f e r p o o l s i z e = 16Minnodb add i t i ona l mem poo l s i z e = 2M# Set . . l o g f i l e s i z e to 25 % of b u f f e r poo l s i z ei n n o d b l o g f i l e s i z e = 5Mi n n o d b l o g b u f f e r s i z e = 8Mi n n o d b f l u s h l o g a t t r x c o m m i t = 1innodb lock wa i t t imeout = 50

long query t ime=7t h r e a d c a c h e s i z e=5max connect ions=250k e y b u f f e r s i z e =16Mq u e r y c a c h e s i z e =16Mt a b l e c a c h e =107max heap tab l e s i z e =64Mt m p t a b l e s i z e =128Ml o w p r i o r i t y u p d a t e s=1

5

7.4 PHP

Listing 4: /etc/php5/fastcgi/php.ini[ e a c c e l e r a t o r ]z end extens i on=”/ usr / l i b /php5/ ex t en s i on s / e a c c e l e r a t o r . so ”e a c c e l e r a t o r . shm s ize=”32”e a c c e l e r a t o r . c a c h e d i r=”/ tmp cache”e a c c e l e r a t o r . enable=”1”e a c c e l e r a t o r . opt imize r=”1”e a c c e l e r a t o r . check mtime=”1”e a c c e l e r a t o r . debug=”0”e a c c e l e r a t o r . f i l t e r=””e a c c e l e r a t o r . shm max=”0”e a c c e l e r a t o r . shm tt l=”0”e a c c e l e r a t o r . shm prune per iod=”0”e a c c e l e r a t o r . shm only=”0”e a c c e l e r a t o r . compress=”1”e a c c e l e r a t o r . c o m p r e s s l e v e l=”9”

[ zend ]report zend debug = 0zend extens ion manager . opt imize r=/usr / l o c a l /Zend/ l i b / Optimizer −3.3 .0zend extens ion manager . o p t i m i z e r t s=/usr / l o c a l /Zend/ l i b /Optimizer TS −3.3 .0zend opt imize r . v e r s i o n =3.3.0 azend extens i on=/usr / l o c a l /Zend/ l i b /ZendExtensionManager . soz e n d e x t e n s i o n t s=/usr / l o c a l /Zend/ l i b /ZendExtensionManager TS . sozend opt imize r . o p t i m i z a t i o n l e v e l =15

max execut ion t ime = 60 ; Maximum execut ion time o f each s c r i p t , in secondsmax input time = 60 ; Maximum amount o f time each s c r i p t may spend par s ing r eques t datac g i . f i x p a t h i n f o=0

7.5 Apache

Listing 5: /etc/apache2/conf.d/mod fcgi.conf<FilesMatch ” \ . php$”>

AddHandler f cg id−s c r i p t . phpFCGIWrapper ”/ srv /www/ cgi−bin /php5” . phpOptions +ExecCGI

</FilesMatch>

ShareMemPath / var / l i b /apache2/ fcg id shm

6

7.6 OpenSUSE Pakete

• apache2-worker

• apache2-mod fastcgi

• php5-fastcgi

• readline-devel

• libxml2-devel

• pcre-devel

• eaccelerator (http://eaccelerator.net)

7