Sinnvolles Verständnis der INNODB-Pufferpoolstatistiken

20

Nachdem ich diese Seite in der MySQL-Dokumentation gelesen hatte , versuchte ich, einen Sinn für unsere aktuelle InnoDB-Nutzung zu finden. Derzeit weisen wir 6 GB RAM für den Pufferpool zu. Unsere Datenbankgröße ist ungefähr gleich. Hier ist die Ausgabe von show engine innodb status\G(wir führen v5.5 aus)

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

Ich wollte wissen, wie gut wir den Puffer-Cache nutzen. Nach einem ersten Blick auf die Ausgabe stellte sich heraus, dass wir sie tatsächlich verwenden. Sie basiert auf der Pages made youngund enthält not youngZahlen Buffer pool hit rate is 1000 / 10000.

Was mich durch eine Schleife wirft, ist, warum das young-making rateund notbeide bei 0/1000 sind und das young/sund die non-young/sZugriffe beide bei 0. Diese würden alle anzeigen, dass es überhaupt nicht verwendet wird, richtig?

Kann jemand helfen, einen Sinn daraus zu machen?

Safado
quelle

Antworten:

18
 Buffer pool hit rate is 1000 / 1000

Dies ist der einzig wirklich bedeutsame Wert in der Situation, in der Sie sich befinden ... und diese Situation ist, dass Sie das Glück haben, einen Pufferpool mit einer perfekten Trefferquote von 100% zu haben. Analysieren Sie den Rest nicht übermäßig, da Sie nichts ändern müssen, es sei denn, das Serverbetriebssystem verfügt nur über wenig Arbeitsspeicher und führt zu Auslagerungen.

Die Young / Not Young-Werte sind nicht interessant, wenn der Pufferpool drucklos ist. InnoDB benutzt es, es macht nichts ohne es. Wenn der Pool zu klein ist, werden Seiten entfernt und neue Seiten eingelesen, und die anderen Statistiken helfen Ihnen dabei, das zu verstehen ... aber das ist ein Problem, das Sie anscheinend nicht haben.

Freier "unbenutzter" Speicherplatz im Pool wird von InnoDB niemals vernachlässigt oder im Leerlauf gelassen, wenn er aus irgendeinem Grund benötigt wird. Die Tatsache, dass er frei ist, bedeutet nur, dass Sie einen Freiraum haben, in den Sie entsprechend Ihrer Arbeitsgröße hineinwachsen können Datensatz wächst.

Das ist alles, was es bedeutet, es sei denn, Sie haben den Server kürzlich neu gestartet. In diesem Fall ist er unvollständig. Der Server muss eine vollständige Periode der "normalen" Nutzung (einschließlich vollständiger Sicherungen) durchlaufen, bevor die Statistiken die ganze Geschichte erzählen ... ob das eine Stunde, ein Tag, eine Woche, ein Monat oder ein Jahr ist, hängt von Ihrer Anwendung ab.

Michael - sqlbot
quelle
28

The Buffer pool size 393215 Dies ist in Seiten nicht Bytes.

Gehen Sie wie folgt vor, um die Größe des Pufferpools in GB anzuzeigen:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 Dies ist die Anzahl der Seiten mit Daten im Pufferpool

Gehen Sie wie folgt vor, um die Datenmenge in der Pufferpoolgröße in GB anzuzeigen:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Führen Sie Folgendes aus, um den Prozentsatz des verwendeten Pufferpools anzuzeigen:

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300Dies ist die Anzahl der Seiten im Pufferpool, die in die Datenbank zurückgeschrieben werden müssen. Sie werden auch als Dirty Pages bezeichnet.

Führen Sie Folgendes aus, um den von unsauberen Seiten belegten Speicherplatz anzuzeigen:

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Führen Sie Folgendes aus, um den Prozentsatz der verschmutzten Seiten anzuzeigen:

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Führen Sie für die anderen Dinge in der Anzeige Folgendes aus:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

