by:

1. PHP caching mit eaccelerator
2. MySQL und Indexes
3. MySQL socket over TCP
4. PHP Sessionhandler DB
5. Temp- Dateien von MySQL und PHP
6. Codeprofiling
7. MySQL- Proxy
8. Benchmarking


1. Caching mit eaccelerator

eaccelerator ist eine gute Wahl für Server, die eine hohe Last bewältigen müssen.
Die Vorteile liegen darin, dass PHP Skripte nicht bei jedem Aufruf neu gelesen und
interpretiert werden müssen, was bei mehreren Anfragen Zeit spart.
Ausserdem schont es die Festplatte, da der interpretierte Code im RAM gehalten wird.
Es gibt diverse Benchmarks die belegen sollten, dass eaccelerator eines der besten Cachingsysteme für PHP ist.
Ich selber verwende eaccelerator seit mehreren Jahren und bin sehr zufrieden.

2. MySQL und Indexes

Etwas worauf man immer wieder stößt, wenn man sich mit Performance und MySQL beschäftigt, ist die Aufforderung Indexe richtig zu setzen. Dem kann man eigentlich wenig hinzufügen.
Es hat sich gezeigt, dass gerade bei größeren DBs die Geschwindigkeit dramatisch gesteigert werden kann, wenn man seine Indexes richtig setzt.
Die MySQL Funktion "explain" hilft dabei queries zu optimieren.

3. MySql und Sockets

Wenn es möglich ist, sollte man Socket- Verbindungen der TCP- Verbindung vorziehen, da TCP- Verbindungen meist nur ein unnötiger Overhead sind. Manche Seiten berichten von einem Performancegewinn bis zu 20 %.
Die Verbindung lässt sich in PHP relativ einfach aufbauen,
entweder man verwendet beim mysql_connect localhost, dann versucht die Funktion
selbstständig eine Socket- Verbindung aufzubauen, oder man gibt den Pfad direkt an:

Code

<?php mysql_connect("/tmp/mysql.sock""root""pass"); ?>


4. PHP Sessionhandler

Ich verwende seit kurzem für mein CMS einen Datenbank- Sessionhandler, weniger aus Performance- Gründen, als mehr zur Lastverteilung.
Wie ein Datenbank- Sessionhandler ausschaut, könnt ihr euch hier ansehen:
http://www.codejungle.org/tag/Database_Session_handler_for_php/3.html

5. Temp- Dateien von MySQL und PHP

Temporäre Dateien von MySQL und PHP kann man auch im RAM speichern,
dazu legt man einfach ein Verzeichnis im tmp Ordner an:
mkdir /tmp/ram
und weist einen Teil des Arbeitsspeichers diesem Verzeichnis zu (in dem Fall 150mb):
/bin/mount -t tmpfs /dev/shm /tmp/ram/ -o size=150m

Danach muss man MySQL und PHP nur noch sagen wo sie die Temp Dateien speichern sollen.

MySQL mit dem Parameter --tempdir=/tmp/ram/ starten
und in der php.ini den session.save_path auf /tmp/ram/ setzen.

Nach meinen Tests hat dies zwar nicht viel Performance gebracht, aber naja, Kleinvieh macht auch Mist.

6. Code Profiling

Code Profiling ist eine nützliche Methode um seinen Code zu verbessern.
Man sieht, welche Funktionen wie viel Speicher, CPU und Zeit brauchen und kann
dann seinen Code optimieren. Ich selber habe xdebug zum optimieren verwendet,
es gibt aber auch noch eine Reihe anderer Profiler.
mod-top z.B. habe ich mir bisher zwar noch nicht näher angeschaut, es scheint aber auch relativ brauchbar zu sein.

7. MySQL- Proxy

MySQL- Proxy kann man als DB Lastenverteiler, aber auch als eine Failover Lösung benutzen.
Ich selber habe einige Lastenverteiler getestet und hier meine Ergebnisse veröffentlicht:

http://www.codejungle.org/tag/Lastenverteilung_mit_MySQL_und_SQLrelay/5.html


8. Benchmarking

Bevor man in den produktiven Betrieb geht sollte man seine Anwendung immer einem Benchmark unterziehen.
Eine einfache Methode ist AB, was für Apache Benchmark steht.
Mit AB ist es möglich mehrere Anfragen paralell an den Webserver zu senden und in den meisten Fällen kann man so auch die Grenzen des Servers ermitteln.

