Как я могу сделать много обработки без жадного процессора? - PullRequest
1 голос
/ 22 декабря 2008

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

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

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

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

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

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

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

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

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

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

Ответы [ 10 ]

8 голосов
/ 22 декабря 2008

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

Мне кажется, это даст вам гораздо больше пользы, чем произвольное расшатывание фонового работника.

4 голосов
/ 22 декабря 2008

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

3 голосов
/ 22 декабря 2008

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

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

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

1 голос
/ 04 января 2009

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

Осталось:

  • Достаточно ли у вас ЦП для выполнения всей необходимой работы в доступное время?

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

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

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

1 голос
/ 22 декабря 2008

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

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

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

0 голосов
/ 02 апреля 2009

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

0 голосов
/ 22 декабря 2008

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

0 голосов
/ 22 декабря 2008

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

0 голосов
/ 22 декабря 2008

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

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

0 голосов
/ 22 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...