2017-01-06 19 views
1

первого счастливого нового года всем и счастливого кодирование для 2017.Как представить «задачу» в paralell на сервере

меня 1M из «задач» для запуска с помощью питона. Каждая задача займет около 2 минут и обработает некоторые локальные изображения. Я бы хотел запустить как можно больше параллельно автоматическим способом. Мой сервер имеет 40 ядер, так что я начал видеть, как сделать мультипроцессирование, но я вижу следующие вопросы:

  1. Ведение журнала каждой задачи не легко (я работаю над этим, но до сих пор мне не удалось даже если я нашел много примеров в stackoverflow)
  2. Как я знаю, сколько CPU я должен использовать и сколько осталось на сервере для основной задачи сервера?
  3. Когда у нас есть несколько пользователей на сервере, как мы можем видеть, сколько CPU уже используется?

В моей предыдущей жизни в качестве физика в ЦЕРНе мы использовали систему подачи заявок для подачи задач на многие кластеры. Задачи помещались в очередь и обрабатывались, когда был доступен слот. Есть ли у нас такой инструмент для LINUX? Я не знаю, какое правильное английское имя для такого инструмента (диспетчер заданий?).

Лучшим будет инструмент, который мы можем настроить для использования нашего N-ЦП в качестве «транспортного средства» для обработки в параллельной задаче (и чтобы сохранить необходимый центральный процессор, чтобы сервер мог также выполнять базовую задачу), поставить задачу всех пользователей в очередях с приоритетом и обрабатывать их «автомобиль». Бонус будет способом мониторинга обработки задач.

Надеюсь, я использую правильное слово для описания того, что я хочу.

Благодаря Фабьен

ответ

2

Что вы говорите, как правило, называют «пула рабочих». Он может быть реализован с использованием потоков или процессов. Выбор реализации зависит от вашего рабочего процесса.

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

Если вы хотите запускать задачи на одном сервере, вы можете использовать multiprocessing.Pool или concurrent.futures.Executor.

Если вы хотите распространять задачи по кластеру, существует несколько решений. Celery и Luigi - хорошие примеры.

EDIT:

Это не ваша забота, как пользователь. Современные операционные системы выполняют довольно хорошую работу по совместному использованию ресурсов между несколькими пользователями. Если чрезмерные ресурсы становятся проблемой, SysAdmin должен убедиться, что этого не происходит, назначая квоты на пользователя. Это можно сделать многими способами. Примерный системный администратор должен быть знаком с ulimit.

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

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

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

+0

Спасибо. Я использую модуль многопроцессорности python, но мне непонятно, есть ли у нас 3 пользователя на сервере, как я могу узнать, сколько процессов запущено и сколько слотов бесплатно. Это отличный инструмент для одного пользователя сервера, но если все пользователи самостоятельно используют все потоки, мы будем разбивать сервер. Не понял ли я что-то, если у нас есть многопользовательский пользователь на том же сервере, который хочет в то же время использовать все ресурсы? –

+0

Обновлен ответ. – noxdafox

+0

Большое спасибо за это замечательное резюме. Я посмотрю на все инструменты, которые вы предложили. –