Балансировка нагрузки процесса на 1 сервере

StackOverflow https://stackoverflow.com/questions/45252

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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


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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Как вы заметили, термин «балансировка нагрузки» подразумевает наличие нескольких серверов — вам нужно найти информацию о том, как написать сетевой демон Linux.

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

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

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

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

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

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

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

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

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

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

  • Prefork: при открытии сокета создается форк определенного количества дочерних элементов, которые затем распределяют нагрузку.
  • Пост-форк, где у вас есть один главный процесс, который принимает все соединения и разветвляет дочерние элементы для обработки отдельных сокетов.
  • Потоки — вы можете делиться сокетами с ними любым удобным для вас способом, поскольку дескрипторы файлов не клонируются, они просто доступны любому потоку.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top