Skip to content

Commit

Permalink
conf, router: Make the listen(2) backlog configurable
Browse files Browse the repository at this point in the history
@oopsoop2 on GitHub reported a performance issue related to the default
listen(2) backlog size of 511 on nginx. They found that increasing it
helped, nginx has a config option to configure this.

They would like to be able to do the same on Unit (which also defaults
to 511 on some systems, incl Linux). This seems reasonable.

This adds a new per-listener 'backlog' config option, e.g

  {
      "listeners": {
          "[::1]:8080": {
              "pass": "routes",
              "backlog": 1024
          },
      }

      ...
  }

This doesn't effect the control socket.

Closes: nginx#1384
Reported-by: <https://github.com/oopsoop2>
Signed-off-by: Andrew Clayton <[email protected]>
  • Loading branch information
ac000 committed Aug 14, 2024
1 parent 2022427 commit c6d5699
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 5 deletions.
32 changes: 32 additions & 0 deletions src/nxt_conf_validation.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ static nxt_int_t nxt_conf_vldt_app_name(nxt_conf_validation_t *vldt,
nxt_conf_value_t *value, void *data);
static nxt_int_t nxt_conf_vldt_forwarded(nxt_conf_validation_t *vldt,
nxt_conf_value_t *value, void *data);
static nxt_int_t nxt_conf_vldt_listen_backlog(nxt_conf_validation_t *vldt,
nxt_conf_value_t *value, void *data);
static nxt_int_t nxt_conf_vldt_app(nxt_conf_validation_t *vldt,
nxt_str_t *name, nxt_conf_value_t *value);
static nxt_int_t nxt_conf_vldt_object(nxt_conf_validation_t *vldt,
Expand Down Expand Up @@ -424,6 +426,10 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_listener_members[] = {
.type = NXT_CONF_VLDT_OBJECT,
.validator = nxt_conf_vldt_object,
.u.members = nxt_conf_vldt_client_ip_members
}, {
.name = nxt_string("backlog"),
.type = NXT_CONF_VLDT_NUMBER,
.validator = nxt_conf_vldt_listen_backlog,
},

#if (NXT_TLS)
Expand Down Expand Up @@ -2677,6 +2683,32 @@ nxt_conf_vldt_forwarded(nxt_conf_validation_t *vldt, nxt_conf_value_t *value,
}


static nxt_int_t
nxt_conf_vldt_listen_backlog(nxt_conf_validation_t *vldt,
nxt_conf_value_t *value, void *data)
{
int64_t backlog;

backlog = nxt_conf_get_number(value);

/*
* POSIX allows this to be 0 and some systems use -1 to
* indicate to use the OS's default value.
*/
if (backlog < -1) {
return nxt_conf_vldt_error(vldt, "The \"backlog\" number must be "
"equal to or greater than -1.");
}

if (backlog > NXT_INT32_T_MAX) {
return nxt_conf_vldt_error(vldt, "The \"backlog\" number must "
"not exceed %d.", NXT_INT32_T_MAX);
}

return NXT_OK;
}


static nxt_int_t
nxt_conf_vldt_app(nxt_conf_validation_t *vldt, nxt_str_t *name,
nxt_conf_value_t *value)
Expand Down
20 changes: 15 additions & 5 deletions src/nxt_router.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ static void nxt_router_app_prefork_ready(nxt_task_t *task,
static void nxt_router_app_prefork_error(nxt_task_t *task,
nxt_port_recv_msg_t *msg, void *data);
static nxt_socket_conf_t *nxt_router_socket_conf(nxt_task_t *task,
nxt_router_temp_conf_t *tmcf, nxt_str_t *name);
nxt_router_temp_conf_t *tmcf, nxt_str_t *name, int backlog);
static nxt_int_t nxt_router_listen_socket_find(nxt_router_temp_conf_t *tmcf,
nxt_socket_conf_t *nskcf, nxt_sockaddr_t *sa);

Expand Down Expand Up @@ -1959,12 +1959,22 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
next = 0;

for ( ;; ) {
int listen_backlog = -1;
nxt_conf_value_t *backlog;

static const nxt_str_t backlog_path = nxt_string("backlog");

listener = nxt_conf_next_object_member(listeners, &name, &next);
if (listener == NULL) {
break;
}

skcf = nxt_router_socket_conf(task, tmcf, &name);
backlog = nxt_conf_get_object_member(listener, &backlog_path, NULL);
if (backlog != NULL) {
listen_backlog = nxt_conf_get_number(backlog);
}

skcf = nxt_router_socket_conf(task, tmcf, &name, listen_backlog);
if (skcf == NULL) {
goto fail;
}
Expand Down Expand Up @@ -2684,7 +2694,7 @@ nxt_router_application_init(nxt_router_conf_t *rtcf, nxt_str_t *name,

static nxt_socket_conf_t *
nxt_router_socket_conf(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
nxt_str_t *name)
nxt_str_t *name, int backlog)
{
size_t size;
nxt_int_t ret;
Expand Down Expand Up @@ -2728,7 +2738,7 @@ nxt_router_socket_conf(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
nxt_listen_socket_remote_size(ls);

ls->socket = -1;
ls->backlog = NXT_LISTEN_BACKLOG;
ls->backlog = backlog > -1 ? backlog : NXT_LISTEN_BACKLOG;
ls->flags = NXT_NONBLOCK;
ls->read_after_accept = 1;
}
Expand Down Expand Up @@ -2875,7 +2885,7 @@ nxt_router_listen_socket_ready(nxt_task_t *task, nxt_port_recv_msg_t *msg,

nxt_socket_defer_accept(task, s, rpc->socket_conf->listen->sockaddr);

ret = nxt_listen_socket(task, s, NXT_LISTEN_BACKLOG);
ret = nxt_listen_socket(task, s, rpc->socket_conf->listen->backlog);
if (nxt_slow_path(ret != NXT_OK)) {
goto fail;
}
Expand Down

0 comments on commit c6d5699

Please sign in to comment.