ちょっと同時接続試験をしていたら、centos7のnginxが
Too many open files
ってエラーで詰まっていた。
たぶん、1024コネクションくらいでお腹いっぱいになっている。よくあるファイルディスクリプタの制限っぽい。
んで、CentOS7環境(特にsystemctl,systemd)での対処方法
まずは、現状の確認
nginxのerror.logがこんなのを出力する
1 2 |
# cat error.log 2016/08/31 10:47:15 [crit] 1445#1445: accept4() failed (24: Too many open files) |
んで、nginxのlimitsを確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# # PIDを確認する # # ps axf --snip-- 1440 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 1445 ? S 0:00 \_ nginx: worker process # # limitsを見る # # cat /proc/1445/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 30240 30240 processes Max open files 1024 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 30240 30240 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us |
Max open filesが見事に1024になっている。
とりあえずの対処方法
こいつは突貫対処なので、正しい対処はもっと下にあります。
/etc/systemd/system/multi-user.target.wants/nginx.service
このファイルの
[Service]
のところに
LimitNOFILE=50000
を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# cat /etc/systemd/system/multi-user.target.wants/nginx.service [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true LimitNOFILE=50000 [Install] WantedBy=multi-user.target |
で、再起動。
1 2 |
# systemctl daemon-reload # systemctl restart nginx |
daemon-reloadしないと反映されないので要注意
対処後の確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# # PIDを確認する # # ps axf 3029 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 3030 ? S 0:00 \_ nginx: worker process # # limitsを確認 # # cat /proc/3030/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 30240 30240 processes Max open files 50000 50000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 30240 30240 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us |
はい。50000になってます。
作法の良い対処方法
上の対応だと、rpmで設置される設定ファイルを直接書き換えているので
アップデートとかで消える可能性がある。(だったら書くな)
設定上書き用のディレクトリを作る。
1 |
# mkdir /etc/systemd/system/nginx.service.d/ |
そこに上書き用の設定ファイルを置く。
1 2 3 |
# cat /etc/systemd/system/nginx.service.d/override.conf [Service] LimitNOFILE=50000 |
後は上の例と同じで再起動する。
これでアップデートも安心。
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)