NGINX epollモジュールの設定構造と初期化処理

NGINXのイベント駆動型I/O処理を支えるepollモジュールは、ngx_epoll_module.cで実装されており、Linux環境下での非同期イベント管理を担います。このモジュールは、設定パラメータの生成・初期化からイベント操作関数群の登録まで、一連のライフサイクルを提供します。

モジュール定義とコマンド構造

static ngx_str_t epoll_label = ngx_string("epoll");

static ngx_command_t epoll_directives[] = {
    { ngx_string("epoll_events"),
      NGX_EVENT_CONF | NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      0,
      offsetof(ngx_epoll_settings_t, max_events),
      NULL },

    { ngx_string("worker_aio_requests"),
      NGX_EVENT_CONF | NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      0,
      offsetof(ngx_epoll_settings_t, max_aio_ops),
      NULL },
    ngx_null_command
};

static ngx_event_module_t epoll_context = {
    &epoll_label,
    ngx_epoll_alloc_config,             /* 設定構造体生成 */
    ngx_epoll_setup_config,             /* 設定値初期化 */

    {
        ngx_epoll_register,             /* イベント追加 */
        ngx_epoll_remove,               /* イベント削除 */
        ngx_epoll_register,             /* イベント有効化 */
        ngx_epoll_remove,               /* イベント無効化 */
        ngx_epoll_attach_conn,          /* 接続追加 */
        ngx_epoll_detach_conn,          /* 接続削除 */
#if (NGX_HAVE_EVENTFD)
        ngx_epoll_send_notify,          /* 通知発行 */
#else
        NULL,
#endif
        ngx_epoll_handle_events,        /* イベント処理 */
        ngx_epoll_startup,              /* 初期化 */
        ngx_epoll_shutdown,             /* 終了処理 */
    }
};

ngx_module_t ngx_epoll_module = {
    NGX_MODULE_V1,
    &epoll_context,
    epoll_directives,
    NGX_EVENT_MODULE,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NGX_MODULE_V1_PADDING
};

設定構造体の生成: ngx_epoll_alloc_config

この関数は、設定フェーズにおいてepoll固有の設定構造体をメモリ上に確保し、未設定状態で初期化します。これにより、後続の設定解析でユーザー指定値とデフォルト値を区別可能になります。

static void *
ngx_epoll_alloc_config(ngx_cycle_t *env) {
    ngx_epoll_settings_t *cfg;

    cfg = ngx_palloc(env->pool, sizeof(ngx_epoll_settings_t));
    if (cfg == NULL) {
        return NULL;
    }

    cfg->max_events = NGX_CONF_UNSET;
    cfg->max_aio_ops = NGX_CONF_UNSET;

    return cfg;
}
  • env->pool:現在のサイクルに関連付けられたメモリプールを使用して安全に確保。
  • NGX_CONF_UNSET:未設定フラグ。後段の初期化処理でデフォルト値が適用される基準となる。

設定値の初期化: ngx_epoll_setup_config

設定ファイルの読み込み後に呼び出され、未設定の項目に対して合理的なデフォルト値を割り当てます。

static char *
ngx_epoll_setup_config(ngx_cycle_t *env, void *raw_cfg) {
    ngx_epoll_settings_t *cfg = raw_cfg;

    ngx_conf_init_uint_value(cfg->max_events, 512);
    ngx_conf_init_uint_value(cfg->max_aio_ops, 32);

    return NGX_CONF_OK;
}
  • max_eventsepoll_wait()が一度に処理するイベント数の上限。512は高負荷でも安定する経験的最適値。
  • max_aio_ops:非同期I/Oリクエストの同時実行上限。32はメモリ消費と並列性のバランスを考慮した値。
  • ngx_conf_init_uint_value:未設定時のみ値を代入するマクロ。既にユーザー設定があればそれを優先。

タグ: nginx epoll linux-aio

5月19日 11:35 投稿