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

推薦する

Linux 編集の開始、停止、再起動の Springboot jar パッケージ スクリプトの例

序文springboot設定ファイルでは、設定ファイルの名前には独自の意味と用途があります。 dev...

選択ドロップダウンボックスの値をIDに渡してコードを実装する方法

完全なコードは次のとおりです。 HTMLコード:コードをコピーコードは次のとおりです。 <!-...

Nginx をインストールして複数のドメイン名を設定する方法

Nginx のインストールCentOS 6.x yum にはデフォルトで nginx ソフトウェア ...

MySQL 整合性制約の定義と例のチュートリアル

目次整合性制約整合性制約の定義整合性制約の分類主キー制約単一の主キーと複合主キーの違い主キーフィール...

Linux netfilter/iptables の知識ポイントの詳細な説明

ネットフィルターNetfilter は、パケット フィルタリング、転送、およびアドレス変換 NAT ...

Ubuntu 18.04 MySQL 8.0 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0のインストールと設定方法を参考までに紹介します。具体的な内容は以下の...

tinyMCEの使い方と体験の詳細な説明

tinyMCE の使用方法の詳細な説明初期化TinyMCE を初期化するときは、ページの HEAD ...

Dockerfile 内の予約語命令の解析処理

目次1. Dockerfile とは何ですか? 2. Dockerfile構築プロセスの分析3. D...

Linuxはバイナリモードを使用してmysqlをインストールします

この記事では、LinuxにバイナリモードでMySQLをインストールする具体的な手順を参考までに紹介し...

動的および静的分離を実現する nginx のサンプルコード

1. nginxの動的と静的の分離の簡単な設定web1は静的サーバー、web2は動的サーバー、nod...

クリーンで美しいウェブデザインのための4つの原則

この記事では、 Webデザインに関連するこれら4 つの原則について説明します。これら4 つの原則を念...

Linux での MySQL のアンインストールとインストールのグラフィック チュートリアル

ブログを書くのは初めてです。開発に携わって2年になります。仕事の後に何か有意義なことを見つけたいと思...

MySQL inndbジョイントインデックスを正しく使用する方法を徹底的に理解するためのケーススタディ

最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_...

WeChatアプレットは日付と時刻に基づいた並べ替え機能を実装

最近、小さなプログラム プロジェクトを引き継いだのですが、リストを日付と時刻で並べ替えるという要件が...

Vue プロジェクトで axios リクエストを使用する方法

目次1. インストール2. カプセル化に問題はない3. ファイルを作成する4. アドレス設定をリクエ...