Максимальное количество запросов на одного работника в единороге - PullRequest
4 голосов
/ 14 октября 2011

Я искал, но не нашел, параметр «Максимальное количество запросов на одного работника» в единороге, похожий на max_requests из gunicorn или Apache MaxRequestsPerChild.

Существует ли он?Кто-нибудь реализовал это?

Я думаю поместить его в файл, где у меня есть oobgc, так как он получает контроль после каждого запроса в любом случае.Звучит ли это правильно?

Проблема в том, что мои рабочие-единороги становятся большими и толстыми, а сборка мусора занимает все больше моего процессора.

Ответы [ 2 ]

6 голосов
/ 18 ноября 2012

Я только что выпустил камень ' Единорог-работник-убийца '.Это позволяет вам уничтожать работника Unicorn, основываясь на 1) максимальном количестве запросов и 2) объеме памяти процесса (RSS), не влияя на запрос.Это действительно легко использовать.Сначала добавьте эту строку в Gemfile.

gem 'unicorn-worker-killer'

Затем добавьте следующие строки в config.ru.

# Unicorn self-process killer
require 'unicorn/worker_killer'

# Max requests per worker
use Unicorn::WorkerKiller::MaxRequests, 3072, 4096

# Max memory size (RSS) per worker
use Unicorn::WorkerKiller::Oom, (256*(1024**2)), (384*(1024**2))

Настоятельно рекомендуется рандомизироватьпорог, чтобы не убивать всех работников одновременно.

2 голосов
/ 19 декабря 2011

Unicorn не предлагает max-запросов.

Мастер Unicorn повторно вызовет любого работника, который выходит, и работник будет грациозно выходить в конце текущего запроса, когда он получитСигнал ВЫХОДА , так что вы можете легко свернуть свою собственную логику максимального запроса в жизненный цикл вашего рабочего запроса.

С Rails, что-то вроде следующего в вашем контроллере приложений (альтернативно, аналогичная логика в промежуточном программном обеспечении стойки).)

after_filter do
  @@request_count ||= 0
  Process.kill('QUIT',$$) if (@@request_count += 1) > MAX_REQUESTS
end
...