运行Prawn::Document.image时出现Heroku错误R14(超过内存配额)



我的rails应用程序中只有一个请求出现Heroku R14错误。

我在本地复制生产环境并查看同一页面,没有错误。

根据heroku日志进行调试后。我发现在这个请求之后,内存增加得更快。这是内存日志。

2013-08-15T08:28:45.104572+000:00 heroku[web.1]:源=heroku16694287.web.1.95c77962-7288-bf-5-912-d2db99eab511测量=内存总值=113.04单位=MB

2013-08-15T08:29:01.486530+000:00 app[web.1]:已开始GET"/issues/98/preview";对于111.174.65.157,2013年8月15日08:29:01+0000

2013-08-15T08:29:01.486530+000:00 app[web.1]:已开始GET"/issues/98/preview";对于111.174.65.157,2013年8月15日08:29:01+0000

2013-08-15T08:29:07.330011+000:00 heroku[web.1]:源=heroku16694287.web.1.95c77962-7288-bf-5-912-d2db99eab511测量=内存总值=220.39单位=MB

2013-08-15T08:29:29.712928+000:00 heroku[web.1]:源=heroku16694287.web.1.95c77962-7288-bf-5-912-d2db99eab511测量=内存总值=511.97单位=MB

我检查了几次日志,似乎heroku创建了一个新的rails实例来处理reqesut,过了一段时间,重新创建一个新rails实例,直到它超过内存限制。

我发现有两个请求日志。在我的本地生产环境中,每个请求也有两个日志。我还调试了预览操作,它只调用了一次。在开发过程中,不存在这样的日志问题。所以我认为生产环境中应该有一些日志配置错误。但这应该与heroku的记忆问题无关。

预览请求调用Prawn::Document对象上的图像渲染方法作为

require 'open-uri'
...
# the context is an instance of Prawn:Document
unless image_path.nil?
  f = open(image_path)
  image f, fit: [400, 400]
end    

我很确定这个错误发生在图像线上。如果我删除了图像行,则预览请求有效。页面将显示一个没有图像的pdf。如果我离开它,那么页面将被阻止,最后内存将超过。

我调试了一天,没有更多的想法。

对虾版本为0.12.0

我的rails版本是4.0

有什么建议吗?

在与我的团队讨论后,我明白了原因。

图像尺寸为1920*1080,在heroku上使用Prawn::Document.image似乎无法解决此类图像。一个400*400的作品。

但不知道为什么一张27k的png图片可以占用400M的heroku内存。

最新更新