Server was too busy and OOM Killer fired

昨日からサーバーに繋がりにくくなっていた。
サーバーに繋がらなくなった。
大方 php-fpm のプロセスがたくさん増えて swap 発生しまくってるんだろうと思った。

1vCPU に 512MB しかない VM にそんなに多くを期待してはいけない。

IP アドレスでアクセス制限かけてたからどうせ外出先からじゃアクセスできないし、戻ったら直そうと思っていた。
メールを確認しようとしたらいよいよ認証も通らなくなったので OOM Killer 発動したかと思ってさくらの VPS のコンソール上からシリアルコンソール接続して
今つないでいる IP のアクセス許可して top を見てみた。

見事に殺されている。
yum-cron のプロセスが死んでるのはいいが、 mysqld (中身は MariaDB )のプロセスまで殺されるのは勘弁してほしい。

[root@mx1 ~]# grep "Out of memory" /var/log/messages
Oct  9 07:10:09 mx1 kernel: Out of memory: Kill process 7192 (yum-cron) score 77 or sacrifice child
Oct  9 08:05:56 mx1 kernel: Out of memory: Kill process 7354 (yum-cron) score 82 or sacrifice child
Oct  9 09:17:09 mx1 kernel: Out of memory: Kill process 7493 (yum-cron) score 73 or sacrifice child
Oct  9 10:07:45 mx1 kernel: Out of memory: Kill process 6905 (mysqld) score 52 or sacrifice child

圧倒的 php-fpm のプロセス数。

OOMKillerTop

圧倒的メモリ不足。

[root@mx1 ~]# vmstat -aS m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 2  0   1059     70    223    140    0    0  3632    28   19   14  0  1 99  0  0

ひとまず静かにデーモンリスタート

[root@mx1 ~]# systemctl restart php-fpm

余裕が出てきた。

free

[root@mx1 ~]# vmstat -aS m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 2  0     70    342     87     26    0    0  3632    28   19   14  0  1 99  0  0

おしまい。

Cookie が無効になっていて MediaWiki にログインできないって言われた件

結論

セッションディレクトリが書込みできませんでした。

エラーメッセージ

ログインのエラー 
example wikiではログインに Cookie を使用します。 Cookie を無効にしているようです。 Cookie を有効にしてから、もう一度試してください。

当方の環境

  • さくらのVPS
  • CentOS7.2.1511 x86_64
  • Nginx + php-fpm
  • PHP 5.4

調べたこと

  • ログにも大したこと書いてない。
  • Cookie は無効になってない。
  • シークレットモードでやってみたけど同じ。
  • Cookie 消してみたけど変わらない。
  • パスワード再発行しても同じ。
  • ブラウザ変えてみたけど同じ。

ぐぐって調べてみるとセッションのディレクトリが書き込みできませんでした、てへ♪的なスレッドが見つかった。

なるほどな。

phpinfo() 出力させてセッション格納ディレクトリを調べる。

session.save_path = /var/lib/php/session

ディレクトリのパーミッションを確認。

[root@mx1 mediawiki]# ls -l /var/lib/php/
合計 4
drwxrwx--- 2 root apache 4096  5月 12 22:49 session
[root@mx1 mediawiki]# ls -l /var/lib/php/session/
合計 64
-rw------- 1 nginx nginx 3436  3月 13 12:10 sess_29ih6fgffffffffff9ee024fa7
(snip)
-rw------- 1 nginx nginx   53  3月 19 07:57 sess_tpih6fgfffffork4bvffmff625

なんでグループが apache やねん!
そりゃ書き込めないはずだわ。
最近流行りに乗って Nginx 使ってるので Apache は使っていない。
ファイル自身は nginx 所有者で大丈夫っぽいな。
Ansible でメールサーバー構築する Playbook 開発してたからそれが原因かな。
念のため nginx と php-fpm の実行ユーザを確認する。

[root@mx1 mediawiki]# vim /etc/nginx/nginx.conf
[root@mx1 mediawiki]# vim /etc/php-fpm.d/www.conf
[root@mx1 mediawiki]# id nginx
uid=995(nginx) gid=993(nginx) groups=993(nginx)

対策実施

ディレクトリのグループを nginx に変更する。

[root@mx1 mediawiki]# chown root:nginx /var/lib/php/session
[root@mx1 mediawiki]# ls -l /var/lib/php/
合計 4
drwxrwx--- 2 root nginx 4096  5月 12 22:49 session

用が済んだら phpinfo のファイルは削除する。

[root@mx1 mediawiki]# rm -f phpinfo.php

これでちゃんとろぐいんできるようになりましたとさ。
めでたしめでたし。

参考リンク

  1. [RESOLVED] Cannot Login or Register. Enable Cookies on Project:Support desk
  2. Help:ログイン – MediaWiki