MySQL Flush-List und Flushing-Mechanismus für Dirty Pages

MySQL Flush-List und Flushing-Mechanismus für Dirty Pages

1. Überprüfung

Der Pufferpool wird nach dem Start von MySQL initialisiert. Der Pufferpool initialisiert außerdem N leere Cache-Seiten und ihre Beschreibungsdaten werden in einer LRU-verknüpften Liste und einer doppelt verknüpften FreeList-Liste organisiert.

Wenn Sie zu diesem Zeitpunkt eine Datenseite von der Festplatte lesen, suchen Sie zuerst die Beschreibungsinformationen einer freien Cache-Seite in der freien Liste und laden dann die gelesene Datenseite in die Cache-Seite. Gleichzeitig werden die Beschreibungsinformationen der Cache-Seite aus der freien Liste entfernt. Darüber hinaus wird der Beschreibungsinformationsblock auch in der LRU-verknüpften Liste verwaltet.

Nachdem die Datenseite in den Pufferpool geladen wurde, können Sie Änderungen daran vornehmen.

2. Liste leeren

Um die Antwort an den Client zu beschleunigen, ändert MySQL die Daten im Pufferpool. Sobald Sie jedoch die Cache-Seite in der LRU-verknüpften Liste ändern, stimmen die Daten auf der Seite nicht mehr mit den Datenseiteninformationen auf der Festplatte überein! Diese Art von Datenseite wird im Allgemeinen als „Dirty Page“ bezeichnet.

Um die endgültige Konsistenz der Daten sicherzustellen, muss MySQL fehlerhafte Seiten zurück auf die Festplatte schreiben!

Die Frage ist jedoch: Welche Datenseiten müssen wieder auf die Festplatte geschrieben werden?

Dies bringt uns zur Flush List.

Die Flush-Liste ist der Free-Liste sehr ähnlich. Bei beiden handelt es sich um bidirektional verknüpfte Listen, die nach den Datenbeschreibungsinformationen im Pufferpool organisiert sind.

Sobald Sie eine Änderung an der Pufferseite im Speicher vornehmen, wird der der Pufferseite entsprechende Beschreibungsinformationsblock zur Flush-Liste hinzugefügt. Auf diese Weise können wir, wenn im Pufferpool nicht genügend Datenseiten vorhanden sind, dem Aktualisieren der fehlerhaften Datenseiten in der Flush-Liste auf der Festplatte Priorität einräumen.

Wenn Sie die vorherigen Artikel gelesen haben, kennen Sie sicherlich LRUList, FreeList, FlushList, Buffer Pool, Dirty Pages und Dirty Data.

Lasst uns den Sieg anstreben! Werfen wir einen Blick auf den Dirty Page Drop-Mechanismus

3. Was ist eine Dirty Page? Was sind schmutzige Daten?

Was sind schmutzige Seiten?

Im Einführungsartikel „Flush List“ habe ich erwähnt, dass schmutzige Seiten Cache-Seiten sind, die in der LRU-verknüpften Liste geändert wurden. Sie stimmen nicht mit den Datenseiten auf der Festplatte überein und fehlerhafte Seiten müssen wieder auf die Festplatte zurückgeschrieben werden.

Was sind schmutzige Daten?

Dieses Problem führt tatsächlich zum Konzept des Dirty Read. Beispiel: Transaktion A liest nicht festgeschriebene Daten aus Transaktion B. Diese Daten werden als „Dirty Data“ bezeichnet.

4. Wann sollten verschmutzte Seiten wieder auf die Festplatte geschrieben werden?

Wenn der Pufferpool nicht ausreicht, verschiebt MySQL gemäß dem LRU-Mechanismus die Cache-Seiten des alten Unterlistenteils aus der LRU-verknüpften Liste. Wenn die Beschreibungsinformationen der entfernten Cache-Seite in der Flush-Liste enthalten sind, muss MySQL sie wieder auf die Festplatte zurücksetzen.

Es gibt viele Möglichkeiten für die InnoDB-Speicher-Engine, schmutzige Seiten zurück auf die Festplatte zu schreiben. Sie können sich das als erweitertes Wissen ansehen.

1. Wenn die MySQL-Datenbank geschlossen wird, werden alle fehlerhaften Datenseiten zurück auf die Festplatte geschrieben. Diese Funktion wird durch den Parameter innodb_fast_shutdown=0 gesteuert. Standardmäßig schreibt InnoDB vor dem Herunterfahren verschmutzte Seiten zurück auf die Festplatte und bereinigt das Undo-Protokoll.

2. Es gibt einen Hintergrund-Thread (Master-Thread), der jede Sekunde oder alle zehn Sekunden einen bestimmten Anteil der Seiten im Pufferpool asynchron auf die Festplatte zurückaktualisiert.

3. In MySQL 5.7 wird der Pufferpool durch Seitenbereinigungs-Threads aktualisiert.

