Belastbarkeit von mySQL (und PHP)

Post Reply
Message
Author
latex
Posts: 63
Joined: 28. Apr 2004 13:34

Belastbarkeit von mySQL (und PHP)

#1 Post by latex »

Hallo,

hat jemand hier praktische Erfahrungen darüber, wie mySQL mit intensiver Nutzung umgeht? In der Literatur ist immer die Rede von maximalen 10 Verbindungen zu einem Zeitpunkt. Wie wirkt sich diese Begrenzung in der Praxis aus, wenn womöglich zu Stoßzeiten mehrere hundert Anwender auf eine Datenbank zugreifen?

Vieleicht kennt jemand Browsergames wie z.B. Droidwars (www.droidwars.de). Das hat zur Zeit knapp über 20000 (zwanzig tausend) User. Die Datenbankabfragen sind zwar recht kurz, werden ja nur einpaar ascii-Zeichen übertragen, aber trotzdem kann ich mir nicht Vorstellen, wie das mySQL mit den maximalen zehn Verbindungen hinbekommen soll. Oder hab ich da was mit den zehn Verbindungen falsch verstanden?

Leander Hanwald
Posts: 109
Joined: 13. Apr 2004 6:23

#2 Post by Leander Hanwald »

Wer sagt das MySQL nur 10 parallele Verbindungen hinbekommt? Je nach Server und Abfragen können es beliebig viele sein, ein DB Server den ich betreibe schwankt so um die 30 herum (also auch nicht soo viel)

latex
Posts: 63
Joined: 28. Apr 2004 13:34

#3 Post by latex »

Leider kann ich die Quelle gerade nicht finden. Es ging auf jeden Fall um persistente Verbindungen, also solche, die während der gesammten Session mit der Datenbank verbunden bleiben. Der Autor empfahl für die meisten Anwendungen nicht-persistente Verbindungen, da eben die Verbindungsanzahl begrenzt sei und sich dies auch nicht durch Konfigurationsänderungen erhöhen ließe.

Da du aber diese besagten zehn Verbindungen überschritten hast, ist entweder dem o.g. Autor ein Fehler unterlaufen oder ich habe da was falsch verstanden. Ich werde versuchen, die Quelle ausfindig zu machen und hier zu Posten.

Danke für deine Hilfe und deinen Beitrag :)


(P.S. Vieleicht sollte ich mal ein Skript schreiben, das per Schleife solange SQL-Verbindungen aufmacht, bis mein PC abschmiert *grübel*)

Thomas Gelf

Belastbarkeit von PHP & MySQL - Persistente Verbindungen

#4 Post by Thomas Gelf »

Alles Quatsch!

Dass das mit den persistenten Verbindungen von PHP ein Problem ist glaube ich gerne.

