[MySQL] Serverload durch Sleep Prozesse

FredRedHead

Well-known member
4 Mai 2006
166
7
Hallo,
ich habe bei einem Script zahlreiche Sleep Prozesse, wenn ich mir per PHPmyAdmin alle aktiven Prozesse der DB anzeigen lassen. Meine Fragen:
a) Was verursacht sleep Prozesse?
b) Wie mach ich sleep verursachende Prozesse am besten ausfindig?
bzw. wie verhindert man dies?

Die ganzen Sleep-Prozesse verammeln mir die DB :ugly:

thx,
Frederic
 
sie entstehen durch Erstellung einer Verbindung mit der Mysql-Datenbank über persistente Verbindungen (mysql_pconnect) welche nicht automatisch von PHP geschlossen werden.
Vereinzelt, was mir unerklärlich ist, entstehen Sie auch im normalen Betrieb, wenn PHP von selbst nicht die Verbindung geschlossen hat, das passiert zwar selten aber es gibt wohl einige bei denen es öfter passiert, am besten du schreibst selbst überall ein mysql_close in die Datei(en).
 
Vereinzelt, was mir unerklärlich ist, entstehen Sie auch im normalen Betrieb, wenn PHP von selbst nicht die Verbindung geschlossen hat, das passiert zwar selten aber es gibt wohl einige bei denen es öfter passiert...

genau deshalb poste ich ja hier. ich habe über google keinen hinweis gefunden, wieso das auftreten kann. Es ist so, dass bei zig Abfragen vllt 1% einen sleep bekommt und im Moment ist da gerade einer mit Sleep 500 Sekunden.. andere sind aber auch nach 5 sekunden wieder weg. :roll:

kann es vllt an einer serverkonfiguration liegen?
 
wie gesagt, durch was sie entstehen, wenn man kein mysql_pconnect verwendet weiß ich nicht, ich habe nur gemerkt, dass es hilft immer manuell die Datenbankverbindung zu schließen.
Wenn es zuviele Dateien zum anpassen wären, kann man auch registriete Shutdown-Funktion nutzen
 
danke für den tipp mit der shutdown funktion... ich benutze nun diese funktion aus dem php manual.
Code:
class fiveclass
{

  function fiveclass()
  {
   return $this->__construct(); // forward php4 to __construct
  }

  function __construct()
  {
   // register __destruct method as shutdown function
   register_shutdown_function(array(&$this, "__destruct"));

   return true;
  }

  function __destruct()
  {
   // finish what where doing;
   mysql_close();
   return true;
  }

}

$obj = new fiveclass();

Problem: Bei meinem Server kommt keine Fehlermeldung. Auf dem fehlerhaften Server kommt die Meldung "Warning: mysql_close(): no MySQL-Link resource supplied in /var/www/web156/html/mysql.php on line 35"

Hat jemand eine Idee warum es da zu einem Unterschied kommt bzw. welche Server-Config das sein könnte? Wenn ich mysql_close($db); ($db ist die Resource-ID als globale Variable), kommt der gleiche Fehler, nur anstelle von no MySQL-Link, 5 MySQL-Link... ich versteh's nicht :yawn:

auf dem "fehlerhaften" Server läuft MySQL 5.0.xx, auf meinem 4.xx... kann es damit etwas zu tun haben?
 
hab es jetzt simpel mit
register_shutdown_function("mysql_close");
gelöst. mal schaun ob es hilft. danke soweit ice-breaker.
 
Ist irgendwie auch logisch, dass es so nun funktioniert. Wenn Du PHP5 einsetzst, wird der Destruktor bei Deiner vorherigen Variante doppelt aufgerufen. Einmal als das, was er ist, nämlich als Destruktor. Beim zweiten Mal durch die register_shutdown()-Funktion. An einer von beiden Stellen wurde die Verbindung schon geschlossen, womit die Ressource nicht mehr vorhanden ist.