Wir können die Anzahl der Seitenbereinigungs-Threads über den Parameter innodb_page_cleaners steuern. Wenn Sie diesen Wert jedoch so einstellen, dass er größer als die Anzahl der Pufferpools ist, setzt MySQL die Anzahl der innodb_page_cleaners automatisch auf die Anzahl der innodb_buffer_pool_instances.
Vor Innodb1.1.x musste sichergestellt werden, dass in der LRU-Liste mindestens 100 freie Seiten verfügbar waren. Das Unterschreiten dieses Grenzwertes löst eine Löschung der schmutzigen Seiten aus.
Ab MySQL 5.6, also innodb 1.2.X, gibt der Parameter innodb_lru_scan_depth die Downstream-Distanz für jede Pufferpoolinstanz an, in der Seitenbereinigungs-Threads den Pufferpool durchsuchen, um schmutzige Seiten zu finden, die aktualisiert werden müssen. Der Standardwert ist 1024 und der Hintergrund-Thread wird einmal pro Sekunde ausgeführt.
4. Wenn zu viele fehlerhafte Datenseiten vorhanden sind, wird eine Aktualisierung der fehlerhaften Datenseiten auf die Festplatte veranlasst. Dieser Mechanismus kann durch den Parameter innodb_nax_dirty_pages_pct gesteuert werden. Wenn er beispielsweise auf 75 gesetzt ist, bedeutet dies, dass eine Aktualisierungsaktion ausgelöst wird, wenn die schmutzigen Datenseiten im Pufferpool 75 % des gesamten Cache erreichen. Der Standardwert dieses Parameters ist 0. Dadurch wird das frühzeitige Leerungsverhalten des Pufferpools deaktiviert.

5. Wenn das Redo-Protokoll nicht verfügbar ist, werden die schmutzigen Seiten in der Liste der schmutzigen Seiten zwangsweise wieder auf die Festplatte aktualisiert. Dieser Mechanismus wird zusätzlich durch einen Hintergrund-Thread vervollständigt.

5. Weitere Wissenspunkte zum schmutzigen Seiten-Refresh

Angrenzende Datenseiten aktualisieren: Dies bedeutet, dass MySQL beim Aktualisieren einer fehlerhaften Seite zurück auf die Festplatte auch die an die fehlerhafte Seite angrenzenden fehlerhaften Seiten auf die gleiche Weise aktualisiert.

Dieser Vorgang kann durch den Parameter innodb_flush_neighbors gesteuert werden.

  • Wenn der Wert auf 0 gesetzt ist, ist die Adjazenzaktualisierungsfunktion deaktiviert.
  • Wenn der Wert auf 1 gesetzt ist, werden benachbarte schmutzige Seiten auf die gleiche Weise gelöscht.
  • Wenn der Wert auf 2 gesetzt ist, werden schmutzige Seiten im gleichen Maße gelöscht.

Wie wählen Sie also aus, auf welchen Status es eingestellt werden soll?

Sie können dies anhand des Speichertyps der Maschine entscheiden, auf der sich die MySQL-Instanz befindet. Wenn der Speicher eine Festplatte ist, wird empfohlen, ihn einzuschalten, da die Festplattenaktualisierungsrate der Festplatte niedrig ist. Durch das Einschalten dieses Parameters können E/A-Vorgänge effektiv reduziert werden. Wenn hingegen SSD-Speicher verwendet wird, weist dieser die Eigenschaft einer hohen Festplatten-E/A auf. Daher wird empfohlen, diesen Parameter zu deaktivieren.

Oben sind die Details zu MySQL Flush-List und Dirty Page Disk Mechanismus aufgeführt. Weitere Informationen zu MySQL Flush-List und Dirty Page Disk Mechanismus finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space
  • Was sind MySQL-Dirty-Pages?

<<:  Der Unterschied zwischen HTML-Iframe und Frameset_PowerNode Java Academy

>>:  Document Object Model (DOM) in JavaScript

Artikel empfehlen

MySql-Lerntag 03: Verbindungs- und Abfragedetails zwischen Datentabellen

Primärschlüssel: Schlagwort: Primärschlüssel Funk...

CSS-Schreibstandards und -Reihenfolge teilen [für alle empfohlen]

CSS-Schreibreihenfolge 1. Positionsattribute (Pos...

Tutorial zur Installation von MySQL 8.0.11 unter Linux

1. Gehen Sie zur offiziellen Website, um das Inst...

Drei Möglichkeiten zum Erstellen eines Graueffekts auf Website-Bildern

Ich habe schon immer Graustufenbilder bevorzugt, d...

Detaillierte Erläuterung der perfekten CSS3+JS-Implementierung des Lupenmodus

Vor etwa einem Jahr habe ich einen Artikel geschr...

Implementierung eines einfachen Rechners auf Basis von JavaScript

In diesem Artikel wird der spezifische JavaScript...

Detaillierte Erläuterung zum Einrichten des Ressourcencaches in Nginx

Ich wollte schon immer etwas über Caching lernen....

So wird eine Select-Anweisung in MySQL ausgeführt

Inhaltsverzeichnis 1. MySQL aus einer Makroperspe...

Optimierungsmethoden, wenn MySQL zu viel CPU beansprucht (unbedingt lesen)

Wenn MySQL zu viel CPU beansprucht, wo sollten wi...