MariaDB down due to nginx and php-fpm.

業務多忙でしばらくブログ更新どころかアクセスすらしていない状況で、いつの間にか当ブログのバックエンドで動いているMariaDBが死んでいた。

/var/log/mariadb/mariadb.log を確認してみると、どうやら InnoDBが十分なメモリを確保できずに起動失敗していたらしい。

180708 08:49:06 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended<
180723 13:29:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql<
180723 13:30:00 [Note] /usr/libexec/mysqld (mysqld *.*.**-MariaDB) starting as process 129946 ...<
180723 13:30:00 InnoDB: The InnoDB memory heap is disabled<
180723 13:30:00 InnoDB: Mutexes and rw_locks use GCC atomic builtins<
180723 13:30:00 InnoDB: Compressed tables use zlib 1.2.7<
180723 13:30:00 InnoDB: Using Linux native AIO<
180723 13:30:00 InnoDB: Initializing buffer pool, size = 128.0M<
InnoDB: mmap(137756672 bytes) failed; errno 12<
180723 13:30:00 InnoDB: Completed initialization of buffer pool<
180723 13:30:00 InnoDB: Fatal error: cannot allocate memory for the buffer pool<
180723 13:30:00 [ERROR] Plugin 'InnoDB' init function returned error.<
180723 13:30:00 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.<
180723 13:30:00 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)<
180723 13:30:00 [Note] Plugin 'FEEDBACK' is disabled.<
180723 13:30:00 [ERROR] Unknown/unsupported storage engine: InnoDB<
180723 13:30:00 [ERROR] Aborting<

当環境はAzureのやっすいサーバを使って動いているものの、メモリは2GB積んである。

WEBフロントエンドにApacheを使っていた頃はこのような事が無かったと記憶しているが、一体どうしたものか。

ちなみに現在はnginxで動いている。

ひとまず、AzureやAWSで稼働するマシンによってはスワップファイルが自動で作成されない事を踏まえ、実装メモリと同じサイズのスワップファイルを作成する事にした。

暫定対応

スワップファイル作成

dd if=/dev/zero of=/swap bs=1M count=2048
mkswap /swap
swapon /swap

恒久対応にするために

が、スワップファイルを使用する事前提で稼働させるのは根本的解決にはならないので、nginxや裏で動いているPHPで節約できそうなものがないか調べる。

ps aux | grep nginx
root        623  0.0  0.0 112660   968 pts/0    R+   14:17   0:00 grep --color=auto nginx
nginx      3924  0.0  2.5 393148 50220 ?        S    May28   5:21 php-fpm: pool www
nginx      3930  0.0  1.9 383704 38868 ?        S    May28   5:20 php-fpm: pool www
nginx      3931  0.0  2.0 383652 40040 ?        S    May28   5:19 php-fpm: pool www
nginx     25504  0.0  1.8 377796 37156 ?        S    Jul01   0:11 php-fpm: pool www
nginx     25505  0.0  0.8 378220 17560 ?        S    Jul01   0:12 php-fpm: pool www
nginx     25506  0.0  1.6 361488 31504 ?        S    Jul01   0:09 php-fpm: pool www
nginx     25510  0.0  1.8 379408 37092 ?        S    Jul01   0:12 php-fpm: pool www
nginx     25511  0.0  1.9 378836 37840 ?        S    Jul01   0:12 php-fpm: pool www
nginx     25512  0.0  1.8 379160 35988 ?        S    Jul01   0:13 php-fpm: pool www
nginx     25513  0.0  1.9 378364 38132 ?        S    Jul01   0:12 php-fpm: pool www
nginx     25518  0.0  2.2 383720 43708 ?        S    Jul01   0:15 php-fpm: pool www
nginx     25519  0.0  1.0 378516 20608 ?        S    Jul01   0:13 php-fpm: pool www
nginx     25520  0.0  2.0 381676 40624 ?        S    Jul01   0:12 php-fpm: pool www
nginx     25521  0.0  1.9 378072 38752 ?        S    Jul01   0:12 php-fpm: pool www
nginx     25522  0.0  2.2 385312 44432 ?        S    Jul01   0:11 php-fpm: pool www
nginx     25529  0.0  2.0 380716 40000 ?        S    Jul01   0:11 php-fpm: pool www
nginx     25530  0.0  2.3 386728 46148 ?        S    Jul01   0:10 php-fpm: pool www

