業務多忙でしばらくブログ更新どころかアクセスすらしていない状況で、いつの間にか当ブログのバックエンドで動いている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で稼働するマシンによってはスワップファイルが自動で作成されない事を踏まえ、実装メモリと同じサイズのスワップファイルを作成する事にした。
暫定対応
スワップファイル作成
bash1dd if=/dev/zero of=/swap bs=1M count=2048 2mkswap /swap 3swapon /swap 4
恒久対応にするために
が、スワップファイルを使用する事前提で稼働させるのは根本的解決にはならないので、nginxや裏で動いているPHPで節約できそうなものがないか調べる。
bash1ps 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 #コメント外す
再起動前
んで、サービスを再起動させる前のメモリ状況
bash1free -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
bash1systemctl 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
再起動後
bash1free -h 2 total used free shared buff/cache available 3Mem: 1.9G 680M 803M 61M 434M 893M 4Swap: 2.0G 116M 1.9G` 5
bash1systemctl 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
んんんー、ほどほどに余裕があって良い感じ。
とはいえ、今回見たく放置してる間に死んでて気がつかない・・・なんて事がないようにプロセスの死活監視ぐらいはしておいたほうが良いのかもしれないな・・・。
/以上
引用・参考
[wordpress][php-fpm][dynamic][static][nginx]なんか重いのでチューニングしてみた
よかったらシェアしてください!