メモリ割り当てパラメータ:グローバルバッファとスレッドバッファ
- 全体で共有されるグローバルバッファと、スレッドごとのスレッドバッファ
- パラメータを設定する際には、この違いを考慮する必要がある
- スレッドバッファに大きすぎる値を割り当てた場合、接続が増えた時にメモリが足りなくなる事が予想される
- スレッドは、最大で最大接続数(max_connections)の数だけ増える
key_buffer_size (グローバル)
- default: 8,388,608 [B]
- MyISAM テーブルのインデックスをバッファするサイズを設定する
- 32 bit プラットフォームでは、最大 4GB
- MySQL 5.1.23 では、64 bit プラットフォームで 4GB より大きな値を設定可能
- 一般に、搭載している物理メモリの 25% 程度がちょうど良い
- 50% を超えるほどにすると、値が大きすぎてパフォーマンスの低下を招きかねない
- MySQL は OS のファイルキャッシュに依存するため、ファイルキャッシュにメモリを割く事も重要
- SHOW STATUS の結果から Key_read_requests, Key_reads, Key_write_requests, Key_writes を確認する事で、キーバッファのパフォーマンスがわかる
- 一般に、Key_reads / Key_read_requests の比率は 0.01 よりも小さい事が望ましい
- MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.4.6 MyISAMキーキャッシュ
thread_stack (スレッド)
net_buffer_length (スレッド)
- 接続バッファと結果バッファの初期サイズ
- 必要に応じて max_allowed_packet で設定した値まで大きくなる
- net_buffer_length の値はできる限り変更しないこと
- 最大値は 1MB
max_allowed_packet (スレッド)
- default: 1,048,576 [B]
- 1 パケットの最大サイズ
- 最大値は 1GB
read_buffer_size (スレッド)
- default: 131,072 [B]
- テーブルのシーケンシャルスキャンを行うときに割り当てられるバッファのサイズ
- 値は 4KB の倍数とするべき
- 値が 4KB の倍数でなければ、最も近い倍数に丸められる
- 最大値は 2GB
read_rnd_buffer_size (スレッド)
- default: 262,144 [B]
- ソート後など、レコードをランダムな順序で読み取る際に割り当てられるバッファのサイズ
- スレッドごとの設定値であるため、必要に応じてセッション内で値をセットした方がよい
- 最大値は 2GB
tmp_table_size
- default: システム依存
- ほとんどの結合はテンポラリテーブルを使用しない
- テンポラリテーブルのほとんどは、メモリベース(HEAP)テーブル
- レコード長の大きなテンポラリテーブルや BLOB カラムを含むテンポラリテーブルは、ディスク上に格納される
- メモリ内の heap テーブルのサイズが tmp_table_size を超えた場合、MySQL はディスクベースの MyISAM に切り替える
sort_buffer_size (スレッド)
- default: 2,097,144 [B]
- ソートを実行する必要があるスレッドがこのサイズのバッファを割り当てる
- 最大値は 4GB (32 bit)
myisam_sort_buffer_size (スレッド)
- default: 8,388,608 [B]
- 以下の場合に割り当てられるバッファのサイズ
- REPAIR TABLE 実行時に、MyISAM テーブルのインデックスをソートする場合
- CREATE INDEX や ALTER TABLE などでインデックスを作成する場合
- 最大値は 4GB (32 bit)
join_buffer_size (スレッド)
- default: 131,072 [B]
- インデックスを使用しない結合に使用するバッファのサイズ
- 原則として、インデックスを使用しない結合を避けるべき
- 最大値は 4GB (32 bit)
innodb_additional_mem_pool_size (グローバル)
- default: 1,048,576 [B]
- InnoDB が、データ辞書情報と他の内部データ構造を格納するために利用する
- より多くのテーブルをアプリケーション内に持った場合、より多くのメモリが必要になる
- InnoDB がこのメモリを使い果たした場合、OS からメモリを割り当て始め、エラーログに警告メッセージを出力する
innodb_buffer_pool_size (グローバル)
- default: 8,388,608 [B]
- InnoDB がテーブルのデータとインデックスをキャッシュするために利用するバッファのサイズ
- 搭載する物理メモリの 80% に設定するとよい
- ただし、物理メモリの競合が OS 内でページングを引き起こす可能性もあるため、大きすぎる値は避けるべき
innodb_log_buffer_size (グローバル)
- default: 1,048,576 [B]
- InnoDB がディスク上のログファイルに書き込むために利用するバッファのサイズ
- 実用的な値の範囲は、1 MB から 8 MB
- 大きなトランザクションを見込んでいるなら、この値を大きくしておっ事で、ディスク I/O を節約できる
- innodb_log_file_size
- default: 5,242,880 [B]
- innodb_log_file_size は全グループのログファイルを結合して 4GB 以下(32 bit)でなければならない
- グループ数(innodb_log_files_in_group)を N とし、バッファプールサイズ(innodb_log_buffer_size)を M とした場合の実用的な値は、1 [MB] から (M [B] / N [th]) [B]
- 最大値は 4 GB (32 bit)
- innodb_log_files_in_group
myisam_use_mmap
- MySQL 5.1.14 以降、myisam_use_mmap システム変数によって、全ての MyISAM テーブルに対してメモリマップが可能
FLUSH TABLES によるメモリ解放
- FLUSH TABLES もしくは mysqladmin flush-tables によって、使用中でない全てのテーブルを閉じ、現在実行中のスレッドの終了時に使用中のテーブル全てが閉じられるように指定できる
- これによって、効率的に使用中メモリに空きを作る事ができる
- FLUSH TABLES は全てのテーブルが閉じられるまで返されない
DSAS の mymemcheck を参考に計算式を整理する
パラメータから必要なバッファサイズを計算し、どれだけの物理メモリが必要とされるかを計算したい。
- MySQL のパラメータ情報
- グローバルバッファに関するパラメータ
- スレッドバッファに関するパラメータ
- 他、必要なパラメータ
- プラットフォーム情報(32-bit or 64-bit)
- OS については無視する(Windows や、自分に縁遠い環境は考慮しない)
- innodb_log_file_size のサイズチェックも行う
グローバルバッファ
- key_buffer_size
- innodb_additional_mem_pool_size
- innodb_buffer_pool_size
- innodb_log_buffer_size
これらの総計が、必要なメモリサイズ。
※ DSAS 版では net_buffer_length がグローバルとされているが、スレッドではないのだろうか?
スレッドバッファ
- net_buffer_length
- read_buffer_size
- read_rnd_buffer_size
- sort_buffer_size
- myisam_sort_buffer_size
- join_buffer_size
- (スタック = thread_stack ?)
- DSAS 版 mymemcheck では、256 KB 固定にしている
※ 必要最低限のメモリサイズを見積もりたいので、max_allowed_packet ではなく net_buffer_length を利用する(グローバルバッファで見積もるべきなのか自信がない)
これらの総計に、接続数(max_connections)を掛けた結果が、必要なメモリサイズ。
innodb_log_file_size
- innodb_log_buffer_pool_size
- innodb_log_buffer_size
- innodb_log_files_in_group
- 目安として 32 bit 環境の制限に基づいた警告を出せるようにする
- 実用的な目安と、制限値の間に入るかどうかを確認する
1MB < innodb_log_file_size < MAX_innodb_log_file_size < 4GB (32bit OS)
MAX_innodb_log_file_size = innodb_buffer_pool_size * 1/innodb_log_files_in_group
スクリプト
Keyword(s):[mysql]
References: