summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2020-08-10 18:53:07 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2020-08-10 18:53:07 +0300
commit348bc94086d94f27dbda5904174cd379bce7f931 (patch)
tree0f98aca3b52975360b55577d979f55c1de4c6de6
parente240d88d4497afd2493358e938f74486750bc776 (diff)
downloadnginx-348bc94086d94f27dbda5904174cd379bce7f931.tar.gz
nginx-348bc94086d94f27dbda5904174cd379bce7f931.tar.bz2
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.
Diffstat (limited to '')
-rw-r--r--src/core/ngx_connection.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
index 91e1b3b2e..c082d0dac 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -1107,12 +1107,9 @@ ngx_get_connection(ngx_socket_t s, ngx_log_t *log)
return NULL;
}
- c = ngx_cycle->free_connections;
+ ngx_drain_connections((ngx_cycle_t *) ngx_cycle);
- if (c == NULL) {
- ngx_drain_connections((ngx_cycle_t *) ngx_cycle);
- c = ngx_cycle->free_connections;
- }
+ c = ngx_cycle->free_connections;
if (c == NULL) {
ngx_log_error(NGX_LOG_ALERT, log, 0,
@@ -1298,7 +1295,9 @@ ngx_drain_connections(ngx_cycle_t *cycle)
ngx_queue_t *q;
ngx_connection_t *c;
- if (cycle->reusable_connections_n == 0) {
+ if (cycle->free_connection_n > cycle->connection_n / 16
+ || cycle->reusable_connections_n == 0)
+ {
return;
}