mirror of
https://github.com/openresty/openresty
synced 2024-11-09 18:35:51 +01:00
cf7516fcbc
When `reuseport` is enabled in the `listen` directive, Nginx will create a listening fd for each worker process in the master process. These fds will be inherited by the worker processes, but most of them are unused. For example, considering we have 32 listening ip:port configurations and 64 worker processes, each worker process will inherit 2048 (32 * 64) listening fds, but only 32 fds are used. By closing the unused fds, this change could save up to 2016 (32 * 63) fds in a worker process. It doesn't affect the listening socket, since there is only one used fd which associates to the socket with or without this change. Co-authored-by: Thibault Charbonnier <thibaultcha@me.com>
39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
|
|
--- a/src/core/ngx_connection.c
|
|
+++ b/src/core/ngx_connection.c
|
|
@@ -1118,6 +1118,12 @@ ngx_close_listening_sockets(ngx_cycle_t *cycle)
|
|
ls = cycle->listening.elts;
|
|
for (i = 0; i < cycle->listening.nelts; i++) {
|
|
|
|
+#if (NGX_HAVE_REUSEPORT)
|
|
+ if (ls[i].fd == (ngx_socket_t) -1) {
|
|
+ continue;
|
|
+ }
|
|
+#endif
|
|
+
|
|
c = ls[i].connection;
|
|
|
|
if (c) {
|
|
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
|
|
--- a/src/event/ngx_event.c
|
|
+++ b/src/event/ngx_event.c
|
|
@@ -775,6 +775,18 @@ ngx_event_process_init(ngx_cycle_t *cycle)
|
|
|
|
#if (NGX_HAVE_REUSEPORT)
|
|
if (ls[i].reuseport && ls[i].worker != ngx_worker) {
|
|
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,
|
|
+ "closing unused fd:%d listening on %V",
|
|
+ ls[i].fd, &ls[i].addr_text);
|
|
+
|
|
+ if (ngx_close_socket(ls[i].fd) == -1) {
|
|
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
|
|
+ ngx_close_socket_n " %V failed",
|
|
+ &ls[i].addr_text);
|
|
+ }
|
|
+
|
|
+ ls[i].fd = (ngx_socket_t) -1;
|
|
+
|
|
continue;
|
|
}
|
|
#endif
|