Я использую единорог в 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
Вы заметите, что это число на самом деле не меняется, когда вы отбрасываете кеши.
ОС будет заниматься освобождением буферов, когда работающим приложениям требуется больше памяти. Что касается того, что вы делаете, непродуктивно пытаться очень возиться с тем, как ОС обрабатывает свою память, особенно с учетом того, что у вас, похоже, много.