redo ロギングを最適化するために、次のガイドラインを考慮してください:
-
redo ログファイルを buffer pool と同じ大きさにします。
InnoDB
が redo ログファイルをいっぱいにした場合、バッファプールの変更された内容を checkpoint のディスクに書き込む必要があります。 redo ログファイルが小さいと、不要なディスク書込みが多数発生します。 以前は大きな redo ログファイルが原因で長いリカバリ時間が発生していましたが、リカバリが大幅に高速になり、大きな redo ログファイルを確実に使用できるようになりました。redo ログファイルのサイズと数は、
innodb_log_file_size
およびinnodb_log_files_in_group
の構成オプションを使用して構成します。 既存の redo ログファイル構成の変更の詳細は、redo ログファイルの数またはサイズの変更 を参照してください。 log buffer のサイズを増やすことを検討してください。 ログバッファーを大きくすると、トランザクションがコミットする前にディスクにログを書き込まなくても、大規模なトランザクションを実行できます。 したがって、多数の行を更新、挿入、または削除するトランザクションの場合、ログバッファーを大きくすると、ディスク I/O を節約できます。 ログバッファサイズは、MySQL 8.0 で動的に構成できる
innodb_log_buffer_size
構成オプションを使用して構成します。-
「read-on-write」 を回避するには、
innodb_log_write_ahead_size
構成オプションを構成します。 このオプションは、redo ログの先行書込みブロックサイズを定義します。 オペレーティングシステムまたはファイルシステムのキャッシュブロックサイズと一致するようにinnodb_log_write_ahead_size
を設定します。 読取り/書込みは、redo ログの先行書込みブロックサイズとオペレーティングシステムまたはファイルシステムのキャッシュブロックサイズが一致しないために、redo ログブロックがオペレーティングシステムまたはファイルシステムに完全にキャッシュされない場合に発生します。innodb_log_write_ahead_size
の有効な値は、InnoDB
ログファイルのブロックサイズ (2 n) の倍数です。 最小値は、InnoDB
ログファイルのブロックサイズ (512) です。 最小値が指定されている場合、ライトアヘッドは発生しません。 最大値はinnodb_page_size
値と同じです。innodb_log_write_ahead_size
にinnodb_page_size
値より大きい値を指定すると、innodb_log_write_ahead_size
設定はinnodb_page_size
値に切り捨てられます。オペレーティングシステムまたはファイルシステムのキャッシュブロックサイズに関連して
innodb_log_write_ahead_size
値の設定が小さすぎると、読取り/書込みになります。 値を高く設定しすぎると、一度に複数のブロックが書き込まれるため、ログファイル書込みのfsync
パフォーマンスにわずかな影響を与える可能性があります。 MySQL 8.0.11 では、ログバッファからシステムバッファに redo ログレコードを書き込み、システムバッファを redo ログファイルにフラッシュするための専用のログライタースレッドが導入されました。 以前は、個々のユーザースレッドがこれらのタスクを担当していました。 MySQL 8.0.22 では、
innodb_log_writer_threads
変数を使用してログライタースレッドを有効または無効にできます。 専用ログライタースレッドを使用すると、同時実行性の高いシステムのパフォーマンスを向上させることができますが、同時実行性の低いシステムでは、専用ログライタースレッドを無効にすると、パフォーマンスが向上します。-
フラッシュされた redo を待機するユーザースレッドによるスピン遅延の使用を最適化します。 スピン遅延は、待機時間の短縮に役立ちます。 同時実行性の低い期間では、待機時間を短縮すると優先度が低くなり、これらの期間中のスピン遅延の使用を回避するとエネルギー消費が削減される可能性があります。 同時実行性が高い期間は、スピン遅延時の処理能力の消費を回避して、他の作業に使用できるようにすることが必要な場合があります。 次のシステム変数では、スピン遅延を使用するための境界を定義する最高水位標値と最低水位標値を設定できます。
innodb_log_wait_for_flush_spin_hwm
: フラッシュされた redo の待機中にユーザースレッドがスピンしなくなる最大平均ログフラッシュ時間を定義します。 デフォルト値は 400 マイクロ秒です。innodb_log_spin_cpu_abs_lwm
: フラッシュされた redo の待機中にユーザースレッドがスピンしなくなる CPU 使用率の最小量を定義します。 この値は、CPU コア使用率の合計として表されます。 たとえば、80 のデフォルト値は、単一の CPU コアの 80% です。 マルチコアプロセッサを搭載したシステムでは、150 の値は、1 つの CPU コアの 100% 使用率と 2 つ目の CPU コアの 50% 使用率を表します。-
innodb_log_spin_cpu_pct_hwm
: フラッシュされた redo の待機中にユーザースレッドがスピンしなくなる CPU 使用率の最大量を定義します。 この値は、すべての CPU コアの合計処理能力の割合として表されます。 デフォルト値は 50% です。 たとえば、2 つの CPU コアの 100% 使用率は、4 つの CPU コアを持つサーバーでの CPU 処理能力の合計の 50% です。innodb_log_spin_cpu_pct_hwm
構成オプションは、プロセッサアフィニティを考慮します。 たとえば、サーバーに 48 個のコアがあり、mysqld プロセスが 4 個の CPU コアにのみ固定されている場合、他の 44 個の CPU コアは無視されます。