Ruby 2.0引入了一个写时拷贝友好的垃圾收集器.我的进程似乎不会让内存共享超过几分钟——它似乎从
还有一些人成功地实现了这一点:
- https://gist.github.com/kenn/5105175
- http://marianposaceanu.com/articles/on-ruby-2-0-memory-usage-unicorn-and-heroku
这个程序可以用来判断Linux:https://gist.github.com/kenn/5105061上的内存状态
我的独角兽配置:https://gist.github.com/inspire22/f82c77c0a465f1945305
出于某种原因,我的独角兽应用程序(也带有preload_app=true)的共享内存要少得多.Ruby 2.0-p195、rails 3.2、linux 2.6.18(centos)
[root@thorn script]# ruby memstats.rb 4946
Process: 4946
Command Line: unicorn_rails worker[4] -c /u/apps/newap/current/lib/unicorn.rb -E production -D
Memory Summary:
private_clean 0 kB
private_dirty 56,324 kB
pss 60,256 kB
rss 83,628 kB
shared_clean 4,204 kB
shared_dirty 23,100 kB
size 108,156 kB
swap 68 kB
如果我完全关闭主进程(而不仅仅是HUP),然后重新启动它,并在任何请求排队之前立即判断工作进程,我会得到一个更好的故事:
[root@thorn script]# ruby memstats.rb 5743
Process: 5743
Command Line: unicorn_rails worker[4] -c /u/apps/newap/current/lib/unicorn.rb -E production -D
Memory Summary:
private_clean 0 kB
private_dirty 21,572 kB
pss 27,735 kB
rss 66,296 kB
shared_clean 2,484 kB
shared_dirty 42,240 kB
size 91,768 kB
swap 0 kB
但在启动后的5秒钟内,它们又回到了约20MB的共享_clean+共享_dirty.
我怀疑是交换造成了问题,但在降低交换性并确保父进程和子进程都没有被交换(使用swapstats.rb)之后,问题仍然存在.
我不明白什么是共享脏内存,以及它是如何变成私有内存的.我也很想得到一些建议,以提高我的生命周期 和共享记忆量.谢谢