MySQL 8.0 リファレンスマニュアル


15.8.7 InnoDB I/O Capacity の構成

InnoDB マスタースレッドおよびその他のスレッドは、さまざまなタスクをバックグラウンドで実行します。これらのほとんどは、バッファープールからダーティーページをフラッシュしたり、変更バッファーから適切なセカンダリインデックスに変更を書き込みたりするなど、I/O に関連しています。 InnoDB は、サーバーの通常の動作に悪影響を与えない方法でこれらのタスクを実行しようとします。 使用可能な I/O 帯域幅を見積もり、そのアクティビティをチューニングして使用可能な容量を利用しようとします。

innodb_io_capacity 変数は、InnoDB で使用可能な全体的な I/O 容量を定義します。 これは、システムが秒当たりに実行できる I/O 操作の数 (IOPS) におよそ設定する必要があります。 innodb_io_capacity が設定されている場合、InnoDB は、設定された値に基づいてバックグラウンドタスクに使用可能な I/O 帯域幅を見積もります。

innodb_io_capacity は 100 以上の値に設定できます。 デフォルト値は 200 です。 通常、100 付近の値は、最大 7200 RPM のハードドライブなどのコンシューマレベルのストレージデバイスに適しています。 より高速なハードドライブ、RAID 構成、およびソリッドステートドライブ (SSD) は、より高い値からメリットを得られます。

理想的には、設定を実用的なものとして低く保ちますが、バックグラウンドアクティビティが遅れるほど低くしないでください。 値が大きすぎる場合、データはバッファプールから削除され、キャッシュするにはバッファの変更が早すぎるため、大きな利点があります。 I/O レートが高いビジーシステムの場合は、高い値を設定すると、高い行変更率に関連付けられたバックグラウンドメンテナンス作業をサーバーが処理できるようになります。 通常、この値は、InnoDB I/O に使用されるドライブ数の関数として増やすことができます。 たとえば、複数のディスクまたは SSD を使用するシステムで値を増やすことができます。

通常、デフォルト設定の 200 は、ローエンド SSD には十分です。 高エンドのバス接続 SSD の場合は、1000 などのより高い設定を検討してください。 個々の 5400 RPM または 7200 RPM ドライブを搭載したシステムでは、値を 100 に減らすことができます。これは、約 100 IOPS を実行できる古い世代のディスクドライブで使用可能な秒あたりの I/O 操作数 (IOPS) の推定比率を表します。

百万などの高い値を指定できますが、実際にはこのような大きな値の利点はほとんどありません。 通常、ワークロードに対して低い値が不十分であることが確実でないかぎり、20000 より大きい値はお薦めしません。

innodb_io_capacity をチューニングする場合は、書込みワークロードを検討してください。 書込みワークロードが大きいシステムでは、設定を大きくするとメリットが得られる可能性があります。 書込みワークロードが小さいシステムでは、低い設定で十分な場合があります。

innodb_io_capacity 設定はバッファプールごとのインスタンス設定ではありません。 使用可能な I/O 容量は、アクティビティーをフラッシュするためにバッファープールインスタンス間で均等に分散されます。

innodb_io_capacity の値は、MySQL オプションファイル (my.cnf または my.ini) で設定するか、SET GLOBAL ステートメントを使用して実行時に変更できます。これには、グローバルシステム変数の設定に十分な権限が必要です。 セクション5.1.9.1「システム変数権限」を参照してください。

チェックポイントでの I/O 容量の無視

innodb_flush_sync 変数はデフォルトで有効になっており、checkpoints で発生する I/O アクティビティのバースト中に innodb_io_capacity 設定が無視されます。 innodb_io_capacity 設定で定義された I/O レートに準拠するには、innodb_flush_sync を無効にします。

innodb_flush_sync の値は、MySQL オプションファイル (my.cnf または my.ini) で設定するか、SET GLOBAL ステートメントを使用して実行時に変更できます。これには、グローバルシステム変数の設定に十分な権限が必要です。 セクション5.1.9.1「システム変数権限」を参照してください。

I/O 容量の最大値の構成

フラッシュアクティビティが遅れている場合、InnoDBinnodb_io_capacity 変数で定義されているよりも高い速度の I/O 操作/秒 (IOPS) で、より積極的にフラッシュできます。 innodb_io_capacity_max 変数は、このような状況で InnoDB バックグラウンドタスクによって実行される IOPS の最大数を定義します。

起動時に innodb_io_capacity 設定を指定し、innodb_io_capacity_max の値を指定しない場合、innodb_io_capacity_max のデフォルトは innodb_io_capacity または 2000 のどちらか大きい方の値の 2 倍になります。

innodb_io_capacity_max を構成する場合、多くの場合、innodb_io_capacity が適切な開始点になります。 デフォルト値 2000 は、SSD または複数の通常のディスクドライブを使用するワークロードを対象としています。 SSD または複数のディスクドライブを使用しないワークロードでは、2000 の設定が高すぎる可能性があり、フラッシュが多すぎる可能性があります。 単一の標準ディスクドライブの場合は、200 から 400 の間の設定をお薦めします。 ハイエンドのバス接続 SSD の場合は、2500 などの高い設定を検討してください。 innodb_io_capacity 設定と同様に、この設定は実用的ではなく、InnoDB が IOPS の速度を innodb_io_capacity 設定を超えて十分に拡張できないように低くしてください。

innodb_io_capacity_max をチューニングする場合は、書込みワークロードを検討してください。 書込みワークロードが大きいシステムでは、設定を大きくするとメリットが得られる場合があります。 書込みワークロードが小さいシステムでは、低い設定で十分な場合があります。

innodb_io_capacity_max は、innodb_io_capacity 値より小さい値に設定できません。

SET ステートメント (SET GLOBAL innodb_io_capacity_max=DEFAULT) を使用して innodb_io_capacity_maxDEFAULT に設定すると、innodb_io_capacity_max が最大値に設定されます。

innodb_io_capacity_max 制限は、すべてのバッファープールインスタンスに適用されます。 バッファプールごとのインスタンス設定ではありません。


関連キーワード:  InnoDB, テーブル, 設定, 構成, capacity, 圧縮, スペース, ロック, 実行, プール