Sie sehen alle Statusvariablen für den Pufferpool. Sie können dieselben Abfragen auf alle zu untersuchenden Elemente anwenden.

RolandoMySQLDBA
quelle
Vielen Dank! Daraus ergibt sich, dass unser Puffercache tatsächlich verwendet wird, aber ich möchte wissen, ob wir ihn WIRKSAM verwenden. Wenn ich das Konzept der jungen und alten Seiten verstehe, würde ich vermuten, dass ein guter Indikator dafür, dass der Puffercache voll genutzt wird, in der Anzahl der jungen Seiten und dem Zugriff auf junge Seiten liegt, richtig? Wir verwenden mysqldump, um alle 3 Stunden Backups zu erstellen, was erklären würde, warum es voll ist. Aber mit young-making rate 0 / 1000und 0.00 youngs/swissen wir, dass wir es nicht wirklich nutzen. Lese ich das richtig?
Safado
2
Die Young-Making-Rate von 0/1000 gibt an, dass die Datenseiten für die von Ihnen ausgeführten Abfragen nicht nur alle in den Cache passen, sondern auch in die kleinere (3/8) Größe des Young-Caches. Das heißt, die Abfragen verwenden nicht genügend Daten, um einige der Seiten in den großen nicht-jungen Cache zu verschieben.
Thomas Jones-Low
Eine kurze Erklärung der verbleibenden Statusvariablen von innodb_buffer_pool ist sehr hilfreich. Können Sie es bitte zu Ihrer Antwort hinzufügen
vidyadhar
5

Ich bin mit der Einschätzung nicht einverstanden, dass "Sie das Glück haben, einen Pufferpool mit einer perfekten Trefferquote von 100% zu haben".

Am oberen Rand der Ausgabe (die abgeschnitten ist) befindet sich eine Zeile wie:

Per second averages calculated from the last 16 seconds

Dies sagt mir, dass in den letzten 16 Sekunden keine Lesevorgänge stattgefunden haben, wodurch Sie (künstlich) eine perfekte Punktzahl von 1000/1000 erhalten.

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

In der Zwischenzeit gab es einige Schreibvorgänge. Möglicherweise wurden Schreibvorgänge zurückgestellt, um entweder "schmutzige" Seiten zu löschen oder Indizes aus dem "Änderungspuffer" zu entfernen.

Wahrscheinlich gab es in den letzten 16 Sekunden auch keine Aktivität im Young / Hot-Bereich.

Rick James
quelle
Wir berechnen einen Durchschnitt zwischen 6.000 und 10.000 SELECTs pro Sekunde und gleichzeitig kann ich fast 0 Festplattenleseaktivitäten auf dem Server sehen. Ich denke also nicht, dass dies der Fall ist
Safado,
Befriedigt der "Abfrage-Cache" die meisten Abfragen? SHOW VARIABLES LIKE 'query%';und SHOW GLOBAL STATUS LIKE 'Qc%';und SHOW GLOBAL VARIABLES LIKE 'Com_SELECT';.
Rick James
0

Der Pufferpool ist in zwei Teile unterteilt, eine junge Liste und eine nicht junge Liste. Die Erstellungsrate gibt an, wie viele Seiten in den Pufferpools zwischen den beiden Listen gemischt werden.

Seiten, die jung gemacht wurden, sind nicht-junge Seiten, die gemacht wurden (dh aus dem Cache gelesen wurden). Seiten, die nicht-jung gemacht wurden, sind Seiten, die aus der jungen Liste verschoben wurden, weil sie entweder zu alt sind oder weil die junge Liste voll ist.

Die Rate, mit der die Seiten zwischen den beiden verschoben werden, hängt davon ab, wie viel des Pufferpools derzeit im Vergleich zur Größe des jungen Pools verwendet wird. Auf Null gesetzt bedeutet, dass Ihre aktive Gruppe (die von Ihnen verwendeten Seiten) kleiner als der junge Pool ist.

Thomas Jones-Low
quelle