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

GNOME のディレクトリ名を日本語から英語に直す

もう何回同じこと検索しているのかわからないので記す。
RedHad 系(RHEL, Fedora, CentOS)、 Ubuntu であろうがなかろうが GTK 使ってるディスプレイマネージャはこの方法で修正できる。


LANG=C xdg-user-dirs-gtk-update

特に日本語ディレクトリ名にしょっちゅう里心がつく人でなければ二度と聞くなチェックボックスにチェックを入れる。
これで完了。

ホームディレクトリのフォルダ名を日本語から英語に変更するには - @IT

MariaDB 10.1 を CentOS 7.2 にインストールする

/etc/yum.repos.d/MariaDB.repo を作成する。

# MariaDB 10.1 CentOS repository list - created 2016-05-01 03:05 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
sudo yum -y install MariaDB-server MariaDB-client
sudo systemctl enable mariadb
sudo systemctl start mariadb
[root@localhost ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since 日 2016-05-01 03:14:18 UTC; 11s ago
 Main PID: 3783 (mysqld)
   Status: "Taking your SQL requests now..."
   CGroup: /system.slice/mariadb.service
           └─3783 /usr/sbin/mysqld

 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: Version: '10.1.13-Maria...
 5月 01 03:14:18 localhost.localdomain systemd[1]: Started MariaDB database ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.13-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> exit
Bye

CentOS 7.2.1511 に yum-cron 入れた

yum -y install yum-cron
systemctl start yum-cron
systemctl enable yum-cron

設定ファイル /etc/yum/yum-cron.conf はこれぐらいにしておけば OK 。

CentOS 6 時代は yum-cron を入れたら問答無用でアップデートを適用して再起動が必要だっら再起動する凶悪な仕様だったが、CentOS 7 の yum-cron はダウンロードするのみで止まるようだ。

僕は更新があったらメールを送るようにした。

apply_updates = no

#(snip)

[email]
# The address to send email messages from.
email_from = root@smtp.example.com

# List of addresses to send messages to.
email_to = username@example.com

# Name of the host to connect to to send email messages.
email_host = localhost

rbenv + ruby-build をインスコする(Ubuntu, CentOS)

毎回めんどくせぇ・・・。
最近は anyenv というのが流行っているらしい。

動作確認をした環境

  1. CentOS 7.0

やること

必要なもの入れる

CentOS

sudo yum -y groupinstall "Development Tools"
sudo yum -y install openssl-devel zlib-devel readline-devel mysql-devel sqlite-devel git
# アセットパイプライン処理するのに必要になるので nodejs 入れる
sudo yum -y install epel-release
sudo yum -y install nodejs
# 未検証(たぶんこれ)
sudo yum -y install mariadb-server mariadb-devel
# 未検証(たぶんこれ)
sudo yum -y install postgresql-server postgresql-devel

Ubuntu

#sudo apt-get -y install libssl-dev zlib1g-dev libreadline-dev libmysqlclient-dev sqlite3 libsqlite3-dev g++ git curl
sudo apt-get -y install libssl-dev zlib1g-dev libreadline-dev sqlite3 libsqlite3-dev g++ git curl
# アセットパイプライン処理するのに必要になるので nodejs 入れる
sudo apt-get -y install nodejs
# 未検証(たぶんこれ)
sudo apt-get -y install mariadb-server libmariadbd-dev
sudo apt-get -y install postgresql libpq-dev

Git の初期設定

git config --global user.name "Wataru Noguchi"
git config --global user.email "wnoguchi.0727@gmail.com"
git config --global core.editor 'vim -c "set fenc=utf-8"'
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
# required version 1.8.x >=
git config --global push.default simple
git config --global core.precomposeunicode true
git config --global core.quotepath false

rbenv 入れる

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

以下を ~/.bash_profile に追記。

# ~/.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
# ~/.bashrc
eval "$(rbenv init -)"
$ . ~/.bashrc
$ type rbenv
rbenv is a function

ruby-build 入れる

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Ruby をインストールする

  • その前に ~/.gemrc で ri, rdoc がインストールされないようにする
install: --no-document
update: --no-document
$ rbenv install --list
(snip)
  2.2.0
  2.2.1
  2.2.2
  2.2.3
  2.2.4
  2.2.5
  2.2.6
  2.2.7
  2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.3.4
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.4.1
  2.5.0-dev

2.4.1 入れるか。

$ rbenv install 2.4.1
$ rbenv global 2.4.1
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
$ rbenv rehash
$ rbenv exec gem install bundler --no-document
Fetching: bundler-1.10.6.gem (100%)
Successfully installed bundler-1.10.6
1 gem installed
$ bundle --version
Bundler version 1.15.4

ワンライナー

➜  ~ rbenv install 2.4.1 && rbenv global 2.4.1 && rbenv exec gem install bundler
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
Installed ruby-2.4.1 to /home/wnoguchi/.rbenv/versions/2.4.1

Fetching: bundler-1.15.4.gem (100%)
Successfully installed bundler-1.15.4
1 gem installed

References

  1. sstephenson/rbenv
  2. sstephenson/ruby-build
  3. rbenv and rails environement one shot install script.
  4. Linux – Gitをインストールしたら真っ先にやっておくべき初期設定 – Qiita