带有socket.io的Nginx内存泄漏



Backstory:我们为许多客户管理基础设施,几乎所有客户都有Nginx代理,他们在那里终止SSL并进行一些缓存。我们从未在Nginx上遇到过任何问题,在这次故障排除过程中我们遇到了麻烦。

问题:最近我们为新客户进行了迁移,他们的应用程序使用了socket.io。我们注意到,内存使用率只会随着时间的推移而增加,而只有一个工作进程会导致这种情况。当1个工作人员得到"0"时,重新启动没有帮助;锁定";,RAM使用率只会增加。一切都很好,没有什么是慢的,但它可能会导致OOM,这将是一个问题。当一名工人被杀时,RAM会被释放,但新的RAM也会做同样的事情。

安装程序:运行在ESXi系统管理程序-Ubuntu 18.04.4 LTS上的4vCPU/8GB RAM Nginx VM(版本1.18.0(。Nginx仅被配置为代理,服务于大约150-200 req/sec。没有缓存,没有提供静态文件。我们检查了pmap,发现这被认为是脏内存,但我们不知道是什么原因造成的。syslog或nginx error.log中没有错误。访问日志被关闭,如果你想重新加载有问题的工作程序,则挂在"中;工作进程正在关闭";状态我们假设Nginx侧的socket.io没有正确配置,但很难弄清楚是什么。

非常感谢您的帮助,并为语法问题道歉。如果需要,我可以提供更多的信息/metrics/config。

一些配置参数:

events {
worker_connections  4096;
use epoll;
multi_accept on;
}
http {
aio threads;
keepalive_timeout 65;
proxy_buffering                 on;
proxy_read_timeout              120s;
proxy_send_timeout              120s;
proxy_buffers                   8 2m;
proxy_buffer_size               12m;
proxy_busy_buffers_size         12m;
proxy_headers_hash_max_size     1024;
proxy_headers_hash_bucket_size  128;
....
}

解决方案是删除所有代理缓冲配置参数,只保留:代理缓冲关闭;proxy_buffer_size 4k;区别可以从下面的图片中看出。

最新更新