Als Beispiel: Ich habe vor ca. einem halben Jahr die Wartung eines Debian Servers übernommen. Der ursprüngliche Admin hatte MySQL auf 500 maximal zulässige Verbindungen konfiguriert - und auch an diesem Limit ist er immer wieder angestoßen. Mailserver, FTP und alle Dienste, welche auf der Datenbank arbeiteten wurden damit blockiert. Der Typ wollte schon das Limit weiter erhöhen (ich habe keine Ahnung wo die Grenze liegt - hab's noch nie benötigt) - ich habe es stattdessen auf 50 heruntergesetzt und die persistenten PHP-MySQL-Verbindungen deaktiviert.

Der Grund: die persistenten Connections von PHP waren nicht limitiert. Jede Menge PHP Scripte öffneten persistente Verbindungen, die auch alle brav geöffnet blieben. Mit ein bißchen Traffic ist es so ein leichtes 50, 100, 500 und mehr gleichzeitige Verbindungen aufzubauen - PHP öffnet sie, läßt sie offen - nur genutzt werden sie kaum.

Ich habe dem PHP die persistenten Verbindungen verboten (Skripte, die sie verwenden laufen trotzdem) - der Server dümpelt irgendwo zwischen 5 und 10 gleichzeitigen Verbindungen. Wer will kann auch ein vernünftiges Limit setzen (20 oder so) - ich würde sie aber komplett abschalten. Ein Limit von 20 persistenten Verbindungen bedeutet aber NICHT, dass PHP dann keine weiteren mehr aufbauen kann - lediglich 20 bleiben aber persistent, also geöffnet.

Persistente Verbindungen sollen einen Geschwindigkeitsvorteil bringen - und es gibt tatsächlich "Programmierer" welche der Meinung sind, man könne ohne persistente Connections keine vernünftig schnellen PHP Scripte schreiben. Meist die selben "Programmierer", die "magic quotes" und "register globals" für die zwei besten Erfindungen seit der Entdeckung des Internets halten.

Ich halte das für Blödsinn, ich kenne keine Anwendung, wo der Verbindungsaufbau ins Gewicht fallen würde - auch wenn es sie sicher geben wird. Sogar bei einer doppelt-ssh-getunnelten Verbindung durch zwei Firewalls und über Router, welche zum Teil Trafficshaping aktiviert hatten, gab es keine Probleme ohne persistente Verbindungen.

Ich glaube ich kann behaupten ein klein wenig an Erfahrung mit Traffic- und Datenbank-intensiven PHP-Anwendungen und -Seiten zu haben. In manchen Anwendungen messen wir die benötigte Zeit für jede einzelne Query, jeden kleinen Parser - einfach alles. Und die Zeit für den Verbindungsaufbau mit MySQL (welche meist sogar lediglich über einen lokalen Socket angesprochen wird) ist lächerlich gering.

Habs gerade mit einem alten Pentium 4 mit zu Tode konfiguriertem alten RedHat und veraltetem MySQL versucht (nicht nur verbinden/trennen, sondern ein neues Objekt einer Datenbankklasse instanzieren, über selbiges die Verbindung erstellen und wieder abbauen):
Verbindungsaufbau: 0,000475 Sekunden, also 0,5 Millisekunden
Verbindungsabbau: 0,000066 Sekunden, also ca 0,07 Millisekunden
Habs ein paar mal hintereinander versucht - der längste Verbindungsaufbau dauerte 4 Millisekunden.

Da ich nicht weiß wie genau man solch kleine Werte nehmen kann habe ich noch in einer Schleife 1.000 mal meine Datenbankklasse instanziert und die Verbindung auf- und wieder abgebaut ($x=new db;$x->connect;$x->disconnect;). Gesamtdauer: in 20 Tests immer zwischen 0,3 und 0,4 Sekunden für alle 1.000 Verbindungen - also ca 0.35 Millisekunden pro Verbindungsauf- und -abbau - und ich bin sicher mit einer anständig konfigurierten Kiste geht's um einiges schneller.

Habe mir gerade die Statistik auf einem alten Pentium 3 (Uptime 917 Tage) angesehen - in den letzten 100 Tagen durchschnittlich 5.651 Verbindungen (Auf- und Abbau, nicht gleichzeitige) pro Stunde - durchschnittlich 1,5 Verbindungen und 6 Queries pro Sekunde. Die gleiche Kiste hatte vor einiger Zeit noch konstant einen Durchschnitt von 20 Queries pro Sekunde, wir haben dann ein paar Anwendungen etwas optimiert. Die Größe der Datenbanken auf dieser alten Kiste beträgt übrigens 1,5 Gigabyte.

MySQL ist wirklich ein braves Arbeitstier - hatte schon Tabellen mit 15 Millionen Zeilen darauf laufen - ist nicht ganz so schnell wie mit 50.000 - aber annehmbar. So richtige Vergleichsmöglichkeit hatte ich noch keine, PostgreSQL interessiert mich - als ich mich das letzte Mal damit beschäftigt habe gabs aber noch keine brauchbare freie Replikationsmöglichkeit - wie's heute aussieht weiß ich nicht.

So, jetzt reicht's - wenn ich mich über etwas aufrege schreibe ich immer gleich Romane :roll: Ich hoffe ich konnte weiterhelfen!

Post Reply