nginx connections 接続数 チューニング

接続数 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.conf

worker_processes 16;

Nginx+PHP-FPMのTuning設定 2012

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つの接続につき以下のファイルディスクリプタを消費します。

  1. エフェメラルポート用のソケットファイル
  2. 実際に返答するコンテンツファイル

また、これは通常のケースで設定やバックエンドシステムによってはもっと増える可能性があります。なので、基本的には設定したファイルディスクリプタの半分の値です。一応余裕を持って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)