Tips

【VPS, クラウドサーバー】MySQL (MariaDB) が突然停止する場合は、innodb_buffer_pool_size が大きすぎるかもしれません

投稿日:2018年3月22日 更新日:

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) を利用する場合、デフォルトの設定値はその環境と無関係ですので自分で変更する必要があります。このあたりの大変さは、サーバー上での自由を手に入れるための代償です。ウェブサイトの運営だけに集中したい型は、共用サーバーを使うことをお勧めします。

-Tips
-,

執筆者:fitallright

関連記事

エックスサーバーに Bolt (CMSツール)を設置する

エックスサーバーに Bolt という CMS を設置する手順を紹介します。 Bolt 自体の紹介というよりは、エックスサーバーのような共用レンタルサーバーに、CMS を設置する一つの方法(手順)を紹介 …

WordPress のウィジェットに、特定のカテゴリの「最近の投稿」を表示する方法

WordPress において、特定のカテゴリ内の「最近の投稿」をウィジェットに表示する方法をご紹介します。 目次WordPress のウィジェットとは?手順設定方法TitleFilterPost de …

Webサイトで絵文字を使う

Webサイトに絵文字を使う方法について説明します。 目次1. 絵文字を探す2. HTML内で絵文字を使う2つの方法1. 絵文字をそのままコピー&ペーストする方法2. 数値文字参照を使う方法3. Wor …

CodePen で書いたコードを自分のWebサイトに埋め込む方法

CodePen とは、Web上で HTML, CSS, JavaScript を書いてすぐに結果を表示することができるサービスです。 結果を確認しながら、コードを書いたり修正できるので、ちょっとしたW …

レンタルサーバーにおけるデータ転送量とは?

レンタルサーバーの機能やスペックを見ていると「転送量の目安」といった項目を目にすることがあります。 ウェブサイトへのアクセスが少ないうちは、あまり気にする必要はない項目ではあるのですが、できれば、 レ …

ロリポップ!「スタンダードプラン」
さくらのレンタルサーバ「スタンダードプラン」