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, рельсы 3.2, linux 2.6.18 (centos)
[[email protected] 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), перезагрузите его и сразу же проверьте работника до того, как все запросы поставят в очередь, я получаю лучшую историю:
[[email protected] 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 секунд после запуска они вернутся к ~ 20 МБ shared_clean + shared_dirty.
Я подозревал, что замена может вызвать проблему, но после снижения swappiness и обеспечения того, чтобы ни родительский, ни дочерний процессы не были заменены (с использованием swapstats.rb), проблема сохраняется.
Я не понимаю, что такое shared_dirty память, и как она превращается в частную память. Мне также нравятся предложения по улучшению долговечности и объема моей общей памяти. Спасибо!