Domanda

Ho 1 processo che riceve la connessione in entrata dalla porta 1000 in 1 Linux server.Tuttavia, 1 processo non è abbastanza veloce per gestire tutta la richiesta in arrivo.

Voglio eseguire più processi nel server ma con 1 endpoint.In questo modo, il client vedrà solo 1 endpoint/processo e non più di uno.

Ho controllato LVS e altre soluzioni di bilanciamento del carico.Queste soluzioni sembrano orientate al bilanciamento del carico di più server.

Qualche altra soluzione che possa aiutarmi nel mio caso?


Sto cercando qualcosa di più simile a nginx in cui dovrò eseguire più copie della mia app.

Fammi provare.

Grazie per l'aiuto.

È stato utile?

Soluzione

Potresti anche voler utilizzare un server web come nginx.Può bilanciare il carico della tua app su più porte della stessa app ed è comunemente usato per bilanciare il carico delle app Ruby on Rails (che sono a thread singolo).Lo svantaggio è che è necessario eseguire più copie della tua app (una su ciascuna porta) affinché questo bilanciamento del carico funzioni.

Altri suggerimenti

La domanda non mi è chiara, ma sospetto che la risposta che stai cercando sia quella di avere un singolo processo che accetta attività dalla rete e quindi biforca "processi di lavoro" per eseguire effettivamente il lavoro (prima di restituire il risultato al utente).

In questo modo il lavoro svolto non impedisce l'accettazione di ulteriori richieste.

Come fai notare, il termine bilanciamento del carico implica l'implicazione di più server: ciò che vuoi cercare sono informazioni su come scrivere un demone di rete Linux.

Le due chiamate di sistema kes a cui vorrai dare un'occhiata vengono chiamate fork ed esecuz.

Sembra che tu abbia solo bisogno di integrare il tuo server con xinetd.

Questo è un server che ascolta su porte predefinite (che controlli tramite la configurazione) e biforca i processi per gestire la comunicazione effettiva su quella porta.

Hai bisogno di multielaborazione o multithreading.Non sei specifico sui dettagli del server, quindi non posso darti consigli su cosa fare esattamente.fork ed exec come suggerito da Matt possono essere una soluzione, ma in realtà:di che tipo di protocollo/server stiamo parlando?

Sto pensando di eseguire più applicazioni simili a sì, sì.

nginx è fantastico ma se non hai voglia di un server web completamente nuovo, apache 2.2 con mod proxy balancer farà lo stesso lavoro

Forse puoi modificare il tuo client in porte round-robin (diciamo) 1000-1009 ed eseguire 10 copie del processo?

In alternativa, deve esserci un modo per refactoring internamente.

È possibile che più processi ascoltino lo stesso socket contemporaneamente aprendolo prima di chiamare fork(), ma (se è un socket TCP) una volta che accetta() viene chiamato il socket risultante appartiene a qualunque processo abbia accettato con successo la connessione.

Quindi essenzialmente potresti usare:

  • Prefork, quando si apre la presa, si biforca un numero specificato di figli che poi condividono il carico
  • Post-fork, in cui si dispone di un processo principale che accetta tutte le connessioni e esegue il fork dei figli per gestire i singoli socket
  • Thread: puoi condividere i socket nel modo che preferisci con questi, poiché i descrittori di file non vengono clonati, sono semplicemente disponibili per qualsiasi thread.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top