Hi,
ich habe schon seit geraumer Zeit das Problem viele Sleep Verbindungen bei mysql Verbindungen zu haben. Damit der load nicht zu hoch steigt wurde wait_timeout auf 3 Sekunden gesetzt. Das ist natürlich nicht die ideale Lösung aber für den Anfang reicht es erstmals. Jedoch will ich das Problem nun endlich lösen, die Frage ist nur woran es liegt.
Man muss dazu sagen dass auf den Server viel zugegriffen wird, ca. 320 Queries pro Sekunde. Es wird ein Datenbank Wrapper zum Connecten und closen der Verbindungen ausgeführt. Hierbei werden alle Verbindungen immer zusätzlich am Ende eines Scriptes geclosed. Verwendet wird hierbei logischerweiße mysql_connect.
Wie bereits erwähnt: Ohne wait_timeout niedrig zu setzen bleiben die meisten Verbindungen Ewigkeiten offen und das bremst natürlich das ganze System aus.
Hat jemand Ratschläge zur Eingrenzung des Problems?
Mysql sleep Prozesse
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
gepostet vor 17 Jahre, 8 Monate von mifritscher
meine erste Idee wäre mysql_pconnect gewesen, das du aber nicht verwendest...
Laufen da manche Scripte quasi unendlich lang? unsichtbare Aufräumaktionen nachdem die Seite fertig abgeschickt ist, die nie zum Abschluss kommen?
Einfachster Fall: der Wrapper beendet sie nicht (richtig)? Nicht lachen, jeder hat schon mal debug-Zeilen vergessen...
Logge doch mal irgendwo alle neuen und beendeten DB-Verbindungen im Wrapper. Vielleicht wurde nicht alle Ausstiegsmöglichkeiten berücksichtigt? V.A. auch der userseitige Abbruch...
Laufen da manche Scripte quasi unendlich lang? unsichtbare Aufräumaktionen nachdem die Seite fertig abgeschickt ist, die nie zum Abschluss kommen?
Einfachster Fall: der Wrapper beendet sie nicht (richtig)? Nicht lachen, jeder hat schon mal debug-Zeilen vergessen...
Logge doch mal irgendwo alle neuen und beendeten DB-Verbindungen im Wrapper. Vielleicht wurde nicht alle Ausstiegsmöglichkeiten berücksichtigt? V.A. auch der userseitige Abbruch...
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
nein kein Script läuft unendlich lang.
Selbst wenn der Wrapper sie nicht beenden sollte, wird normalerweiße immer die Verbindung geschlossen wenn der PHP Script geladen wurde.
Man könnte das zwar loggen aber wird nicht viel helfen da ja auch manchmal die verbindungen durch das beenden des Scriptes automatisch geschlossen werden.
Der Userseitige Abbruch ist egal. PHP wird immer zu ende geparsed egal ob der User abbricht oder nicht.
Selbst wenn der Wrapper sie nicht beenden sollte, wird normalerweiße immer die Verbindung geschlossen wenn der PHP Script geladen wurde.
Man könnte das zwar loggen aber wird nicht viel helfen da ja auch manchmal die verbindungen durch das beenden des Scriptes automatisch geschlossen werden.
Der Userseitige Abbruch ist egal. PHP wird immer zu ende geparsed egal ob der User abbricht oder nicht.
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
ok ein Problem wurde gefunden und zwar, dass kein Dekonstruktor bei php4 funktioniert. Der Dekonstruktor würde derzeit die Verbindungen schließen falls diese auf wundersame Weiße doch nicht bei beenden des Scriptes geschlossen werden.
Hat jemand das selbe Problem dass Verbindungen nicht automatisch bei beenden des Scriptes geschlossen werden oder verwendet ihr zusätzlich mysql_close(); ?
Hat jemand das selbe Problem dass Verbindungen nicht automatisch bei beenden des Scriptes geschlossen werden oder verwendet ihr zusätzlich mysql_close(); ?
gepostet vor 17 Jahre, 8 Monate von duschendestroyer
ist der server ein MAC?
hörte stimmen die sagten das auf einem MAC die mysql verbindungen nicht automatisch geschlossen werden
hörte stimmen die sagten das auf einem MAC die mysql verbindungen nicht automatisch geschlossen werden
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
Nein ist kein MAC. Ist ein Linux Server.
Kann man das evt zusätzlich einstellen ob bei beenden des Scriptes die Verbindungen geschlossen werden?
Kann man das evt zusätzlich einstellen ob bei beenden des Scriptes die Verbindungen geschlossen werden?
gepostet vor 17 Jahre, 8 Monate von Nuky
puh.. normal passiert das automatisch.
ev. mit register_shutdown_function("deinedestructorfunktion"); versuchen?
ev. mit register_shutdown_function("deinedestructorfunktion"); versuchen?
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
ist zwar ein guter Ansatz und funktioniert auch nur leider spuckt er mir dann aus:
Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource
class db {
var $link;
// Konstruktor
function db()
{
register_shutdown_function(array($this, "__destruct"));
return true;
}
// Connect
...
...
// Dekonstruktor
function __destruct() {
mysql_close($this->link);
}
}
?>
Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource
class db {
var $link;
// Konstruktor
function db()
{
register_shutdown_function(array($this, "__destruct"));
return true;
}
// Connect
...
...
// Dekonstruktor
function __destruct() {
mysql_close($this->link);
}
}
?>
gepostet vor 17 Jahre, 8 Monate von TheUndeadable
> register_shutdown_function(array(&$this, "__destruct"));
In der PHP-Doku wird noch ein & empfohlen. Weiß nicht, ob dies das Problem ist.
In der PHP-Doku wird noch ein & empfohlen. Weiß nicht, ob dies das Problem ist.
gepostet vor 17 Jahre, 8 Monate von HSINC
also bis jetzt hab ich sleep prozesse nicht grad als perffresser ausgemacht
gepostet vor 17 Jahre, 8 Monate von Toby
Wenn die Shutdown-Funktion aufgerufen wird, ist die DB-Verbindung schon geschlossen, kA warum.
Wollte eigentlich über die Dekonstruktoren noch letzte DB-Updates machen lassen, das geht eben leider nicht.
Wollte eigentlich über die Dekonstruktoren noch letzte DB-Updates machen lassen, das geht eben leider nicht.
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
@TheUndeadable: Hab es mit und ohne das "&" versucht. Ändert an der Problematik nichts.
@HSINC: Wenn du dauernd 20 oder mehr sleep prozesse hast die nie geschlossen werden und diese dann schon über 100 sekunden laufen zieht das die Performance schon stark runter. Ok ich muss auch sagen der Server ist nicht der beste jedoch sollte das eigentlich nicht sein dass durchgängig sleep verbindungen existieren. Finde das nicht optimal.
@Toby: Ja so scheint es mir auch. Wobei das wiederum unlogisch erscheint da die Verbindungen ja zwar bei Beendigung des Scriptes geschlossen werden, aber der Dekonstruktor eigentlich ja noch zum Script mit dazu gehört. Ich werde mal einen Prüfmechanismus einbauen der testet ob die Verbindungen noch bestehen um herauszufinden ob das wirklich der Fall ist.
@HSINC: Wenn du dauernd 20 oder mehr sleep prozesse hast die nie geschlossen werden und diese dann schon über 100 sekunden laufen zieht das die Performance schon stark runter. Ok ich muss auch sagen der Server ist nicht der beste jedoch sollte das eigentlich nicht sein dass durchgängig sleep verbindungen existieren. Finde das nicht optimal.
@Toby: Ja so scheint es mir auch. Wobei das wiederum unlogisch erscheint da die Verbindungen ja zwar bei Beendigung des Scriptes geschlossen werden, aber der Dekonstruktor eigentlich ja noch zum Script mit dazu gehört. Ich werde mal einen Prüfmechanismus einbauen der testet ob die Verbindungen noch bestehen um herauszufinden ob das wirklich der Fall ist.
gepostet vor 17 Jahre, 8 Monate von Toby
Wird vielleicht "unsauber" geschlossen? Soll heißen, gibt es da einen expliziten Aufruf von mysql_close oder lässt du einfach PHP beim beenden des Scripts das machen?
Benutzt du evt. eine veraltete PHP-Version und das Verhalten ist ein bekannter Bug?
Was für Querys werden den normalerweise benutzt, könnten die "DELAYED" sein und der Effekt dadurch auftreten?
Benutzt du evt. eine veraltete PHP-Version und das Verhalten ist ein bekannter Bug?
Was für Querys werden den normalerweise benutzt, könnten die "DELAYED" sein und der Effekt dadurch auftreten?
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
@ Toby: Da es ja nicht automatisch geschlossen wird bei beenden des Scriptes wird zusätzlich mysql_close(); ausgeführt. Jedoch hilft selbst das nichts.
Php Version ist: 4.4.0
Jedoch weiss ich nicht ob das ein bekannter Bug ist.
Es werden keine queries mit "DELAYED" bei uns genutzt.
Php Version ist: 4.4.0
Jedoch weiss ich nicht ob das ein bekannter Bug ist.
Es werden keine queries mit "DELAYED" bei uns genutzt.
gepostet vor 17 Jahre, 8 Monate von Agmemon
Auch wenn es nicht die Lösung für die Ursache ist, schau dir mal mtop/mkill bei Sourceforge an. Mit mkill müsstest Du die Verbindungen automatisch kappen können, wenn sie hängen bleiben.
gepostet vor 17 Jahre, 8 Monate von pHoEnIx-sTyLe
@ Agmemon: Thx werd mir das mal durchlesen.
Also was ich schonmal zur Problematik sagen kann ist, dass ich das Problem auf einem älteren Server auch hatte. Meines Wissen war es damals auch PHP 4.4.0.
Nach kurzen Tests auf meinem 2. Server mit PHP 5.2.0 konnte ich das Problem nicht feststellen.
Hat jemand ähnliche Probleme mit der PHP Version?
Also was ich schonmal zur Problematik sagen kann ist, dass ich das Problem auf einem älteren Server auch hatte. Meines Wissen war es damals auch PHP 4.4.0.
Nach kurzen Tests auf meinem 2. Server mit PHP 5.2.0 konnte ich das Problem nicht feststellen.
Hat jemand ähnliche Probleme mit der PHP Version?