やはりnginxがめちゃくちゃ起動していて、php-fpmというものに消費している様に見える。

Apacheのプロセス数制御の様にうまく設定する方法はないかと調べたところ、以下設定ファイルの項目が該当する事がわかった。

暫定対応

設定ファイル

/etc/php-fpm.d/www.conf を編集する。

で書いてあるところはデフォルトから編集したところ。基本的にアクセスが多いサイトではないので、まずは落ちない事を意識して最大プロセス数と常時待機するプロセスを少なめに絞った。

  • pm = dynamic
  • pm.max_children = 40  # 50 -> 40
  • pm.start_servers = 10
  • pm.minspareservers = 10
  • pm.maxspareservers = 12 # 35 -> 12
  • pm.max_requests = 500 #コメント外す

再起動前

んで、サービスを再起動させる前のメモリ状況

free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        1.6G        112M         69M        181M         32M
Swap:          2.0G        198M        1.8G
systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-04-03 06:12:11 UTC; 3 months 20 days ago
 Main PID: 79089 (php-fpm)
   Status: "Processes active: 0, idle: 32, Requests: 30362, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php-fpm.service
           ├─  3924 php-fpm: pool www
           ├─  3930 php-fpm: pool www
           ├─  3931 php-fpm: pool www
           ├─ 25504 php-fpm: pool www
           ├─ 25505 php-fpm: pool www
           ├─ 25506 php-fpm: pool www
           ├─ 25510 php-fpm: pool www
           ├─ 25511 php-fpm: pool www
           ├─ 25512 php-fpm: pool www
           ├─ 25513 php-fpm: pool www
           ├─ 25518 php-fpm: pool www
           ├─ 25519 php-fpm: pool www
           ├─ 25520 php-fpm: pool www
           ├─ 25521 php-fpm: pool www
           ├─ 25522 php-fpm: pool www
           ├─ 25529 php-fpm: pool www
           ├─ 25530 php-fpm: pool www
           ├─ 25531 php-fpm: pool www
           ├─ 25532 php-fpm: pool www
           ├─ 25533 php-fpm: pool www
           ├─ 44261 php-fpm: pool www
           ├─ 44263 php-fpm: pool www
           ├─ 44264 php-fpm: pool www
           ├─ 72957 php-fpm: pool www
           ├─ 79089 php-fpm: master process (/etc/php-fpm.conf)
           ├─ 79091 php-fpm: pool www
           ├─ 79092 php-fpm: pool www
           ├─ 79093 php-fpm: pool www
           ├─ 79094 php-fpm: pool www
           ├─ 79095 php-fpm: pool www
           ├─ 79117 php-fpm: pool www
           ├─ 79218 php-fpm: pool www
           └─109178 php-fpm: pool www

再起動後

free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        680M        803M         61M        434M        893M
Swap:          2.0G        116M        1.9G`
systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2018-07-23 14:21:38 UTC; 7s ago
 Main PID: 765 (php-fpm)
   Status: "Ready to handle connections"
   CGroup: /system.slice/php-fpm.service
           ├─765 php-fpm: master process (/etc/php-fpm.conf)
           ├─767 php-fpm: pool www
           ├─768 php-fpm: pool www
           ├─769 php-fpm: pool www
           ├─770 php-fpm: pool www
           ├─771 php-fpm: pool www
           ├─772 php-fpm: pool www
           ├─773 php-fpm: pool www
           ├─774 php-fpm: pool www
           ├─775 php-fpm: pool www
           └─776 php-fpm: pool www

んんんー、ほどほどに余裕があって良い感じ。

とはいえ、今回見たく放置してる間に死んでて気がつかない・・・なんて事がないようにプロセスの死活監視ぐらいはしておいたほうが良いのかもしれないな・・・。

/以上

引用・参考

Cento7にphp-fpmをインストールし、nginxと連携する

[wordpress][php-fpm][dynamic][static][nginx]なんか重いのでチューニングしてみた