Cannot allocate memory for the buffer pool でMySQLが落ちる

f:id:daihase:20190809100556p:plain

こんにちは、daihaseです。 先日、実は当ブログが一時的に接続出来ない状態となっていました。

直ぐに復旧はしましたが、原因はタイトルにもある「バッファプールへのメモリ割り当てが足りていない」というものでした。

当初このブログもAWSのt1.microで動かしており、その際swap領域も割り当てたのですが以前より今はアクセスも多くなってそれだと厳しかったようです。

実際MySQLのログを見てみると以下のようにエラーが出ていました。

  • /var/log/mysqld.log
170310 21:54:57 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
170310 21:54:57 InnoDB: Completed initialization of buffer pool
170310 21:54:57 InnoDB: Fatal error: cannot allocate memory for the buffer pool
170310 21:54:57 [ERROR] Plugin 'InnoDB' init function returned error.
170310 21:54:57 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
170310 21:54:57 [ERROR] Unknown/unsupported storage engine: InnoDB
170310 21:54:57 [ERROR] Aborting

 

というわけで今回はswap領域の拡張と、エラーにもある足りてないinnodb_buffer_pool_sizeを再設定します。

 

 

swap領域の拡張

swapファイルの作成

以下コマンドでswapファイルを作成します。

$ sudo mkdir /var/lib/swap
$ cd /var/lib/swap
$ fallocate -l 4G swapfile

 

※今回当ブログを動かしているインスタンスタイプがt1.smallで物理メモリ2GBなため、4GBに設定しました。

 

実際作成されたか確認してみます。

$ ls -lh swapfile
-rw-r--r-- 1 root root 1.0G May 20 14:33 swapfile

 

この作成したファイルをrootでしか権限変更出来ないようにします。

$ sudo chmod 600 swapfile
$ ls -lh swapfile
-rw------- 1 root root 1.0G May 20 14:33 swapfile

 

次にこれをswap領域として設定します。

% sudo mkswap swapfile

 

最後にこのswap領域を有効化します。

% sudo swapon swapfile

 

ではfreeコマンドを使って実際に作成されたか見てみましょう。

$ free -m
            total       used       free     shared    buffers     cached
Mem:          2003       1503        499          0         28        107
-/+ buffers/cache:       1367        635
Swap:         4095         0        4095

 

-mオプションで単位をMBにして見やすくしてます。ちゃんとSwap領域が4095MB作られていますね。

ちなみに余談ですが、作ったswapファイルは割り当てを解除したり削除もできるので、再利用したり不要になったら削除しましょう。

  • swapファイル割り当て解除
$ sudo swapoff swapfile

 

  • swapファイルの削除
$ sudo rm swapfile

 

これでSwapの拡張は終わりで、次はMySQL側のInnoDBを設定します。

 

InnoDBの設定

innodb_buffer_pool_sizeの変更

MySQLの初期設定では128MBとなっています。

my.confに以下のように追記してサイズを変更しまし。(デフォルトでは/etc/my.confに)

 

[mysqld]
...
innodb_buffer_pool_size=1000M

 

設定を反映するためにMySQLを再起動します。

$ /etc/init.d/mysqld restart

 

あとは実際にMySQLでログインし、以下のコマンドを打って確認します。

mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 1048576000 |
+-------------------------+------------+
1 row in set (0.00 sec)

 

無事サイズが増えていますね。

 

基本的にはSwapが発生してるのであればインスタンスを上位に変更する方がいいのですが、如何せんそこまでアクセスの多いブログでもないため、ある程度これで様子を見てみます。

厳しそうであればもう一つ上位インスタンスへの変更もやむなし...ですかね。

なにはともあれ、良い開発ライフを〜