Jede Verbindung kostet Speicher, ob sie arbeitet oder wartet. Auf einem Server, der schon an seiner Speicherdecke ist, das Limit zu erhöhen macht aus einem Datenbankfehler eine swappende Maschine, und das ist schlimmer.
Ansehen, was verbunden ist
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
- Viele Zeilen in Sleep - Verbindungen, die geöffnet und nie geschlossen wurden. Ein Anwendungsproblem, kein Datenbankproblem.
- Viele Zeilen mit DERSELBEN Abfrage - eine langsame Abfrage, die schneller eintrifft, als sie fertig wird. Reparieren Sie die Abfrage.
- Lange Zeilen in Locked - eine Transaktion hält eine Sperre, während sich alles dahinter staut.
Verbindungen, die nie geschlossen werden
Ein Skript, das pro Schleifendurchlauf eine Verbindung öffnet, oder ein Pool persistenter Verbindungen, der größer ist, als der Server erlaubt, erschöpft das Limit, egal wie hoch es steht.
SHOW VARIABLES LIKE 'wait_timeout';
-- default is often 28800: eight hours of holding a sleeping connection
wait_timeout auf wenige Minuten zu senken holt verwaiste Verbindungen zurück. Das ist ein Netz unter einem Leck, keine Heilung.
Wann ein Erhöhen richtig IST
Wenn alle Verbindungen echte Arbeit leisten und der Server Speicher übrig hat, ist das Limit wirklich zu niedrig.
SET GLOBAL max_connections = 300;
-- and in my.cnf so it survives a restart
Rechnen Sie zuerst den Speicher je Verbindung aus. 300 Verbindungen zu je 12 MB sind 3,6 GB, bevor die Datenbank eine einzige Zeile gecacht hat.
Ein plötzlicher Sprung der Verbindungen zu einer festen Uhrzeit ist ein Cronjob und kein Verkehr. Die Prozessliste während der Spitze benennt ihn in einer Zeile.
