Mercurial > hg > nginx
view src/misc/ngx_google_perftools_module.c @ 7698:5440ff4ac6fc
Core: reusing connections in advance.
Reworked connections reuse, so closing connections is attempted in
advance, as long as number of free connections is less than 1/16 of
worker connections configured. This ensures that new connections can
be handled even if closing a reusable connection requires some time,
for example, for a lingering close (ticket #2017).
The 1/16 ratio is selected to be smaller than 1/8 used for disabling
accept when working with accept mutex, so nginx will try to balance
new connections to different workers first, and will start reusing
connections only if this won't help.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 10 Aug 2020 18:53:07 +0300 |
parents | a27e0c7e198c |
children |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> /* * declare Profiler interface here because * <google/profiler.h> is C++ header file */ int ProfilerStart(u_char* fname); void ProfilerStop(void); void ProfilerRegisterThread(void); static void *ngx_google_perftools_create_conf(ngx_cycle_t *cycle); static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle); typedef struct { ngx_str_t profiles; } ngx_google_perftools_conf_t; static ngx_command_t ngx_google_perftools_commands[] = { { ngx_string("google_perftools_profiles"), NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, ngx_conf_set_str_slot, 0, offsetof(ngx_google_perftools_conf_t, profiles), NULL }, ngx_null_command }; static ngx_core_module_t ngx_google_perftools_module_ctx = { ngx_string("google_perftools"), ngx_google_perftools_create_conf, NULL }; ngx_module_t ngx_google_perftools_module = { NGX_MODULE_V1, &ngx_google_perftools_module_ctx, /* module context */ ngx_google_perftools_commands, /* module directives */ NGX_CORE_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ ngx_google_perftools_worker, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING }; static void * ngx_google_perftools_create_conf(ngx_cycle_t *cycle) { ngx_google_perftools_conf_t *gptcf; gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t)); if (gptcf == NULL) { return NULL; } /* * set by ngx_pcalloc() * * gptcf->profiles = { 0, NULL }; */ return gptcf; } static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle) { u_char *profile; ngx_google_perftools_conf_t *gptcf; gptcf = (ngx_google_perftools_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module); if (gptcf->profiles.len == 0) { return NGX_OK; } profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log); if (profile == NULL) { return NGX_OK; } if (getenv("CPUPROFILE")) { /* disable inherited Profiler enabled in master process */ ProfilerStop(); } ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid); if (ProfilerStart(profile)) { /* start ITIMER_PROF timer */ ProfilerRegisterThread(); } else { ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, "ProfilerStart(%s) failed", profile); } ngx_free(profile); return NGX_OK; } /* ProfilerStop() is called on Profiler destruction */