InnoDB は、バッファープールからのダーティーページ (変更されたが、まだデータベースファイルに書き込まれていないページ) のフラッシュなどの特定のタスクをバックグラウンドで実行します。InnoDB は現在、バッファープール内のダーティーページの割合 (%) が innodb_max_dirty_pages_pct
を超えた場合にバッファープールページをフラッシュします。
InnoDB は、Redo ログ生成の速度とフラッシュの現在の頻度に基づいて、フラッシュの必要な頻度を推定するアルゴリズムを使用します。その目的は、バッファーのフラッシュアクティビティーが常に、バッファープールを「クリーンな」状態に維持する必要性に対応するようにして、全体的なパフォーマンスを平滑化することにあります。フラッシュ頻度の自動的な調整は、通常の読み取りおよび書き込みアクティビティーに使用可能な I/O 容量がバッファープールの過剰なフラッシュによって制限されるような場合、スループットの突然の低下を回避するのに役立つことがあります。
InnoDB は、そのログファイルを循環的に使用します。ログファイルのある部分を再利用する前に、InnoDB は、Redo エントリがログファイルのその部分に含まれているダーティーバッファープールページをすべてディスクにフラッシュします。このプロセスは、シャープチェックポイントと呼ばれます。書き込みの多いワークロードでは、そのすべてがログファイルに書き込まれる多くの Redo 情報が生成されます。ログファイル内の使用可能なすべての領域が使い果たされると、シャープチェックポイントが発生するため、スループットが一時的に低下します。この状況は、innodb_max_dirty_pages_pct
に達していなくても発生する場合があります。
InnoDB は、バッファープール内のダーティーページの数と、Redo が生成されている割合を測定することによってこのようなシナリオを回避する、経験則に基づいたアルゴリズムを使用します。これらの数値に基づいて、InnoDB は、バッファープールから毎秒フラッシュするダーティーページの数を決定します。この自己適応型のアルゴリズムは、ワークロードの突然の変化に対処できます。
内部のベンチマークでも示されているように、このアルゴリズムは一定期間にわたってスループットを維持するだけでなく、全体的なスループットも大幅に向上させることができます。
適応型フラッシュはワークロードの I/O パターンに大きな影響を与える場合があるため、innodb_adaptive_flushing
構成パラメータを使用して、この機能を無効にすることができます。innodb_adaptive_flushing
のデフォルト値は TRUE
であり、適応型フラッシュアルゴリズムが有効になります。このパラメータの値は MySQL オプションファイル (my.cnf
または my.ini
) で設定するか、あるいは SET GLOBAL
コマンド (これには SUPER
権限が必要です) で動的に変更できます。
InnoDB の I/O パフォーマンスの詳細は、セクション8.5.7「InnoDB ディスク I/O の最適化」を参照してください。