nginx の worker_processes を auto にしたときの挙動

worker_processes

ワーカーのプロセス数。ドキュメントを意訳するとこんな感じ。

worker_processes の最適値な、いろんな要素が複雑に絡み合っていて複雑なんや。CPU のコア数とか、負荷のかかり方とか、とにかく複雑なんや。困ったら CPU のコア数とかにしとけばええんちゃうか?あとな、auto にしとくとよしなに設定してやるやで。

よしなに…?

  • よしなにの中身を知りたかったのでググる
  • "よしなに設定する" としか書いてない

ソースをよんだ(怒)

https://github.com/nginx/nginx

worker_processes で grep

それっぽいのでてきた。

src/core/nginx.c
    if (ngx_strcmp(value[1].data, "auto") == 0) {
        ccf->worker_processes = ngx_ncpu;
        return NGX_CONF_OK;
    }

auto だったら ngx_ncpu に設定されるらしい。

ngx_ncpugrep

それっぽいのでてきた。

src/os/unix/ngx_posix_init.h
#if (NGX_HAVE_SC_NPROCESSORS_ONLN)
    if (ngx_ncpu == 0) {
        ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);
    }
#endif

sysconf(_SC_NPROCESSORS_ONLN) で利用可能なプロセッサ数をとれるっぽい。$ man 3 sysconf 参照。
あと気になるのが NGX_HAVE_SC_NPROCESSORS_ONLN

NGX_HAVE_SC_NPROCESSORS_ONLNgrep

auto/unix
ngx_feature="sysconf(_SC_NPROCESSORS_ONLN)"
ngx_feature_name="NGX_HAVE_SC_NPROCESSORS_ONLN"
ngx_feature_run=no
ngx_feature_incs=
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="sysconf(_SC_NPROCESSORS_ONLN)"
. auto/feature

は?(威圧)
突然のシェルスクリプト。とりあえず auto/feature を見てみる。

auto/feature
                cat << END >> $NGX_AUTO_CONFIG_H

#ifndef $ngx_feature_name
#define $ngx_feature_name  `$NGX_AUTOTEST`
#endif

END

だいぶ省略したけど、ビルドするときに動的にヘッダファイルを作ってるみたい。

まとめ

結局コア数だった。