Распределить вычислительные работы по разным машинам?
Я ищу способ распределить вычислительные задания (в основном, работы по растеризации) по нескольким бездействующим машинам в сети. Серверы работают под управлением Debian 6 прямо сейчас.
Большая часть работы, которую необходимо выполнить, - это стандартная работа с командной строкой и некоторая визуализация GhostScript. Поскольку рендеринг может занимать очень много времени только с одним процессором, я хотел бы разделить работу на множество более мелких частей, и в работе помогли неработающие машины в сети.
Вот примерный рабочий процесс:
- Пользователь загружает большой файл PDF на веб-интерфейс
- PDF разбивается на более мелкие части или перемещается в SAN, к которой могут обращаться все машины. Все меньшие части составляют "основную задачу", которую необходимо выполнить, прежде чем пользователь сможет увидеть какие-либо результаты.
- Задание запланировано для каждой страницы файла PDF и помещено в "очередь".
- Незанятые машины получают задание из этой очереди и обрабатывают / отображают страницу файла PDF.
- После завершения они помещают полученные растровые данные в SAN и отмечают выполнение задания.
- Как только все задания для "основной задачи" будут выполнены, пользователь увидит обзор всех отображаемых страниц в веб-интерфейсе.
Я знаю о планировщиках работы, но так как это новая территория для меня, я даже не уверен, какие поисковые термины использовать с Google.
Итак, я был бы признателен за любые указания и предложения. Было бы идеально иметь децентрализованную структуру, чтобы избежать единой точки отказа для всех машин.
1 ответ
Я не уверен, что OpenSSI поможет вам, но это сразу пришло мне в голову. Он объединяет несколько серверов в единый образ системы, который с точки зрения администратора является просто одним сервером. Думайте об этом как о SMP-сервере, но обязательно с несколькими ядрами на одном сервере, но на нескольких серверах.
OpenSSI может автоматически распределять нагрузку между кластерами и запускать вновь запущенные процессы на наименее загруженном узле (или самом быстром узле). Он также может автоматически переносить запущенные в данный момент процессы с одного узла на другой, если считает это полезным. Конечно, все это также можно сделать вручную с помощью утилит командной строки.
Если вам не нужен такой подход на уровне ядра к вашей проблеме, или OpenSSI не работает для вас иначе, есть Torque, который делает это планирование на уровне приложения.