2008-09-05 7 views
1

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

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

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

Любое другое решение для помощи в моем случае?


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

Позвольте мне попробовать.

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

ответ

2

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

2

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

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

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

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

2

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

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

1

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

0

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

0

Nginx является большим, но если вы не представляете себе совершенно новый веб-сервер, Apache 2.2 с модом прокси-балансир будет делать ту же работу

0

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

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

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

Поэтому в основном вы можете использовать:

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