Nginxのworker_processesとworker_cpu_affinity

Nginxの設定項目にworker_processesというものがある。Nginx本体のプロセス数を設定するもので、Debianの標準パッケージだと4が設定されている。

/etc/nginx/nginx.conf
worker_processes 4;

とくに変更する必要はないが、Nginxがシングルスレッドで動作するため、コア数に合わせて設定しておくのが標準的な運用である。

# grep processor /proc/cpuinfo |wc
      2       6      28

この場合、コア数は2なので、

worker_processes 2;

として運用する。

とはいえ、コア数が2の場合でworker_processesを4にしてプロセス数が多くても特別問題ないので通常は変える必要はないだろう。

プロセス数が多いほうがいいのは、写真を多く扱っていたり、コンテンツが多い場合である。コンテンツにおけるページ数(ファイル数)やそれぞれの容量が大きく、メモリ容量を大きく超えるコンテンツを捌くような場合は、ディスクI/Oが全体のボトルネックになっている。そのような場合はプロセス数を増やして(CPUが遊ばないようにして)運用すると処理できる量が増える。

NginxプロセスのCPUへの割り当てはworker_cpu_affinityで設定する。worker_cpu_affinityを設定していない場合、割り当てはOSのスケジューラに依存する。Debian=いまどきのLinuxカーネルでは、両方に割り当てられるようになっている。

# ps aux |grep 'nginx: worker'
www-data  2056  0.0  0.2 207784  2056 ?        S     ???   0:11 nginx: worker process
www-data  2057  0.0  0.2 208116  2932 ?        S     ???   0:00 nginx: worker process
# taskset -pc 2056
pid 2056's current affinity list: 0,1
# taskset -pc 2057
pid 2057's current affinity list: 0,1

 明示的にコアを指定しておきたい場合は、

# taskset -pc 1 2057
pid 2057's current affinity list: 0,1
pid 2057's new affinity list: 1

のようにするか、worker_cpu_affinityで、

worker_processes 2;
worker_cpu_affinity 01 10

 のように、2進数でCPUを指定する記述を記載する。1のところが指定するCPUになり、11と記載すれば「0,1」=両方のコアと同じ。「11 01」とすれば、workerプロセスの1つ目は両方のコアに割り当てられる可能性があり、後者は0番のみになる。2コアで2プロセス運用する際は、「01 10」、3プロセスの場合は、「01 10 11 」(1つ目は0番固定、2つ目は2番固定、3つ目はどちらか)などとしておくのがいいだろう。