2010-10-29 14 views
9

Ich injiziere einen Stresstest in meine Webanwendung, die eine Verbindung zu einem MySQL-Server herstellt, und ich überwache die show processlist von mysql.Mysql show Prozessliste listet viele Prozesse Schlaf und info = null?

Wenn die Last hoch ist (hohe Swap-i/o) ich viele Prozesse wie das bekommen:

| 97535 | db| localhost | userA | Sleep | 515 |   | NULL 
| 97536 | db| localhost | userA | Sleep | 516 |   | NULL 
| 97786 | db| localhost | userA | Sleep | 343 |   | NULL 
| 97889 | db| localhost | userA | Sleep | 310 |   | NULL 

Aber ich kann nicht verstehen, warum sie immer noch da und werden nicht getötet? Dies führt schließlich dazu, dass meine App alle max_connections verwendet und eingehende Anfragen abbricht ...

Irgendeine Idee was sind diese Prozesse und was machen sie da :)?

Antwort

12

Das sind Leerlaufverbindungen, die von einem Client gehalten werden. Sie sollten sicherstellen, dass die von Ihnen verwendete Client-Bibliothek (JDBC, ...) so konfiguriert ist, dass nicht verwendete Verbindungen so lange nicht geöffnet werden oder dass Ihre maximale Anzahl von Verbindungen nicht zu groß ist.

+0

Gibt es eine mysql Timeout-Variable, die ich anpassen kann, um dies zu vermeiden? – AlfaTeK

+4

Sie können wait_timeout auf etwas kleineres setzen (http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout) oder das Verbindungslimit erhöhen. Sie möchten dies jedoch auf der Anwendungsseite wirklich lösen. Das Aufhängen der Verbindung von der Datenbankseite birgt das Risiko, dass eine Verbindung gerade dann geschlossen wird, wenn die Anwendung versucht, sie zu verwenden, wodurch möglicherweise ohne Grund ein Anwendungsfehler verursacht wird. Welche Datenbankverbindungsbibliothek verwenden Sie? –

+0

@ KeithRandall, aber wie die Null-Prozesse zu identifizieren? – Khuram

3

Meine Vermutung ist, dass Sie persistente Verbindungen verwenden, z. pconnect in php:

[..] bei der Verbindung würde die Funktion zunächst versuchen, eine (persistente) Verbindung zu finden, die mit den gleichen Host, Benutzername und Passwort bereits geöffnet ist. Wenn einer gefunden wird, wird eine Kennung zurückgegeben, anstatt eine neue Verbindung zu öffnen

und

[..] die Verbindung mit dem SQL Server nicht geschlossen werden, wenn die Ausführung der Skript endet. Stattdessen wird der Link für die zukünftige Verwendung

offen bleiben musste ich eine ähnliche Situation, und wurde mit Codeigniter mit pconnect eingeschaltet. Nachdem es deaktiviert wurde (see how) wurde jede Verbindung nach der Verwendung ordnungsgemäß geschlossen und meine MySQL-Prozessliste war leer.

Leistung: Obiges streitet nicht über die Leistung, sondern versucht einfach zu erklären, warum Sie möglicherweise eine Menge von Sleeping-Verbindungen in MySQL sehen. Es mag in Bezug auf die Leistung nicht negativ sein, dass die Verbindungen aktiv bleiben. Weitere Informationen unter: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/