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コンテナが起動直後に終了する問題を解決する

推薦する

nginx サーバーでの 502 不正なゲートウェイ エラーの原因のトラブルシューティング

パブリックアカウントのファンデータを同期してバッチプッシュするときに、サーバーがエラー502を報告し...

MySQLデータベースインデックスの欠点と適切な使用

目次インデックスの適切な使用1. 通常のインデックスのデメリット2. 主キーインデックスの落とし穴3...

Nginx ロードバランシング クラスタの実装

(1)実験環境youxi1 192.168.5.101 ロードバランサーyouxi2 192.168...

CentOS8 jdk8 / java8 のインストールチュートリアル(推奨)

序文最初はCentOS8でwgetを使ってダウンロードし、解凍して環境変数を設定するつもりだったので...

RR および RC 分離レベルでのインデックスとロックのテスト スクリプトのサンプル コード

基本概念現在の読み取りとスナップショットの読み取りMVCC では、読み取り操作はスナップショット読み...

Vue はカードフリップカルーセル表示を実装します

Vueカードのフリップカルーセル表示、フリップ時にデータを切り替えながら、参考までに、具体的な内容は...

ウェブサイトのユーザビリティを向上させる10のヒント

企業の Web サイト、個人のブログ、ショッピング Web サイト、ゲーム Web サイトなど、どの...

Unicode の数学記号の概要

数学、物理学、および一部の科学技術分野で使用される特殊記号は多数あります。Unicode コードには...

17 個の JavaScript ワンライナー

目次1. DOMとBOM関連1. 要素にフォーカスがあるかどうかを確認する2. 要素の兄弟ノードをす...

Vue+SpringBoot+Shiroのクロスドメイン問題を解決する

目次1. Vueフロントエンドを構成する1. クロスドメイン構成を開発する2. 本番環境のクロスドメ...

MySQL セレクトキャッシュメカニズムの使用に関する詳細な説明

MySQL クエリ キャッシュはデフォルトでオンになっています。ある程度、クエリの効果は向上しますが...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...

EasyUEFI を使用して Windows 10 で USB ドライブなしで Ubuntu 18 をインストールする

1. BIOSを確認するまず、コンピュータの起動モードを確認します。win+R と入力し、msinf...

マージントップ崩壊現象とその具体的解決策

マージントップの崩壊とはmargin-top の崩壊は、CSS ボックス モデルで発生する現象です。...

Spring Boot + jar パッケージングのデプロイメント Tomcat 404 エラーの問題を解決する

1. Spring Boot は jsp jar パッケージをサポートしていません。jsp は wa...