socket.io 的 Nginx 内存泄漏

Nginx memory leak with socket.io

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

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

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

非常感谢您的帮助,并为语法道歉。如果需要,我可以提供更多 info/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_buffering 配置参数并仅保留: proxy_buffering关闭; proxy_buffer_size4k; 可以在这里看到差异on the following picture.