接続数 worker_processes * worker_connections
worker_rlimit_nofile * worker_processes < OS全体で扱えるファイル数 (file-max)
worker_connections * 4 < worker_rlimit_nofile
worker_processes * worker_connections * 2 < エフェメラルポート数
worker_processes
ServerのCPU Core数を確認。
# cat /proc/cpuinfo |grep processor最後が「processor:15」ならコア数は16。これをnginxのworker_processesに設定する
# vi /etc/nginx/nginx.confworker_processes 16;
worker_rlimit_nofile
【Nginx】ちょっと時間を掛けてチューニングしてみた。 | Study Infra 2022
worker_rlimit_nofileの値の決め方
worker_rlimit_nofile * workerプロセス数 < OS全体で扱えるファイル数worker_connectionsの値の決め方
worker_connections * 4 < worker_rlimit_nofile[Nginx]worker_connectionsとworker_rlimit_nofileの値は何がいいのか? - Qiita 2019
何故 worker_connections の2倍の値が worker_rlimit_nofile 以下であればOK?
1接続で1ファイルディスクリプタしか使わないんじゃないの?って思うかもしれませんが、1接続で2ファイルディスクリプタを使います。
通常、1つの接続につき以下のファイルディスクリプタを消費します。
- エフェメラルポート用のソケットファイル
- 実際に返答するコンテンツファイル
また、これは通常のケースで設定やバックエンドシステムによってはもっと増える可能性があります。なので、基本的には設定したファイルディスクリプタの半分の値です。一応余裕を持って3~4倍がいいと各所で言われていますね。その通りだと思います。
[Nginx]worker_connectionsとworker_rlimit_nofileの値は何がいいのか? - Qiita 2019 ★
エフェメラルポート
$ sysctl net.ipv4.ip_local_port_range net.ipv4.ip_local_port_range = 32768 60999
ポートの範囲は 32768~60999。60999-32768+1=28232 が使用可能なポート数
チューニング例
Nginxのパラメータと Linuxカーネルパラメータのチューニング - Qiita 2018
1024 65535 (65535-1024+1=64512) RFC 6056
これらの設定は永続的にすることをお薦めします。たとえば、rootとして、テキスト・エディタを使用して/etc/sysctl.confを開き、net.ipv4.ip_local_port_range = 9000 65500のように追加または変更してから、ネットワークを再起動します。
https://docs.oracle.com/cd/F19136_01/cwlin/setting-udp-and-tcp-kernel-parameters-manually.html
9000 65500 (65500-9000+1=65501)
例
Ubuntu
https://gakumon.tech/nginx/nginx_simple_directives.html#worker_rlimit_nofile
$ ulimit -n 1024 $ cat /proc/sys/fs/file-max 195164 worker_processes 2; $ ps aux | grep nginx www-data 15311 79.5 7.2 179016 146632 ? R Apr05 104:29 nginx: worker process www-data 15312 76.1 7.2 179404 146728 ? R Apr05 100:00 nginx: worker process root 22554 0.0 0.3 35688 6244 ? Ss Apr05 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; $ cat /proc/15311/limits | awk 'NR == 1 {print $0} NR > 1 && /Max open files/' Limit Soft Limit Hard Limit Units Max open files 1024 4096 files worker_processes 2; worker_rlimit_nofile 65530; Limit Soft Limit Hard Limit Units Max open files 65530 65530 files worker_processes (2) * worker_rlimit_nofile (65530) = 131060 < file-max (195164) worker_processes 2; worker_rlimit_nofile 65530; events { worker_connections 4096; } worker_connections(4096) * 2 * 2 = 16384 < worker_rlimit_nofile (65530)
FreeBSD
https://rerepi.wordpress.com/2008/04/19/tuning-freebsd-sysoev-rit/
$ sysctl kern.maxfiles kern.maxfiles: 130003 $ sysctl kern.maxfilesperproc kern.maxfilesperproc: 117000 worker_connections(4096) * 2 * 2 = 16384 < maxfilesperproc (117000)