短版
当没有任何请求时,使用Rails + Unicorn的Heroku上的内存泄漏和R14错误。本地,或Webrick,或服务器负载不成问题。
长版
我在Heroku上运行了一个Rails 4应用程序。当服务器上没有负载时,Heroku报告的内存消耗大约每分钟0.5 MB。几个小时后,R14错误开始出现在日志中,一段时间后,该过程没有响应,Heroku将其杀死。 我也可以看到New Relic中不断增加的内存使用量。
02:03:00 heroku[web.1]: source=web.1 sample#load_avg_1m=0.00 sample#load_avg_5m=0.00 sample#load_avg_15m=0.00
02:03:00 heroku[web.1]: source=web.1 sample#memory_total=533.19MB sample#memory_rss=511.88MB sample#memory_cache=0.00MB sample#memory_swap=21.30MB sample#memory_pgpgin=1034783pages sample#memory_pgpgout=903740pages
02:03:00 heroku[web.1]: Process running mem=533M(104.1%)
环境: Ruby 2.1.4 + Rails 4.1.7 + Unicorn + Heroku with 1 web dyno
到目前为止我尝试了什么
将Unicorn工作人员的数量从默认的3减少到2.没有帮助,只是让内存泄漏慢一点。
已禁用的后台工作程序(从Procfile中删除)。没有效果。没有改变任何东西。
已安装的独角兽工作者杀手。它没有帮助,因为没有任何请求,所以工人杀手永远不会开始(是否有基于时间的工人杀手?)。
使用ApacheBench对服务器进行压力测试。根据New Relic的说法,内存使用量是恒定的,大约190MB /流程。没有增加。似乎只有在没有服务器负载时才会发生内存泄漏。
删除了Unicorn并使用了默认的Webrick。根据New Relic,内存使用情况变得不变,大约208MB /实例!
尝试通过RAILS_ENV=production foreman start
启动生产中的服务器,在本地计算机上重现此问题。在这种情况下没有内存泄漏。
基于第5点,我认为内存泄漏与Unicorn有关但不知何故只发生在Heroku上。 如何追踪问题出在哪里?
谢谢!任何帮助表示赞赏。