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.
背景故事: 我们为许多客户管理基础设施,几乎所有客户都有 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.