Verbindung zu mySQL mit php (too many connections)

Edemund

Erfahrenes Mitglied
Hallo,
ich habe eine relativ undefinierte Frage, die mehr ein Abtasten eines in meinen Augen etwas undefinierten Problembereichs ist, aber vielleicht hat trotzdem einer eine Idee.

Meine Seite ist von der Grundstruktur her so aufgebaut, dass man per "Include-System" navigiert. Dh. über eine in der URL (zB http://www.seite.de?navigation=home) übergebene Variable weiß das Script welche (variable) Datei es includen muss. "Oben" über der variablen Datei include ich alle konstanten Daten, die die variable Datei benötigt, wie zB die Verbindung zu mySQL oder die Funktionen.
"Unten" unter der Variablen Datei schließe ich die MySQL-Verbindung mit mysql_close().

Der Aufbau ist also immer so:

konstanter Teil oben (Funktionen, Verbindung etc.)

Variabler Teil

konstanter Teil unten (mysql_close() )

Zusätzlich habe ich die Datenbank soweit mein Kenntnisstand reicht optimiert, dh. mit Indizes versehen, Entitäten getrennt usw.
Die Datenbankabfragen habe ich ebenfalls so optimiert wie ich es für am besten hielt, dh. möglichst wenige Abfragen, Abfragen in JOINS zusammenfassen, COUNT, SUM etc. anstatt von mysql_num_rows und ähnlichen Konsorten verwenden etc.

Trotzdem bekomme ich bei Stoßzeiten (100 oder mehr User gleichzeitig) auf meiner Seite immer kurzfristig den too many connections error. Der Default Wert der too many connections ist 100 und ich kann ihn leider auch nicht von meinem Hoster ändern lassen.

Ich habe bereits persistente Verbindungen ausprobiert und eine mysql_query-Funktion geschrieben, die direkt nach jeder Query (in diesem Fall natürlich mit nichtpersistenter Verbindung) mysql_close() aufruft und wieder schließt, mit dem Ergebnis, dass die Performance wirklich in den Keller ging.

Der Server auf dem meine Seite liegt hat 512 RAM, die Datenbank ist ca. 300 MB groß und hat um die 200 Tabellen.

Hatte irgendeiner schon ein ähnliches Problem und eine Idee wo bei mir der Flaschenhals liegen könnte?
Dh. mehr Hardware reinschieben oder Max-Connections erhöhen (= Hosterwechsel, was im Serversegment natürlich immer etwas längere Überlegung braucht bei meist mind. 1 Jahr Vertragslaufzeit) oder irgendwelche eklatanten Programmierfehler ausbügeln, die ich übersehen habe?

Würde mich freuen, wenn mir jemand helfen könnte,

viele Grüße,
Edemund
 
Also wenn eine Datenbank von 300MB Groesse und 200 Tabellen auf einem Server mit nur 512MB RAM (welcher Server hat heutzutage nur ein halbes GB?) liegt dann duerfte die Datenbank wohl der Flaschenhals sein.
Ich kann mir naemlich kaum vorstellen, dass das in irgendeiner Art auch nur annaehernd performant laufen soll.
Sobald der Datenbank-Server startet duerfte der Arbeitsspeicher recht voll sein. Und das bedeutet Swapping, was wiederum bedeutet, dass Performance verloren geht da staendig Teile ausgelagert und wieder aktiviert werden muessen.
Und auch, dass nur 100 Verbindungen bei einem solchen Server moeglich sind ist nicht verwunderlich, bei mehr wuerde es wahrscheinlich absolut zum DoS kommen.

Ich wuerde Dir empfehlen mit dem Hoster ueber ein Upgrade zu reden, dann musst Du wenigstens nicht wechseln.
 
Zusammenfassende Joins sind nicht unbedingt immer mehreren Abfragen vorzuziehen. Denn Joins können mitunter sehr kostenintensiv sein, besonders wenn auch die Joins selbst nicht optimiert sind, da beispielsweise die Reihenfolge der zu vereinigenden Tabellen ineffizient ist.

Persistente Verbindungen können sich nur lohnen, wenn PHP als Modul läuft und die persistenten Verbindungen nicht entgegen ihrer Art direkt wieder geschlossen werden. Denn dann können sie auch nicht persistent sein.
 
Hallo,

entschuldigt das hochposten, ich wollte nur kurz berichten wie die Geschichte weiterging, falls das vllt. einem edlen Nutzer der Suchfunktion später von Hilfe ist :) :

Habe mir die zwei Postings über mir zu Herzen genommen und servertechnisch ein wenig tiefer in die Tasche gegriffen, sowie wieder mysql_connect() anstelle mysql_pconnect() verwendet und ein paar JOINS "entflochten".

Der RAM wurde auf 1024 verdoppelt, die CPU(s) sind jetzt 2x Athlon 64 3800+ und das Problem scheint soweit ich es überblicke nun überhaupt nicht mehr aufzutreten (Seite läuft erst seit einigen Tagen unter Volllast auf dem neuen Server).

Vielen dank an dieser Stelle!

Liebe Grüße,
Edemund

Edit + PS: bzgl. des "welcher Server hat heutzutage" - der Server war nicht mehr ganz "state of the art", ich hatte ihn bereits seit zwei Jahren, größtenteils auch wegen des Preises. Betreibe da drauf ein Pferde-Browsergame, das natürlich größtenteils Mädchen im Alter von 10-16 anzieht, die kaum Geld für einen Premium-Acc übrig hätten, so dass ich alles über Werbung machen muss/ will. Finanzkraft des Spiels und eigentlich nötige Server-Ausstattung stehen somit meist in keinem Verhältnis :)
 
Zuletzt bearbeitet:
Zurück