delayed_job работает медленно, когда много работников - PullRequest
1 голос
/ 16 января 2012

Наше приложение имеет задачу поиска, выполнение которой занимает <30 секунд.Мы переместили задачу в фоновый режим с помощью delayed_job, она прекрасно работает.Чтобы обработать больше поисковых запросов, мы открываем 60 работников delayed_job, проблема возникает, когда одновременно работает больше работников. </p>

Если я отправляю один запрос на сервер, для завершения работы требуется ~ 30 секунд;Затем я пытаюсь отправить 10 запросов на сервер, каждое задание занимает> 3 минуты для завершения ... И если я пытаюсь отправить 30 запросов на сервер одновременно, каждое задание занимает 26 минут для завершения .......... Боже мой ...

Наша поисковая задача может быть разделена на 2 части.Во-первых, отправка 10-20 запросов API на сторонний сервер с использованием многопоточности (http://www.tutorialspoint.com/ruby/ruby_multithreading.htm), и ожидания ответа, для завершения требуется около 15 секунд. Во-вторых, мы обрабатываем данные ответа, ищем локальную базу данных MySQL, выполняем цикл и вычисляеми, в конце, сохраните результат в файловой системе (расположение файла является общим пространством с использованием NFS), для завершения потребуется около 10 секунд.

Я использую команду Linux 'top', обнаружив, что когда 1задание выполняется, иногда оно потребляет 100% ресурсов процессора. Когда я запускаю одновременно 30 заданий, каждое задание потребляет <10% ресурсов процессора, я полагаю, что по этой причине для каждого задания требуется 26 минут ... </p>

В настоящее время я понятия не имею, как улучшить скорость, чтобы она поддерживала больше пользователей и скорость составляла ~ 30 секунд ...

Мы используем Rails 3.0.x, Ruby 1.9.2p290 (реальная многопоточность?), сервер с 4 виртуальными машинами (БД, Ngnix, Ruby / Unicorn, Ruby / delayed_job).

Что я думаю сейчас: - реальная многопоточность (как проверить, если мы?) -jRuby (это помогает в этом случае?) - сетевой ввод-вывод (servадмин сказал маловероятно) - Файловая система / NFS IO (админ сервера сказал маловероятно)

Кто-нибудь, имеющий подобный опыт, может дать мне некоторое представление, так что я могу разобраться в проблеме?Большое спасибо!

1 Ответ

1 голос
/ 16 января 2012

New Relic может дать вам представление о том, где ваши рабочие места проводят свое время. Вы можете настроить его, чтобы отслеживать ваши задания и записывать подробные данные каждого из них. Существует 14-дневная бесплатная пробная версия, включающая функцию подробного отслеживания («Отслеживание транзакций»).

Узкое место может быть в любой из областей, которые вы упомянули. Если БД является вашим узким местом, вы можете настроить свои запросы, возможно, добавив индексы. Если ваши веб-запросы на самом деле не выполняются параллельно (не уверен, как выглядит ваш код), вы можете использовать что-то вроде typhoeus , чтобы обрабатывать все параллельные операции для вас.

Savon обрабатывает XML из запросов SOAP, поэтому убедитесь, что вы используете более быструю библиотеку XML, такую ​​как libxml или nokogiri.

...