Wir haben ihnen von mehr RAM abgeraten.
Ein Onlineshop für Haushaltswaren hatte einen Morgen voller «too many connections»-Fehler. Die naheliegende Lösung war mehr RAM. Die Daten sagten, geben Sie das Geld nicht aus: Das Working Set passte bereits in den Speicher, und die Antwort lag in den Regeln der Anwendung selbst.
In diesem Artikel 3 Abschnitte
- Die Datenbank eines Onlineshops für Haushaltswaren begann eines Morgens ERROR 1040: Too many connections zurückzugeben, unmittelbar nachdem ihr Temp-Table-Speicher vollgelaufen war.
- Die naheliegende Lösung war mehr RAM: Eine Datenbank, die größer ist als ihr Buffer Pool, sieht ausgehungert aus. Den Pool zu vergrößern hätte Geld gekostet und nichts behoben.
- Die Messung entschied anders. Der Buffer Pool traf seinen Cache fast jedes Mal und hatte noch Platz übrig. Das Working Set war bereits im Speicher.
- Die eigentliche Ursache war eine Rabattregel-Tabelle, die weit über das hinausgewachsen war, was der Shop brauchte. Die Lösung lag in den Regeln der Anwendung, nicht in mehr RAM.
Es begann als ein Morgen voller Verbindungsfehler. Der Temp-Table-Speicher, auf tmpfs, war vollgelaufen, und Sekunden später begann die Datenbank mit ERROR 1040: Too many connections zu antworten. Unser Bereitschaftsingenieur hatte es innerhalb weniger Minuten auf dem Bildschirm, und wir haben es von Anfang an gemeinsam mit den Entwicklern des Shops bearbeitet.
temp-table space (tmpfs) ........ FULL
… seconds later …
mysqld: ERROR 1040 (HY000): Too many connectionsDie teure Antwort, und warum wir sie beiseitelegten
Eine Datenbank, die größer ist als ihr Buffer Pool, und freier Speicher auf der Maschine. Jede oberflächliche Kennzahl zeigt in dieselbe Richtung: Geben Sie dem Pool mehr RAM, fertig. Es sieht nach Fortschritt aus und kostet echtes Geld. Die Messung sagte, es würde nichts beheben.
| DIE TEURE ANTWORT | WAS DIE DATEN SAGTEN |
|---|---|
| Die Datenbank ist größer als der Pool. Vergrößern Sie den Pool. | Die Cache-Trefferquote war nahezu perfekt. Das Working Set lebte bereits im Speicher. |
| Ein größerer Cache behebt den Überlauf. | Der Pool hatte bereits ungenutzten Platz. Mehr RAM hätte Daten gecacht, die schon im Cache waren. |
| DIE DATEN HABEN GEWONNENHardware dazu, Problem gelöst. | Die überdimensionierte Tabelle wächst hinter dem größeren Pool weiter, bis sie erneut überläuft. |
Zwei Messwerte entschieden die Frage. Der Buffer Pool verfehlte fast nie, und er hatte noch freie Seiten übrig. Zusammen sagen sie eines: Das Working Set passte bereits vollständig in den Speicher. Es warteten keine Daten auf der Festplatte, die ein größerer Cache hätte halten können.
Die eigentliche Ursache steckte in den Tabellengrößen
Mit dem Speicher außer Verdacht gingen wir zu den Tabellengrößen. Eine Tabelle stach heraus: die Tabelle der Rabattregel-Kombinationen, mit großem Abstand das größte Objekt in der Datenbank.
Diese Tabelle wird aus den aktiven Rabattregeln des Shops erzeugt, und die Kombinationen wachsen mit dem Quadrat der Regelanzahl. Mit der Zeit hatten sich die Regeln angesammelt, und die Tabelle war mit ihnen gewachsen. Abfragen auf ihr ließen den Temp-Table-Speicher überlaufen, und dieser Überlauf mündete in eine Erschöpfung der Verbindungen. Der Fehler 1040 war der letzte Dominostein, nicht der erste.
# table name is an illustrative rename.
> table sizes, largest first
discount_rule_combinations largest table by a wide margin
↳ generated from the active discount rules
↳ combinations grow with the SQUARE of the rule countDie disziplinierte Antwort und die teure Antwort zeigten in entgegengesetzte Richtungen
Ein größerer Pool hätte Zeit gekauft, und die Tabelle wäre dahinter weiter gewachsen. Nur eine Antwort berührte die tatsächliche Ursache: die Rabattregeln aufräumen, die Kombinationen begrenzen und die Hardware lassen, wie sie war. Die Entwickler des Shops nahmen die Änderung vor, und die Fehler hörten auf.
Die Maschine war nie das Problem. Die Daten zeigten, dass das Working Set bereits in den Speicher passte, also lag die Lösung in den Regeln der Anwendung, nicht in mehr RAM. Das Nützlichste, was wir diesem Kunden geben konnten, war nicht mehr von unserer Hardware. Es war ein Grund, sie nicht zu kaufen.
“Manchmal ist das Wertvollste, was Ihnen ein Hosting-Anbieter sagen kann: Geben Sie das Geld nicht aus.”
Klare Antworten
Meine Datenbank meldet «ERROR 1040: Too many connections». Soll ich das Verbindungslimit erhöhen?+
In der Regel nein. Eine höhere Obergrenze behebt nicht, was die Verbindungen offen hält, sie lässt nur mehr davon auflaufen, bevor etwas auslöst. Ein vernünftiges Limit schlägt schnell fehl und hält den Schaden klein. Finden Sie heraus, was die Sitzungen festhält, bevor Sie die Zahl erhöhen.
Soll ich mehr RAM einbauen, wenn meine Datenbank größer ist als mein Buffer Pool?+
Nicht allein aufgrund dieser Tatsache. Die Zahl, die es entscheidet, ist die Trefferquote des Buffer Pools, nicht die Größe auf der Festplatte. Wenn der Pool bereits fast jedes Mal trifft und freie Seiten hat, passt das Working Set in den Speicher, und mehr RAM würde Daten cachen, die bereits gecacht sind.
Was ist eine normale Trefferquote für den InnoDB Buffer Pool?+
Über 99 Prozent, sobald das Working Set in den Speicher passt. Wenn der Pool bereits dort ist und noch freie Seiten hat, bringt ein größerer Pool nichts. Sehen Sie sich stattdessen die Abfragen an.
Warum läuft der Temp-Table-Speicher meiner MySQL immer wieder voll?+
Meist eine Abfrage, die weit mehr Zwischenzeilen erzeugt, als das Ergebnis braucht. Hier ließ eine sehr große Rabattregel-Tabelle den Temp-Table-Speicher überlaufen, was dann in eine Erschöpfung der Verbindungen mündete. Die Lösung lag in den Daten, nicht auf der Festplatte.
Wird EuroVPS mir raten, ein Upgrade nicht zu kaufen?+
Ja, wenn die Daten sagen, dass das Upgrade nichts behebt. Wir gehen lieber der eigentlichen Ursache nach, als Ihnen Hardware zu verkaufen, die sie verdeckt. In diesem Fall lautete die ehrliche Antwort: Vergrößern Sie den Buffer Pool nicht, räumen Sie die Regeln auf.
Bevor Sie das Upgrade kaufen, lassen Sie uns die Zahlen lesen.
Wenn eine größere Maschine es beheben würde, sagen wir das. Wenn sie nur die eigentliche Ursache verdecken würde, sagen wir auch das, mit der Messung.
Mit einem Ingenieur sprechenSie haben das Ende erreicht.
Setzen Sie das Gelesene um
Was betreiben Sie?
Erzählen Sie uns von Workload, Traffic und Anforderungen an die Wiederherstellung. Beginnen Sie mit dem Server-Konfigurator oder besprechen Sie die Details mit einem Ingenieur.
Geschrieben von den Ingenieuren, die die beschriebene Infrastruktur bauen und betreiben.Mit einem Ingenieur sprechen
