お首が長いのよお首が長いのよ

チラシの裏よりお届けするソフトウェアエンジニアとして成長したい人のためのブログ

2018-07-23

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で稼働するマシンによってはスワップファイルが自動で作成されない事を踏まえ、実装メモリと同じサイズのスワップファイルを作成する事にした。

暫定対応

スワップファイル作成

bash
1dd if=/dev/zero of=/swap bs=1M count=2048
2mkswap /swap
3swapon /swap
4

恒久対応にするために

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

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

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

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

暫定対応

設定ファイル

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

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

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

再起動前

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

bash
1free -h
2              total        used        free      shared  buff/cache   available
3Mem:           1.9G        1.6G        112M         69M        181M         32M
4Swap:          2.0G        198M        1.8G
5
bash
1systemctl status php-fpm
2● php-fpm.service - The PHP FastCGI Process Manager
3   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
4   Active: active (running) since Tue 2018-04-03 06:12:11 UTC; 3 months 20 days ago
5 Main PID: 79089 (php-fpm)
6   Status: "Processes active: 0, idle: 32, Requests: 30362, slow: 0, Traffic: 0req/sec"
7   CGroup: /system.slice/php-fpm.service
8           ├─  3924 php-fpm: pool www
9           ├─  3930 php-fpm: pool www
10           ├─  3931 php-fpm: pool www
11           ├─ 25504 php-fpm: pool www
12           ├─ 25505 php-fpm: pool www
13           ├─ 25506 php-fpm: pool www
14           ├─ 25510 php-fpm: pool www
15           ├─ 25511 php-fpm: pool www
16           ├─ 25512 php-fpm: pool www
17           ├─ 25513 php-fpm: pool www
18           ├─ 25518 php-fpm: pool www
19           ├─ 25519 php-fpm: pool www
20           ├─ 25520 php-fpm: pool www
21           ├─ 25521 php-fpm: pool www
22           ├─ 25522 php-fpm: pool www
23           ├─ 25529 php-fpm: pool www
24           ├─ 25530 php-fpm: pool www
25           ├─ 25531 php-fpm: pool www
26           ├─ 25532 php-fpm: pool www
27           ├─ 25533 php-fpm: pool www
28           ├─ 44261 php-fpm: pool www
29           ├─ 44263 php-fpm: pool www
30           ├─ 44264 php-fpm: pool www
31           ├─ 72957 php-fpm: pool www
32           ├─ 79089 php-fpm: master process (/etc/php-fpm.conf)
33           ├─ 79091 php-fpm: pool www
34           ├─ 79092 php-fpm: pool www
35           ├─ 79093 php-fpm: pool www
36           ├─ 79094 php-fpm: pool www
37           ├─ 79095 php-fpm: pool www
38           ├─ 79117 php-fpm: pool www
39           ├─ 79218 php-fpm: pool www
40           └─109178 php-fpm: pool www
41

再起動後

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

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

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

/以上

引用・参考

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

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

よかったらシェアしてください!