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