В Rails обработка 45 тыс. Записи базы данных с использованием рабочей работы, не влияя на производительность сервера

StackOverflow https://stackoverflow.com/questions/4810060

Вопрос

В моем приложении Rails я использую рабочий процесс для сканирования записей базы данных 45K один раз за 6 часов и отправлять почты, если выполнено определенное условие. Это приводит к всплеску сервера/нагрузки, когда работник обрабатывает. В результате того, какой другой запрос сервера получает удар по производительности. Я пытался использовать find_in_batch, чтобы получить 1000 записей за раз и выполнить обработку. Но использование процессора все еще находится на пиковом уровне. Никакой большой разницы я смог увидеть. Есть ли способ справиться с этим, поэтому использование ЦП не достигло максимального предела?

Это было полезно?

Решение

Оправдываться с уровнем приоритета процесса с использованием nice это один из способов сделать это, но другой - сказать вашему приложению немного от времени расслабиться sleep или же select Команда:

while (doing_stuff)
  do_stuff

  # Take a break for 0.2 seconds
  select(nil, nil, nil, 0.2)
end

А select Call будет блокироваться в течение короткого периода времени, позволяя свободно работать другие задачи. Чем выше вы устанавливаете это значение, тем медленнее будет выполняться ваша задача, но чем ниже влияние на уровень нагрузки процессора.

Другие советы

Я предполагаю, что вы ссылаетесь на работу через Cron и script/runner. Анкет Вы можете попытаться снизить приоритет процесса с nice:

nice -n 19 /usr/bin/ruby <path to your app>/script/runner <your script>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top