nginx 重新加载 - 有效的内存泄漏

nginx 重新加载 - 有效的内存泄漏

运行时nginx -s reload,nginx 意味着软重新加载(逐渐关闭旧进程上的现有连接,并为新进程上的新请求提供服务)。

它确实做到了这一点,但似乎(可能)旧进程上的活动请求没有完成。产生失控情况,如果reload尝试多次,服务器最终将耗尽内存。

有没有办法(也许是c++模块?)来转储nginx正在服务的连接具体的linux PID?
我不确定如何解决这个问题,除非我能准确地找出是什么不允许 nginx 自行关闭。
(我不能只是关闭网站来分而治之,它是一个拥有 200 多个网站的实时客户端服务器)

在此输入图像描述

nginx版本:nginx/1.24.0

答案1

我不认为 nginx 按主机划分工作人员;在工作进程处理连接、TLS、HTTP/2 握手之前,它无法知道它正在服务哪个主机,此时请求已经“属于”工作进程。

您可以将 gdb 附加到这些进程 ( gdb -p {pid}),查看有哪些线程以及它们正在等待使用什么info threads。也许一个线程正在等待某个 IO 完成?有些是从管道读取,有些是 IPC?选择该线程 ( thread {number}) 并执行回溯 ( bt)。您可以打印局部变量 ( print {variable name}) 并选择要使用的调用堆栈中的级别 ( frame {stack frame nr.})。

相关内容