【发布时间】:2013-06-15 08:55:59
【问题描述】:
Ruby 2.0 引入了一种写时复制友好的垃圾收集器。我的进程似乎没有保持共享内存超过几分钟 - 它似乎从 shared_dirty 到 private_dirty 很快。
其他一些人已经成功地实现了这一点:
- 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 的 shared_clean+shared_dirty。
我怀疑交换可能会导致问题,但在降低交换性并确保父进程和子进程都没有被换出(使用 swapstats.rb)之后,问题仍然存在。
我不明白什么是 shared_dirty 内存,以及它是如何变成私有内存的。我也喜欢关于提高共享内存的寿命和数量的建议。谢谢!
【问题讨论】:
-
我仍然没有解决方案。我现在认为这是 a) 32 位 linux 版本的问题,b) 内存受限的环境(尽管即使关闭了 swappiness,它仍然会发生)
-
我从 gist 的作者那里得到了这条评论:twitter.com/kenn/status/402832587007086592
-
我也ping了其他东西的作者:twitter.com/dakull/status/403156502598279170
-
出于好奇,如果您尝试对 Phusion Passenger 进行同样的操作,效果如何?
-
那么,Ruby 2.1 有什么不同吗?
标签: ruby-on-rails linux memory unicorn ruby-2.0