如何用Heroku上的send_file(或send_data)解决内存泄漏问题?

时间:2012-08-22 07:58:47

标签: ruby-on-rails heroku mongrel sendfile x-sendfile

我有一个需要生成图像并将数据发送到浏览器的Rails 3应用程序。

该应用必须部署在Heroku上。

但是,Heroku只支持通过Mongrel进行流式传输,而Mongrel会保留内存。这会导致Heroku变慢,然后在十几个请求后终止线程。

https://devcenter.heroku.com/articles/error-codes#r14-memory-quota-exceeded

我目前正在使用ActionController :: DataStreaming的send_data或send_file

http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_data

Heroku不支持Rack :: Sendfile或x-sendfile。

https://devcenter.heroku.com/articles/rack-sendfile

项目“ruby-mongrel-x-sendfile”说:“通过mongrel流式传输非常多的数据是一件坏事;弹出粗糙的内存泄漏”,并提供“in-mongrel解决方案”。但它看起来不是一个好的解决方案。

http://code.google.com/p/ruby-mongrel-x-sendfile/

对此的缓慢解决方案是首先将每个文件上传到Amazon S3。

有人有任何想法吗?

2 个答案:

答案 0 :(得分:1)

答案是用以下方式开始垃圾收集:

GC.start

我在send_data之后将该行放在Rails控制器操作的底部。

http://www.ruby-doc.org/core-1.9.3/GC.html

答案 1 :(得分:0)

绝对不是开始垃圾收集的答案。这掩盖了执行不力的情况。严格来说,您的Ruby进程仍会消耗更多的内存。

答案是流式传输响应数据-即将数据逐块读取到内存中并通过响应主体进行刷新。这样,为发送的文件/数据提供服务的最大内存需求就被限制为要流式传输的“页面”的大小。

检出ActionController::Live并将二进制数据分块读取到请求这些图像的客户端。