RDS インスタンスのメモリは、共有メモリ と セッション固有のプライベートメモリ の 2 種類に分類されます。共有メモリはインスタンス起動時に一度だけ割り当てられ、すべての接続で共有されます。一方、セッション固有のプライベートメモリは、接続ごとに必要に応じて割り当てられます。ソート、結合、またはデータ読み取りを必要とする各アクティブなクエリは、そのバッファーサイズ全体を即座に確保します。高い同時実行性の状況下では、この接続単位のメモリ割り当てが、メモリ不足 (OOM) エラーおよびプライマリ/セカンダリ スイッチオーバーの主な原因となります。
メモリ計算方法
次の数式は、合計メモリ使用量の推定方法を示しています。
Total memory ≈ Shared memory
+ max_connections × per-session memory per connection| コンポーネント | パラメーター |
|---|---|
| 共有メモリ | innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + key_buffer_size + query_cache_size |
| セッション単位のメモリ | sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + binlog_cache_size + tmp_table_size |
共有メモリ
共有メモリの割り当てを確認するには、次のクエリを実行します。
SHOW VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size',
'innodb_log_buffer_size',
'innodb_additional_mem_pool_size',
'key_buffer_size',
'query_cache_size'
);次の出力は、240 MB インスタンスからのものです。
+---------------------------------+-----------------+
| Variable_name | Value |
+---------------------------------+-----------------+
| innodb_additional_mem_pool_size | 2097152 |
| innodb_buffer_pool_size | 67108864 |
| innodb_log_buffer_size | 1048576 |
| key_buffer_size | 16777216 |
| query_cache_size | 0 |
+---------------------------------+-----------------+パラメーター
| パラメーター | RDS のデフォルト | 説明 |
|---|---|---|
innodb_buffer_pool_size | 64 MB (240 MB インスタンス) | InnoDB バッファープールです。データページ、インデックスページ、アンドゥページ、挿入バッファー、適応型ハッシュインデックス、ロック、およびデータディクショナリを格納します。すべての SQL 読み取りおよび書き込み操作は物理データファイルではなくバッファープール上で実行され、データは後でチェックポイントを通じてディスクに書き込まれます。バッファープールを大きくすると読み取り/書き込みパフォーマンスが向上しますが、障害復旧時間が長くなります。 |
innodb_log_buffer_size | 1 MB | InnoDB ログバッファーです。ディスクへのフラッシュ前にリドゥログを格納します。マスタースレッドによる 1 秒ごとのトリガー、各トランザクションコミット時、および利用可能なバッファー容量が総容量の半分を下回った際にフラッシュが実行されます。ほとんどのワークロードでは 1 MB で十分です。 |
innodb_additional_mem_pool_size | 2 MB | InnoDB 内部データ構造を格納します。インスタンスに多数のテーブルがある場合は、この値を増やしてください。 |
key_buffer_size | 16 MB | MyISAM テーブルのインデックスをキャッシュします。MyISAM テーブルの場合、インデックスキャッシュは key_buffer に格納され、データキャッシュはオペレーティングシステムのメモリに格納されます。すべての RDS インスタンスで 16 MB に設定されています。 |
query_cache_size | 0 (無効) | SQL ステートメントのハッシュに基づいてクエリ結果をキャッシュします。RDS インスタンスでは無効になっています。テーブルが変更されるとキャッシュが無効になるため、書き込み負荷の高いワークロードには不向きです。 |
セッション固有のプライベートメモリ
共有メモリとは異なり、セッションバッファーは起動時に事前に割り当てられません。各パラメーターの値は、クエリが必要とした瞬間にフルサイズで割り当てられます。多くの同時接続がある場合、累積的なメモリ割り当てが使用可能なメモリを超えて OOM エラーを引き起こす可能性があります。
セッションメモリの割り当てを確認するには、次のクエリを実行します。
SHOW VARIABLES WHERE Variable_name IN (
'read_buffer_size',
'read_rnd_buffer_size',
'sort_buffer_size',
'join_buffer_size',
'binlog_cache_size',
'tmp_table_size'
);出力例:
+-------------------------+-----------------+
| Variable_name | Value |
+-------------------------+-----------------+
| binlog_cache_size | 262144 |
| join_buffer_size | 262144 |
| read_buffer_size | 262144 |
| read_rnd_buffer_size | 262144 |
| sort_buffer_size | 262144 |
| tmp_table_size | 262144 |
+-------------------------+-----------------+パラメーター
| パラメーター | RDSにおけるデフォルト | コンソールで変更可能 | 説明 |
|---|---|---|---|
read_buffer_size | 256 KB | いいえ | シーケンシャルスキャン用バッファーです。物理読み込み前にスキャンして I/O を削減します。 |
read_rnd_buffer_size | 256 KB | いいえ | ランダムスキャン用バッファーです。インデックススキャン後にソートされた順序で行を読み取る際に使用されます。 |
sort_buffer_size | 256 KB | いいえ | ORDER BY および GROUP BY 操作のためのソートバッファーです。ソート対象データがこのサイズを超える場合、MySQL は一時テーブルをディスクに書き込みます。Linux では、この値を 2 MB を超えて設定すると、メモリ割り当てが malloc() から mmap() に切り替わり、効率が低下します。 |
join_buffer_size | 256 KB | いいえ | 結合操作用バッファーです。ApsaraDB RDS for MySQL はネステッドループ結合アルゴリズムのみをサポートしています。非ドライビングテーブルはこのバッファーに格納され、バッファープールの競合を回避します。 |
binlog_cache_size | 256 KB | いいえ | バイナリログキャッシュです。コミット前にトランザクションログを格納し、コミット後にディスク上のバイナリログファイルにフラッシュします。 |
tmp_table_size | 256 KB | はい | インメモリーの一時テーブルの最大サイズです。クエリによって作成される一時テーブルがこの制限を超える場合、MySQL はそれをディスク上の MyISAM テーブルに変換します。次のエラーが表示された場合は、この値を増やしてください。[Err] 1114 - The table '/home/mysql/data3081/tmp/#sql_6197_2' is full |
注: RDS コンソールで変更できるのは tmp_table_size のみです。他のセッションバッファーパラメーターはコンソールから変更できません。