--- src/core/ngx_connection.c.orig 2020-11-30 21:30:51.798447000 -0500 +++ src/core/ngx_connection.c 2020-12-07 16:32:35.686279000 -0500 @@ -708,6 +708,50 @@ return NGX_OK; } +void +ngx_set_listening_sockets_affinity(ngx_cycle_t *cycle) +{ + ngx_uint_t i, tries, failed; + ngx_err_t err; + ngx_log_t *log; + ngx_listening_t *ls; + int reuseport_numa; + + ls = cycle->listening.elts; + + for (i = 0; i < cycle->listening.nelts; i++) { + + if (ls[i].ignore) { + continue; + } + + if (!ls[i].reuseport || ls[i].worker != ngx_worker) { + continue; + } + + if (ls[i].fd == (ngx_socket_t) -1) { + continue; + } + + if (ls[i].type != SOCK_STREAM) { + continue; + } + + if (ls[i].sockaddr->sa_family == AF_UNIX) { + continue; + } + + reuseport_numa = TCP_REUSPORT_LB_NUMA_CURDOM; + if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_REUSPORT_LB_NUMA, + (const void *) &reuseport_numa, sizeof(int)) + == -1) + { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, + "setsockopt(SO_REUSEPORT_LB_NUMA) failed, " + "ignored"); + } + } +} void ngx_configure_listening_sockets(ngx_cycle_t *cycle) --- src/core/ngx_connection.h.orig 2020-12-01 18:39:37.073676000 -0500 +++ src/core/ngx_connection.h 2020-12-01 18:40:08.670638000 -0500 @@ -212,6 +212,7 @@ ngx_int_t ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls); ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle); ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle); +void ngx_set_listening_sockets_affinity(ngx_cycle_t *cycle); void ngx_configure_listening_sockets(ngx_cycle_t *cycle); void ngx_close_listening_sockets(ngx_cycle_t *cycle); void ngx_close_connection(ngx_connection_t *c); --- src/os/unix/ngx_process_cycle.c.orig 2020-12-07 16:33:55.435869000 -0500 +++ src/os/unix/ngx_process_cycle.c 2020-12-01 18:53:21.595730000 -0500 @@ -884,6 +884,7 @@ if (cpu_affinity) { ngx_setaffinity(cpu_affinity, cycle->log); + ngx_set_listening_sockets_affinity(cycle); } }