nginx Rails Mysql の構成で、アクセス負荷に耐えるためとりあえずやっておくこと

Too many open files

nginx (/etc/nginx/nginx.conf)

# CPU と同じ数
worker_processes  8;

# worker_connections の 4倍程度
# failed (24: Too many open files)  に対処できる。
worker_rlimit_nofile  40960;

events {
  # とりあえずこの値
  worker_connections 10240;
}
open file が増えているかを確認
# これでpid を確認し、
$ ps ax | grep nginx | grep worker
# 数字に、pid を入れる。
$ cat /proc/5618/limits

Resource temporarily unavailable

net.core.somaxconn (/etc/sysctl.conf)

こちらも処理するキューに貯められる最大値。backlog と小さいほうが優先される。

# デフォルトは 1024。とりあえずこの値にする。
# failed (11: Resource temporarily unavailable) に対処できる。
net.core.somaxconn = 65535

再読み込み

sysctl -p

MySQLでtoo many connections

Rails (unicorn.rb)

worker が1増えると、db への connection が1増えるため、max_connection の値には注意する。
DBのpool は、DBの接続数にあまり意味が無い。

DB の connection 数を確認する

worker にアクセスがなければ、unicorn が起動していても connection が増えない場合もあるので注意する。

show status like 'Threads_connected';
DB の max_connection 数を確認する

この値を超えてしまった場合は、DBへ接続できないということになる。ただし、単純にDBのmax_connection を増やしてしまうと、DB 側のメモリ消費が増えてしまう。

show variables like 'max_connections';
# メモリを最大限消費する数にする。多すぎると、swapが発生し、遅すぎて処理ができなくなる。実際にworker へアクセスされた時にメモリ消費が増えるため、起動した時の値だけで判断してはいけない。
# failed (110: Connection timed out) に対処するための一つの要素。
worker_processes 10

# backlog に、キューに積み上げられる最大数を設定する。
# failed (11: Resource temporarily unavailable) に対処できる。
listen "/var/sample.sock", backlog: 8192