В рельсах Обработка 45 тыс. Записей базы данных с использованием рабочей нагрузки без ущерба для производительности сервера. - PullRequest
1 голос
/ 27 января 2011

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

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Полагаю, вы вызываете задание через cron и script/runner. Вы можете попробовать уменьшить приоритет процесса с помощью nice:

nice -n 19 /usr/bin/ruby <path to your app>/script/runner <your script>
0 голосов
/ 27 января 2011

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

while (doing_stuff)
  do_stuff

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

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

...