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 に戻ります。
スワッピングが問題を引き起こしているのではないかと疑っていましたが、swappiness を下げ、(swapstats.rb を使用して) 親プロセスも子プロセスもスワップアウトされていないことを確認した後も、問題は解決しません。
shared_dirty メモリとは何か、それがどのようにしてプライベート メモリに変わるのか正確にはわかりません。また、共有メモリの寿命と量を改善するための提案も大好きです。ありがとう!