Назад | Перейти на главную страницу

настройка памяти с помощью rails / unicorn на ubuntu

Я использую единорог в Ubuntu 11, Rails 3.0 и Ruby 1.8.7.

Это 8-ядерный блок ec2, и у меня работает 15 рабочих. Кажется, что процессор никогда не застревает, и я, кажется, довольно хорошо обрабатываю запросы.

Мой вопрос касается использования памяти и того, что меня беспокоит по поводу того, что я вижу. (если есть)

Вот сценарий:

При постоянной нагрузке (около 15 запросов / сек, поступающих от nginx) в течение часа каждый сервер в кластере из 3 серверов теряет около 100 МБ / час. Это линейный наклон в течение примерно 6 часов, затем он, кажется, выравнивается, но все же может казаться, что теряется около 10 МБ / час.

Если я отбрасываю свои кеши страниц с помощью команды linux echo 1> / proc / sys / vm / drop_caches, доступная свободная память возвращается к тому, что было, когда я запускал единорогов, и схема потери памяти начинается снова через несколько часов.

Перед:

             total       used       free     shared    buffers     cached
Mem:       7130244    5005376    2124868          0     113628     422856
-/+ buffers/cache:    4468892    2661352
Swap:     33554428          0   33554428

После:

             total       used       free     shared    buffers     cached
Mem:       7130244    4467144    2663100          0        228      11172
-/+ buffers/cache:    4455744    2674500
Swap:     33554428          0   33554428

Мой код Ruby использует мемоизации, и я предполагаю, что Ruby / Rails / Unicorn хранит свои собственные кеши ... мне интересно, стоит ли мне беспокоиться об этом поведении?

FWIW, моя конфигурация Unicorn:

worker_processes 15

listen "#{CAPISTRANO_ROOT}/shared/pids/unicorn_socket", :backlog => 1024
listen 8080, :tcp_nopush => true
timeout 180

pid "#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid"

GC.respond_to?(:copy_on_write_friendly=) and  GC.copy_on_write_friendly = true

before_fork do |server, worker|
  STDERR.puts "XXXXXXXXXXXXXXXXXXX BEFORE FORK"
  print_gemfile_location

  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  defined?(Resque) and Resque.redis.client.disconnect

  old_pid = "#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # already killed
    end
  end

  File.open("#{CAPISTRANO_ROOT}/shared/pids/unicorn.pid.ok", "w"){|f| f.print($$.to_s)}

end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
  defined?(Resque) and Resque.redis.client.connect
end

Есть ли необходимость в экспериментах по обеспечению более строгой сборки мусора с помощью OobGC (http://unicorn.bogomips.org/Unicorn/OobGC.html)? Или это просто нормальное поведение, и когда / когда системе требуется больше памяти, она сама очищает кеши, без того, чтобы я вручную запускал эту команду кеширования? В принципе, это нормальное, ожидаемое поведение?

тиа

Это строка, которая имеет значение (особенно последний столбец):

-/+ buffers/cache: 4468892 2661352

Вы заметите, что это число на самом деле не меняется, когда вы отбрасываете кеши.

ОС будет заниматься освобождением буферов, когда работающим приложениям требуется больше памяти. Что касается того, что вы делаете, непродуктивно пытаться очень возиться с тем, как ОС обрабатывает свою память, особенно с учетом того, что у вас, похоже, много.