Beispiel für einen Befehl:
ab -c 100 -n 100 http://testserver.com/

Apache Benchmark ist bei der Default- Installation von Apache dabei.



Desweiteren möchte ich auf memcache aufmerksam machen, ich selber habe zwar keine praktischen Erfahrungen mit dem Object- Cachingsystem, doch ich denke, dass es für HighLoad Anwendungen durchaus interessant ist.

Ich hoffe euch hat der Beitrag gefallen.

MFG

Andreas


Quellen:

http://eaccelerator.net/
http://www.xdebug.org/
http://www.mod-top.org/
http://forge.mysql.com/wiki/MySQL_Proxy
http://www.mysqlperformanceblog.com/
http://www.h07.org/projects/apachetuning/#21
http://www.danga.com/memcached/


Kommentare

by:

Hallo,

nachdem ich immer wieder SSH Bruteforce Attacken auf meinem Server festgestellt habe, möchte ich euch heute ein kleines aber nützliches Tool vorstellen, was diese unterbindet. Denyhosts ist besonders dann praktisch, wenn man den SSH Port nicht auf eine bestimmte IP beschränken kann oder will. Die Installation unter Debian ist äusserst einfach.

Ein "apt-get install denyhosts" reicht in der Regel aus und man hat keinen Ärger mehr mit den lästigen SSH Bruteforce Attacken. Bei 5 (default) fehlgeschlagenen Loginversuchen wird die IP automatisch auf die hosts.deny Liste gesetzt.

Eine andere Möglichkeit ist Port Knocking, was einer Challenge- Response Lösung nahe kommt. Man sendet ein Packet an einen oder mehrere vorkonfigurierte TCP/UDP Ports und erst dann ist der SSH Port 22 für eine bestimmte Zeit erreichbar.

Ich hoffe euch hat der Beitrag gefallen.

Andreas

[UPDATE]

Zur Zeit verwende ich fail2ban, da es auch andere Protokolle (ssh, ftp, pop..) beherrscht und bin damit recht zufrieden. Anders als denyhosts verwendet es iptables Regeln.

Quellen:

http://www.fail2ban.org/

http://denyhosts.sourceforge.net/

http://en.wikipedia.org/wiki/Port_knocking


Kommentare

by:

Hallo,

nach meinem Urlaub mal wieder ein kleiner Artikel zum Thema PHP.

Manchmal ist es nützlich einen in den Hintergrund zu legen, dies dient zum Beispiel dazu bei rechen- und zeitintensiven Prozessen den Benutzer nicht warten zu lassen.

Code

<?php shell_exec("nohup php /var/www/test.php > /dev/null 2> /dev/null & echo $"); ?>

Die PHP Funktion shell_exec führt eine shell Befehl aus.

nohup nabelt ein Programm vom Elternprozess ab

php -q /var/www/test.php führt den PHP Script aus, der im Hintergrund laufen soll.

> /dev/null leitet die Ausgabe ins Nirgendwo um.

Wenn also diese Zeile im Browser geöffnet wird, wird ein Subprozess von php gestartet, das bedeutet der Benutzer kann weitersurfen, während der Prozess auf dem Server weiter läuft.

Leicht ist das z.B. mit einer Endlosschleife zu testen.

Um sich aktive Prozesse am Server anzusehen genügt z.B. folgender shell Befehl:

ps aux | grep php

Ich hoffe der Beitrag hat euch gefallen und freue mich über euer Feedback.

MFG

Andreas


Kommentare

by:

Freedom Not Fear 2008

Freiheit statt Angst


Kommentare

by:

Hallo,

jetzt ist es endlich soweit, ich fahr 2 Wochen nach Italien und Kärnten :)

Ich werde also die Tage nichts Neues veröffentlichen und wünsch euch eine schöne Zeit.

BTW. ist seit heute die Webseite unter http://codejungle.org erreichbar, Spenden willkommen.

In der Zwischenzeit kann ich auf mein anderes Projekt http://hackers.ath.cx verweisen, das zumindest täglich aktualisiert wird.

Also macht es gut!

LG

Andreas


Kommentare


Seiten: