MySQL フラッシュリストとダーティページフラッシュメカニズム

MySQL フラッシュリストとダーティページフラッシュメカニズム

1. レビュー

MySQL の起動後にバッファ プールが初期化されます。バッファ プールは N 個の空のキャッシュ ページも初期化し、その記述データは LRU リンク リストと FreeList 二重リンク リストに編成されます。

このとき、ディスクからデータ ページを読み取る際には、まず Free List から空いているキャッシュ ページの説明情報を検索し、読み取ったデータ ページをキャッシュ ページにロードします。同時に、キャッシュ ページの説明情報はフリー リストから削除されます。また、説明情報ブロックは LRU リンク リストにも保持されます。

データ ページがバッファー プールにロードされた後、そのデータ ページに対して変更を実行できます。

2. フラッシュリスト

クライアントへの応答を高速化するために、MySQL はバッファー プール内のデータを変更しますが、LRU リンク リスト内のキャッシュ ページを変更すると、ページ内のデータはディスク上のデータ ページ情報と一致しなくなります。一般的に、この種のデータ ページはダーティ ページと呼ばれます。

データの最終的な一貫性を確保するために、MySQL はダーティ ページをディスクにフラッシュバックする必要があります。

しかし、問題は、どのデータ ページをディスクにフラッシュバックする必要があるかということです。

これでフラッシュ リストに進みます。

フラッシュ リストはフリー リストと非常によく似ており、どちらもバッファー プール内のデータ記述情報によって編成された双方向リンク リストです。

メモリ内のバッファ ページを変更すると、バッファ ページに対応する説明情報ブロックがフラッシュ リストに追加されます。この方法では、バッファ プールに十分なデータ ページがない場合に、フラッシュ リスト内のダーティ データ ページをディスクに更新することを優先できます。

これまでの記事を読んだことがあれば、LRUList、FreeList、FlushList、バッファー プール、ダーティ ページ、ダーティ データについて知っているはずです。

勝利を目指しましょう!ダーティページドロップの仕組みを見てみましょう

3. ダーティページとは何ですか?ダーティデータとは何ですか?

ダーティページとは何ですか?

フラッシュ リストを紹介した記事で、ダーティ ページは LRU リンク リストで変更されたキャッシュ ページであると説明しました。これらはディスク上のデータ ページと矛盾しており、ダーティ ページをディスクにフラッシュバックする必要があります。

ダーティデータとは何ですか?

この問題は、実際にはダーティ リードという概念につながります。たとえば、トランザクション A はトランザクション B からコミットされていないデータを読み取ります。このデータをダーティ データと呼びます。

4. ダーティページをディスクにフラッシュするタイミング

バッファ プールが十分でない場合、MySQL は LRU メカニズムに従って、古いサブリスト部分のキャッシュ ページを LRU リンク リストから移動します。削除されたキャッシュ ページの説明情報がフラッシュ リストにある場合、MySQL はそれをディスクにフラッシュする必要があります。

InnoDB ストレージ エンジンがダーティ ページをディスクにフラッシュバックする機会は数多くあります。これを拡張知識として見ることができます。

1. MySQL データベースが閉じられると、すべてのダーティ データ ページがディスクにフラッシュバックされます。この機能は、パラメータ innodb_fast_shutdown=0 によって制御されます。デフォルトでは、InnoDB はシャットダウンする前にダーティ ページをディスクにフラッシュし、UNDO ログをクリーンアップします。

2. バッファ プール内のページの一定割合を 1 秒ごとまたは 10 秒ごとに非同期的にディスクに更新するバックグラウンド スレッド マスター スレッドがあります。

3. MySQL 5.7 では、バッファ プールはページ クリーナー スレッドによって更新されます。

innodb_page_cleaners パラメータを使用してページ クリーナー スレッドの数を制御できますが、この値をバッファー プールの数よりも大きく調整すると、MySQL は innodb_page_cleaners の数を innodb_buffer_pool_instances の数に自動的に設定します。
Innodb1.1.x より前では、LRU リストに少なくとも 100 個の空きページがあることを確認する必要がありました。このしきい値を下回ると、ダーティ ページのフラッシュがトリガーされます。
MySQL 5.6、つまり innodb 1.2.X 以降では、innodb_lru_scan_depth パラメータは、ページ クリーナー スレッドがバッファー プールをスキャンして更新するダーティ ページを見つける、各バッファー プール インスタンスのダウンストリーム距離を指定します。デフォルト値は 1024 で、バックグラウンド スレッドは 1 秒ごとに 1 回実行されます。
4. ダーティ データ ページが多すぎる場合は、ダーティ データ ページがディスクにリフレッシュされます。このメカニズムは、パラメータ innodb_nax_dirty_pages_pct によって制御できます。たとえば、これを 75 に設定すると、バッファー プール内のダーティ データ ページが全体のキャッシュの 75% に達すると、更新アクションがトリガーされます。このパラメータのデフォルト値は 0 です。これにより、バッファ プールの早期フラッシュ動作が無効になります。

