В Rails обработка 45 тыс. Записи базы данных с использованием рабочей работы, не влияя на производительность сервера
-
24-10-2019 - |
Вопрос
В моем приложении 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>