Ruby on rails 高流量rails应用程序提供随机502和读取超时

Ruby on rails 高流量rails应用程序提供随机502和读取超时,ruby-on-rails,nginx,puma,high-load,bad-gateway,Ruby On Rails,Nginx,Puma,High Load,Bad Gateway,我有一个带有api的rails应用程序,它每天接收大约600k到~1000k个请求。这些请求主要针对文件列表和获取端点 文件列表端点从elasticsearch获取包含文件信息的2000条记录的列表,每个记录都有一个id,然后使用send_file(使用Nginx的默认X-SendFile头)和send_数据通过api获取文件(如果文件是压缩的,则会动态地将其解压缩并读取) 这都是托管在一个hypervisor lxd设置上的,在这里我们遇到了内存填充的问题,虽然我们有32G的内存,但我们将其增

我有一个带有api的rails应用程序,它每天接收大约600k到~1000k个请求。这些请求主要针对文件列表和获取端点

文件列表端点从elasticsearch获取包含文件信息的2000条记录的列表,每个记录都有一个id,然后使用send_file(使用Nginx的默认X-SendFile头)和send_数据通过api获取文件(如果文件是压缩的,则会动态地将其解压缩并读取)

这都是托管在一个hypervisor lxd设置上的,在这里我们遇到了内存填充的问题,虽然我们有32G的内存,但我们将其增加到48gb,但这也是逐渐填充的

我们最初认为502和读取超时是因为内存被填满了。我们做了一些分析,以发现读取文件会消耗内存,并且lxd容器似乎存在一个问题,没有释放内存,我们通过每30分钟释放一次内存的脚本修复了这个问题

现在内存已经稳定,我们仍然会随机获得一些读数和502,以及SSL_连接问题,该问题在获得502后开始(随机)出现,如果我们重新启动应用程序,则会停止

我们为postgres db使用默认的puma配置和5池连接

任何关于优化和调试的想法都会有所帮助


谢谢。

您真的需要使用发送文件吗?您的用户是否严格要求实时获取文件?是的,必须是实时的,如果不是,您有什么建议?我建议在工作完成后进行一些通知(电子邮件、推送、套接字)的后台工作。我们已经完成了像这样的图像上传,但这必须是实时的