5. REDO ログが利用できない場合、ダーティ ページ リスト内のダーティ ページは強制的にディスクに更新されます。このメカニズムもバックグラウンド スレッドによって完了します。

5. ダーティページリフレッシュに関するその他の知識ポイント

隣接するデータ ページを更新します。つまり、MySQL がダーティ ページをディスクに更新すると、そのダーティ ページに隣接するダーティ ページも同様にディスクに更新されます。

このプロセスは、パラメータ innodb_flush_neighbors によって制御できます。

  • 0 に設定すると、隣接関係更新機能は無効になります。
  • 1 に設定すると、隣接するダーティ ページを同じ方法でフラッシュします。
  • 2 に設定すると、ダーティ ページは同じ程度にフラッシュされます。

では、どの状態に設定するかをどのように選択するのでしょうか?

MySQL インスタンスが配置されているマシンのストレージ タイプに基づいて決定できます。ストレージが HDD の場合、HDD のディスク リフレッシュ レートが低いため、オンにすることをお勧めします。このパラメータをオンにすると、IO 操作を効果的に削減できます。逆に、SSD ストレージを使用する場合は、ディスク IO が高くなるという特性があるため、このパラメータを無効にすることをお勧めします。

上記は、MySQL フラッシュ リストとダーティ ページ ディスク メカニズムの詳細です。MySQL フラッシュ リストとダーティ ページ ディスク メカニズムの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析
  • mysql ダーティ ページとは何ですか?

<<:  HTML iframe と frameset の違い_PowerNode Java Academy

>>:  Dockerコンテナが起動直後に終了する問題を解決する

推薦する

Vue+Element UIはドロップダウンメニューのカプセル化を実現します

この記事の例では、ドロップダウンメニューのカプセル化を実装するためのVue + Element UI...

VMware のインストールと使用時の問題と解決策

仮想マシンは使用中であるか、接続できません次のようなエラーが報告された場合解決まずこのページにアクセ...

Docker に Kong ゲートウェイをインストールする方法の例

1. Dockerネットワークを作成する docker ネットワーク作成 kong-net 2. デ...

jsのディープコピーを理解しましょう

目次js ディープコピーデータ保存方法浅いコピー/深いコピーとは何か一般的なディープコピーの実装1....

Nginx の add_header ディレクティブに注意する必要があるのはなぜですか?

序文ご存知のとおり、nginx 構成ファイルは add_header ディレクティブを使用して応答ヘ...

HTML の水平および垂直中央揃えの問題の概要

最近、センタリングの問題に数多く遭遇したので、後で簡単に見つけられるように、時間をかけてそれらを要約...

ページスピードの最適化の概要

インターネットは人々の生活にますます欠かせないものになってきていると思います。 Ajax や fle...

言及すべき8つのMySQLの落とし穴を共有する

MySQL はインストールが簡単で、高速で、豊富な機能を備えています。これはオープンソース運動のベン...

DIV、テーブル、XHTML のウェブサイト構築の違いの分析と説明

簡単に言えば、ウェブサイト構築とは、「この人はどんな外見をしているのか」と「この人はどんな内面を持っ...

ウェブページで CSS スタイルを適用するさまざまな形式の概要

1. インライン スタイル (<body></body> 内に配置されます)...

JavaScript を使用してセカンダリ メニューを作成する

この記事では、セカンダリメニュー効果を実現するためのJavaScriptの具体的なコードを参考までに...

MySQL の条件文で 1 つの情報しか読み取れない問題に対する 2 つの解決策

今日、私の同僚が MYSQL クエリ ステートメントの作成時に非常に奇妙な問題に遭遇しました。MyS...

vue3 タイムスタンプ変換 (フィルターを使用せずに)

vue2 では、タイムスタンプを変換するときに、通常はフィルターを使用します。vue3 以降では、...

Javascript Echarts 空気質マップ効果の詳細な説明

まず、空気質データと地図データを組み合わせる必要があります。マップデータには属性名があるさまざまな都...

mysql-8.0.17-winx64 のデプロイメント方法

1. 公式サイトからmysql-8.0.17-winx64をダウンロードし、Zipファイル形式を選択...