Как мне выполнить большую обработку, не перегружая процессор?

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

Вопрос

Я знаю, что название вопроса не самое лучшее.Позволь мне объяснить.

Я выполняю ТОННУ обработки текста, которая преобразует естественный язык в XML.Эти текстовые файлы загружаются довольно быстро и попадают в очередь.Оттуда они один за другим передаются в фоновый рабочий процесс, который вызывает наш синтаксический анализатор (используя boost Spirit), чтобы преобразовать текст в XML и загрузить соответствующие части в нашу базу данных.

Парсер может выполнять около 100 таких операций одновременно.У меня есть ограничители скорости в фоновом рабочем процессе, чтобы прямо сейчас опрашивать нашу очередь только время от времени, поэтому она не работает так быстро.Сейчас я не могу запустить более одного фонового работника, потому что мои http-запросы начинают падать — фоновый работник и веб-сервер существуют на одном компьютере, и я полагать это из-за того, что загрузка процессора достигает 80-95%, хотя мы могли бы использовать и больше оперативной памяти.

Мне нужно масштабировать это лучше.Как бы вы это сделали?

В ответах на несколько вопросов:

  • мы используем веб-сервисы Amazon, поэтому покупка дешевого дополнительного оборудования немного отличается от создания нового экземпляра Amazon — может быть, кто-то написал код, который автоматически создает экземпляры в зависимости от нагрузки?

  • у нас есть http-сервер, который просто помещает наши файлы в очередь, поэтому единственная причина, по которой это может быть затронуто, заключается в том, что процессор занят обработкой множества вещей, связанных с синтаксическим анализом.

  • Я уже ограничиваю скорость наших фоновых рабочих, хотя мы не используем это в самом парсере.

  • Я еще не пробовал, но использовал его в прошлом - мне нужно записать несколько тестов по этому поводу.

  • парсер полностью отделен от веб-сервера - у нас есть nginx/merb в качестве сервера веб-приложений и rake-задача, вызывающая c++ в качестве фонового рабочего процесса - но они существуют на одной машине

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

Решение

Я бы купил пару дешевых компьютеров и обрабатывал бы на них текст.Как говорит Джефф в своей последний пост, «Всегда старайтесь сначала решите проблемы с производительностью используя более быстрое оборудование».

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

Возможно, просто поместив фонового работника на более низкий приоритет планирования (например,с использованием хороший) помог бы.Это означает, что ваш сервер может обрабатывать запросы, когда это необходимо, но когда он не занят, вы можете полностью погрузиться в обработку текста.

Думаю, это принесет вам гораздо больше пользы, чем произвольное ошеломление фонового рабочего.

Я не уверен, что точно отвечаю на ваш вопрос, но похоже, что у вас есть механизм HTTP, который подает очередь ожидающих работ.Правильный?Фоновый поток принимает запросы очереди и выполняет тяжелую работу, верно?

Итак, похоже, что фоновый процесс привязан к вычислениям, а процесс переднего плана по существу привязан к вводу-выводу... или, как минимум, ограничен скоростью отправки новой работы.

Лучший способ оптимизировать такой процесс — установить для фонового процесса более низкий приоритет, чем для процесса переднего плана.Это гарантирует, что фоновый процесс будет получать необходимую работу.Затем вы устанавливаете глубину очереди между процессами так, чтобы ее размер ограничивался максимальным объемом работы, которую вы хотите одновременно ожидать.

Одна вещь, которую я сделал, если она у вас есть, — это перенес эти службы синтаксического анализа на облачный хостинг.

Я перенес несколько своих распределенных служб (поисковые системы, массовая рассылка по электронной почте, регистрация ошибок) в службу облачных вычислений с моего основного компьютера, и это вызвало фантастическую нагрузку на наш основной веб-сервер.

Кроме того, облачные вычисления стали более дешевыми и масштабируемыми почти бесконечно.

Я не понимаю, почему вы беспокоитесь о том, что ваш процессор загружен на 100%.Если задание необходимо выполнить и оно не связано с вводом-выводом, тогда ваш процессор должен быть на уровне 100%.

Остается следующее:

  • Достаточно ли у вас процессора, чтобы выполнить всю необходимую работу в отведенное время?

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

  • Есть ли какие-то вакансии, которые должны быть более отзывчивыми, чем другие?

Похоже, они есть.Похоже, вы хотите, чтобы HTTP-сервер реагировал на запросы, в то время как задания парсера могли выполняться в своем собственном темпе (пока очередь опустошается быстрее, чем заполняется).Как отмечали другие, Найс сообщает ОС выделить процессы с низким приоритетом, которые циклы ЦП «остаются» после того, как процессы с более высоким приоритетом взяли то, что им нужно (хотя это не совсем так черно-бело).

Я предполагаю, что у вас есть несколько потоков, каждый из которых принадлежит к одной из двух групп.

  • группа А, которая загружает текстовые файлы
  • группа B, которая преобразует текст в XML

Если вы считаете, что группа B ограничивает вашу пропускную способность, я бы установил для ее потоков более низкий приоритет.Если работы достаточно, ЦП по-прежнему будет использоваться на 100 %, но на загрузку это не повлияет.

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

Если у вас возникли проблемы с обслуживанием запросов на прерывание, вы можете попробовать повысить качество выполнения задач, связанных с процессором.Затем уменьшите качество HTTP-сервера.По сути, постарайтесь использовать системный планировщик в своих интересах и не относитесь ко всем задачам как к равным.

Я не знаю, какую ОС вы используете, но в большинстве из них есть функции для определения приоритетов потоков/процессов.Пока процесс парсера имеет более низкий приоритет, чем процесс HTTP, он должен будь умницей.

Я бы поставил парсер на отдельную машину.Таким образом, это не повлияет на веб-сервер.

Если у вас нет бюджета на другую машину, используйте виртуализацию (ОпенВЗ здорово, если ваш веб-сервер размещен на Ubuntu или CentOS), чтобы ограничить квоту ЦП для парсера.

никогда не забывайте о счетах за электроэнергию и ценах на хостинг.попробуйте профилировщик найти узкое место в вашем коде.если вы никогда этого не делали, я уверен, что вы сможете снизить потребление процессора до 25-50%

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top