Barry Asked: 2024-03-23 00:07:37 +0800 CST2024-03-23 00:07:37 +0800 CST 2024-03-23 00:07:37 +0800 CST nginx 重新加载 - 有效的内存泄漏 772 运行时nginx -s reload,nginx 意味着软重新加载(逐渐关闭旧进程上的现有连接,并为新进程上的新请求提供服务)。 它确实做到了这一点,但似乎(可能)旧进程上的活动请求没有完成。产生失控情况,如果reload尝试多次,服务器最终将耗尽内存。 有没有办法(也许是c++模块?)来转储nginx在特定linux pid上提供服务的连接? 我不确定如何解决这个问题,除非我能准确地找出是什么不允许 nginx 自行关闭。 (我不能只是关闭网站来分而治之,它是一个拥有 200 多个网站的实时客户端服务器) nginx版本:nginx/1.24.0 nginx 1 个回答 Voted Best Answer Marcus Müller 2024-03-23T03:33:44+08:002024-03-23T03:33:44+08:00 我不认为 nginx 按主机划分工作人员;在工作进程处理连接、TLS、HTTP/2 握手之前,它无法知道它正在为哪个主机提供服务,此时请求已经“属于”工作进程。 您可以将 gdb 附加到这些进程 ( gdb -p {pid}),查看有哪些线程以及它们正在等待使用什么info threads。也许一个线程正在等待某个 IO 完成?有些是从管道读取,有些是 IPC?选择该线程 ( thread {number}) 并执行回溯 ( bt)。您可以打印局部变量 ( print {variable name}) 并选择要使用的调用堆栈中的级别 ( frame {stack frame nr.})。
我不认为 nginx 按主机划分工作人员;在工作进程处理连接、TLS、HTTP/2 握手之前,它无法知道它正在为哪个主机提供服务,此时请求已经“属于”工作进程。
您可以将 gdb 附加到这些进程 (
gdb -p {pid}
),查看有哪些线程以及它们正在等待使用什么info threads
。也许一个线程正在等待某个 IO 完成?有些是从管道读取,有些是 IPC?选择该线程 (thread {number}
) 并执行回溯 (bt
)。您可以打印局部变量 (print {variable name}
) 并选择要使用的调用堆栈中的级别 (frame {stack frame nr.}
)。