精简版
当没有任何请求时,使用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,带有1个web dyno
到目前为止我尝试了什么
Unicorn工作人员的数量从默认的3减少到2.没有帮助,只是让内存泄漏慢了一点.
禁用后台工作者(从Procfile中删除).没有效果.没有改变什么.
已安装的独角兽工人杀手.它没有帮助,因为没有任何请求,所以工人杀手永远不会踢(有没有基于时间的工人杀手?).
使用ApacheBench对服务器进行压力测试.根据New Relic的说法,内存使用量是恒定的,大约190MB /流程.没有增加.似乎只有在没有服务器负载时才会发生内存泄漏.
删除了Unicorn并使用了默认的Webrick.根据New Relic,内存使用量变得不变,大约208MB /实例!
试图通过启动生产中的服务器在本地计算机上重现此问题RAILS_ENV=production foreman start.在这种情况下没有内存泄漏.
基于第5点,我认为内存泄漏与Unicorn有关但不知何故只发生在Heroku上.如何追踪问题出在哪里?
谢谢!任何帮助表示赞赏.