Назад | Перейти на главную страницу

Пакетная обработка в Linux

В настоящее время мы настраиваем сервер для выполнения тяжелой работы (ETL) после завершения другого процесса в компании, в настоящий момент мы запускаем задания либо через запланированные задания cron, либо через удаленное выполнение (через ssh). В начале этой недели мы столкнулись с проблемой из-за того, что в системе параллельно выполнялось слишком много заданий, из-за чего все задания выполнялись в медленном темпе, поскольку они боролись за процессорное время.

Я искал пакетный планировщик, систему, в которой мы можем вставлять задания в очередь выполнения, и система будет обрабатывать их одно за другим. Может ли кто-нибудь посоветовать программу / систему для этого? Низкая стоимость / FOSS будет оценена по достоинству из-за того, что этот проект требует привязки к обуви.

Я бы организовал какую-то службу очереди. Быстрый поиск в Google "готовых к использованию" материалов показывает следующее:

В зависимости от ваших потребностей вы можете просто

  • создать оболочку, в которой пользователи отправляют задания,
  • обертка записывает задание в сокет / файл / что угодно
  • создать потребителя, который запускает задание за заданием, ожидая его завершения
  • затем клиент регулярно вызывается cron (каждые 5 минут или около того)
    • конечно, создайте какой-то механизм блокировки, чтобы одновременно выполнялось только n заданий (где n => 1)
  • если больше нет работы, ничего не делай
  • если есть еще работы, возьмите следующую и дождитесь ее завершения

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

Если LDP по предложению грызть Я бы взял это. Иметь такую ​​систему, поддерживаемую большим сообществом, конечно, лучше, чем создавать свои собственные ошибки для проблем, которые уже решили другие :)

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

Решением вашей проблемы является использование чего-то вроде Sun Grid Engine.

Sun Grid Engine (SGE). SGE - это программное обеспечение для управления распределенными ресурсами, которое позволяет эффективно использовать ресурсы в кластере / машине (время ЦП, программное обеспечение, лицензии и т. Д.).

Вот это небольшой учебник по использованию SGE.

На ум приходят два решения:

  1. Использовать xargs -P контролировать максимальное количество параллельных процессов одновременно.
  2. Создайте Makefile и создайте его с помощью make -j.

На самом деле они оба резюмированы в этом SO поток более детально.

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

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

Что касается свободно доступных систем пакетной обработки / планирования, две, которые приходят на ум, - это OpenPBS / Torque и SGE.

Отредактировано для добавления: если вы когда-нибудь собираетесь добавить больше вычислительных мощностей в будущем в виде большего количества блоков, система пакетной обработки / планирования, такая как Torque / OpenPBS / SGE, может быть хорошим выбором, поскольку они в основном созданы для управления вычислительными ресурсами. и распределять между ними рабочие нагрузки.

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

Из man batch:

партия выполняет команды, когда позволяют уровни загрузки системы; другими словами, когда средняя загрузка падает ниже 1,5 или значения, указанного при вызове atd.

Думаю, это может быть то, что вы ищете. Это часть Debian at пакет.

wava: планировщик с учетом памяти, который позволяет ставить в очередь пакетные задания (представленные с обещанием максимального использования физической памяти) для выполнения, когда в системе доступно достаточно физической памяти (RSS).

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

Мы использовали Control M именно по этой причине с ETL и тому подобным (но несколько лет назад). Конечно, это не бесплатно или с открытым исходным кодом, но у него была очень хорошая гибкость с точки зрения пакетной обработки (а-ля если-то-то-то тип потока выполнения)

Сценарий оболочки, вызываемый cron, легко может это сделать, он обрабатывает его построчно.

Я бы использовал Torque, это обновленная версия FOSS OpenPBS.