Die Protokollierung beeinträchtigt die MySQL-Leistung - aber warum?

9

Ich bin ziemlich überrascht, dass ich weder auf der Website noch in der MySQL-Dokumentation eine Antwort darauf finden kann ( Abschnitt 5.2 scheint die Protokollierung ansonsten gut abgedeckt zu haben!).

Wenn ich Binlogs aktiviere, wird (subjektiv) ein kleiner Leistungseinbruch angezeigt, der mit einem kleinen zusätzlichen E / A zu erwarten ist. Wenn ich jedoch ein allgemeines Abfrageprotokoll aktiviere, wird ein enormer Leistungseinbruch angezeigt (doppelte Zeit zum Ausführen von Abfragen). oder schlimmer), weit über das hinaus, was ich mit Binlogs sehe. Natürlich protokolliere ich jetzt jedes SELECT sowie jedes UPDATE / INSERT, aber andere Daemons zeichnen jede Anfrage (Apache, Exim) auf, ohne anzuhalten.

Sehe ich nur die Auswirkungen der Nähe zu einem "Wendepunkt" der Leistung, wenn es um E / A geht, oder ist das Protokollieren von Abfragen etwas grundlegend Schwieriges, das dies verursacht? Ich würde gerne in der Lage sein, alle Abfragen zu protokollieren, um die Entwicklung zu vereinfachen, aber ich kann die Art von Hardware nicht rechtfertigen, die wir benötigen, um die Leistung bei der allgemeinen Anmeldung von Abfragen wiederherzustellen.

Ich protokolliere natürlich langsame Abfragen, und es gibt eine vernachlässigbare Verbesserung der allgemeinen Verwendung, wenn ich dies deaktiviere.

(All dies ist unter Ubuntu 10.04 LTS, MySQLd 5.1.49, aber die Forschung legt nahe, dass dies ein ziemlich universelles Problem ist.)

James Green
quelle

Antworten:

9

Allgemeine Abfrageprotokolle sind viel mehr E / A als Binärprotokolle. Neben der Tatsache, dass die meisten SQL Server zu 90% gelesen und zu 10% geschrieben werden, werden die Binärprotokolle in einem Binärformat gespeichert und nicht in einfachem Text, der weniger Speicherplatz benötigt. (Wie viel weniger Platz? Ich bin nicht sicher. Entschuldigung.)

Es gibt zwei Aspekte, warum Apache und Exim jede Anforderung ohne wesentliche Auswirkungen auf die Leistung aufzeichnen können. Das erste ist, dass sie die Tatsache aufzeichnen, dass eine Anfrage stattgefunden hat, aber was sie in das Protokoll eintragen, ist normalerweise erheblich kleiner als die tatsächliche Anfrage. Eine HTTP-Anforderung ist häufig doppelt so groß wie die Zeile im Protokoll, und selbst eine kurze Nur-Text-E-Mail ist 10- oder 20-mal größer als die dazugehörige Protokollzeile. Bei einer E-Mail mit einem 10-MB-Anhang werden nur noch wenige Zeilen in das Protokoll geschrieben.

Der zweite Teil davon ist, dass in einer normalen Webanwendung normalerweise Dutzende von SQL-Abfragen einer einzelnen HTTP-Seite zugeordnet sind. E-Mails kommen in der Regel in noch geringerer Anzahl als HTTP-Anfragen. Ihr MySQL-Server versucht wahrscheinlich, viel mehr als Apache oder Exim zu protokollieren.

Sehen Sie sich am Ende des Tages die Größe (unkomprimiert) Ihrer MySQL-Binär- und allgemeinen Protokolle sowie Ihrer Apache- und Exim-Protokolle an. Ich wette, Sie finden, dass das allgemeine MySQL-Protokoll mit einem Faktor von mindestens 5 das größte ist.

Ladadadada
quelle
1
Einige gute Punkte - insbesondere ja, ein einzelnes GET für unsere Anwendung kann Hunderte von SELECTs verursachen, da wir, obwohl wir versuchen, so viel wie möglich in einer einzelnen Abfrage zu tun, manchmal die Leistung / Sauberkeit dieser Anwendung abwägen elegantere Struktur, besser lesbarer Code und eine sauberere Datenbank. (Abgesehen davon begann das Ganze damit, über das Protokollieren von Inhalten von POSTs sowie die URL von GETs zu sprechen, da wir die Parameter sehen, die CGI.pm in einem Fall und nicht im anderen sieht, und von dort aus in das Anmelden / Ausführen Allgemeines). Wie auch immer, es sind ein paar Stunden vergangen, also akzeptiere die Antwort. Vielen Dank!
James Green
4

Um die bereitgestellte Antwort zu ergänzen , wird auch ein Leistungseinbruch angezeigt, wenn Sie sich auf demselben Gerät anmelden, auf dem sich Ihre MySQL-Datenspeicher befinden. Wenn es sich um dieselbe Festplatte handelt, werden Sie an mehreren Speicherorten lesen und schreiben die ganze Zeit, verlangsamt den gesamten Prozess.

Dies gilt auch dann, wenn es sich um eine andere Partition auf derselben physischen Festplatte handelt.

Wenn die Protokollierung auf einem anderen Gerät erfolgt, sollten einige Leistungsprobleme behoben werden.

Labyrinth
quelle
1
Für meine Situation nicht relevant - es handelt sich um eine gehostete VM, und die DBs befinden sich auf einem separaten logischen Volume für / var, das wiederum von demselben Speicherarray bereitgestellt wird. Ich nehme an, theoretisch könnten sie sich auf denselben Spindeln befinden, aber es würde sich wie ein verdammter Zufall anfühlen :-) Abgesehen von +1, da dies für jemanden mit z. B. einem Standard-Debian / Ubuntu-Setup (DBs in) absolut relevant wäre / var / mysql, meldet sich bei / var / log an!
James Green
@ Jimbo - danke für die Requisiten, auch wenn es nicht direkt auf Ihre spezielle Situation anwendbar ist :)
Warren