Балансировка нагрузки процесса на 1 сервере - PullRequest
1 голос
/ 05 сентября 2008

У меня есть 1 процесс, который получает входящее соединение от порта 1000 на 1 linux сервере. Однако 1 процесс недостаточно быстр для обработки всех входящих запросов.

Я хочу запустить несколько процессов на сервере, но с 1 конечной точкой. Таким образом, клиент увидит только 1 конечную точку / процесс, а не несколько.

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

Любое другое решение, чтобы помочь в моем случае?


Я похож на nginx, где мне нужно будет запустить несколько копий моего приложения.

Дайте мне попробовать.

Спасибо за помощь.

Ответы [ 7 ]

2 голосов
/ 05 сентября 2008

Вы также можете использовать веб-сервер, например nginx . Он может балансировать нагрузку вашего приложения на несколько портов одного и того же приложения и обычно используется для балансировки нагрузки приложений Ruby on Rails (которые являются однопоточными). Недостатком является то, что вам нужно запустить несколько копий приложения (по одной на каждый порт), чтобы эта балансировка нагрузки работала.

2 голосов
/ 05 сентября 2008

Похоже, вам просто нужно интегрировать свой сервер с xinetd .

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

2 голосов
/ 05 сентября 2008

Вопрос немного неясен для меня, но я подозреваю, что ответ, который вы ищете, состоит в том, чтобы один процесс принимал задачи из сети, а затем отбрасывал «рабочие процессы» для фактического выполнения работы (до возврата результат для пользователя).

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

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

Два системных вызова kes, которые вы хотите посмотреть, называются fork и exec .

1 голос
/ 05 сентября 2008

Вам нужна многопоточность или многопоточность. Вы не конкретизируете детали сервера, поэтому я не могу дать вам совет, что именно делать. Форк и exec, как предложил Мэтт, могут быть решением, но на самом деле: о каком протоколе / сервере идет речь?

0 голосов
/ 21 сентября 2008

Возможно, вы можете изменить свой клиент для циклических портов (скажем) 1000-1009 и запустить 10 копий процесса?

В качестве альтернативы должен быть какой-то способ его внутреннего рефакторинга.

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

Таким образом, вы можете использовать:

  • Prefork, где вы открываете сокет, форкаете указанное количество потомков, которые затем распределяют нагрузку
  • Пост-форк, где у вас есть один главный процесс, который принимает все соединения и разветвляет дочерние элементы для обработки отдельных сокетов
  • Потоки - вы можете делиться сокетами так, как вам нравится, так как дескрипторы файлов не клонируются, они просто доступны любому потоку.
0 голосов
/ 07 сентября 2008

nginx - это замечательно, но если вам не нужен совершенно новый веб-сервер, Apache 2.2 с мод прокси-балансировщиком сделает то же самое

0 голосов
/ 07 сентября 2008

Я думаю запустить несколько приложений, похожих на ypops .

...