VPS や クラウドサーバー(OS は Linux)を借りて、MySQL (MariaDB) を使っている場合のお話しです。
目次
現象
「MySQL (MariaDB) が時々突然停止する」場合にログを見てみると、以下のようなエラーが書き込まれていることがあります。
Fatal error: cannot allocate memory for the buffer pool
バッファープール と呼ばれるストレージ領域に対して、割り当てるためのメモリが足らないというエラーです。
参考
調査
バッファープールの使用状況を調査するため、innodb_buffer_pool_size
というMySQLの変数について調べます。
my.cnf で innodb_buffer_pool_size が設定されているか確認
設定ファイル my.cnf で innodb_buffer_pool_size
に値が設定されているか確認します。明示的に設定されていない場合もあります。
CentOS 7 の場合ですと、/etc/my.cnf.d/server.cnf
に設定されているようです。
(省略)
[mysqld]
(省略)
innodb_buffer_pool_size = 500M
(省略)
この場合ですと、500MB に指定されています。
MySQL の変数 innodb_buffer_pool_size
を確認
実際に稼働している MySQL (MariaDB) で、innodb_buffer_pool_size
という変数の値がどうなっているか確認します。
まず、mysql
コマンドで MySQLのシェルに入ります。
$ mysql -uユーザー名 -p
変数 innodb_buffer_pool_size
の値を確認します。
MariaDB [(none)]> SHOW VARIABLES LIKE "innodb_%_size";
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| innodb_additional_mem_pool_size | 8388608 |
| innodb_buffer_pool_size | 524288000 |
| innodb_ibuf_max_size | 262127616 |
| innodb_log_block_size | 512 |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 5242880 |
| innodb_max_bitmap_file_size | 104857600 |
| innodb_merge_sort_block_size | 1048576 |
| innodb_page_size | 16384 |
| innodb_purge_batch_size | 20 |
+---------------------------------+-----------+
10 rows in set (0.06 sec)
この場合ですと、「524288000 バイト(500MB)」になっています。先ほど見た設定値がそのまま使用されていることが分かります。
free コマンド で、残っているメモリーの量を確認
MySQL (MariaDB) を起動した状態で、free
コマンドを実行します。 free
はメモリの使用状況を表示するコマンドです。
例えば、こんな感じです。(-h
オプションをつけて、見やすく表示しています)
$ free -h
total used free shared buff/cache available
Mem: 992M 443M 199M 2.4M 349M 343M
Swap: 2.0G 435M 1.6G
最近の free
コマンドだと available という項目がありまして、これが「利用可能なメモリー容量」だと考えてください(「実際の空き容量」と「すぐに解放可能な容量」を合計した値になっています)。ここが小さいとメモリーが足りていないということになります。
考察
VPS や クラウドサーバーの比較的安いプランであると、メモリーが1GBしかなかったりします。このような状況で、例えば innodb_buffer_pool_size
に 500MB 割り当てられていると、available が 100M しかないということもありえます。これでは他のプログラムがメモリーをほとんど使えませんし、逆に何かのタイミングで MySQL がバッファープールにメモリーを割り当てようとした時に「メモリーが足らない」ためにエラーになっても不思議ではありません。これは問題です。
対応策
VPS であれば、メモリーの多いプランに変更する。クラウドサーバーであれば、メモリーのリソースを増やす。という根本的な解決法があります。しかし、これらはおカネが掛かります。
サーバー上で、MySQL (MariaDB) 以外にそれ程メモリーを使うプログラムが動いていない場合や、MySQL (MariaDB) 自体も大きな負荷がない運用状況なのであれば、バッファープールのサイズを小さくする方法もあります。
その場合は、設定ファイルの innodb_buffer_pool_size
により小さな値をセットして、MySQL (MariaDB) を再起動すればよいです。
まとめ
VPS や クラウドサーバーで MySQL (MariaDB) を利用する場合、デフォルトの設定値はその環境と無関係ですので自分で変更する必要があります。このあたりの大変さは、サーバー上での自由を手に入れるための代償です。ウェブサイトの運営だけに集中したい型は、共用サーバーを使うことをお勧めします。