Quante connessioni socket può gestire un server web?


114

Diciamo che se dovessi ottenere un hosting condiviso, virtuale o dedicato, leggo da qualche parte che un server / macchina può gestire solo 64.000 connessioni TCP contemporaneamente, è vero? Quanti potrebbe gestire qualsiasi tipo di hosting indipendentemente dalla larghezza di banda? Presumo che HTTP funzioni su TCP.

Ciò significherebbe che solo 64.000 utenti potrebbero connettersi al sito Web e se volessi servire di più dovrei passare a una web farm?


2
Mi scuso con i soccorritori, ho strappato questo filo come un tornado. C'erano semplicemente troppe risposte errate per i miei gusti e ancora nessuna risposta diretta. Uso molto stackoverflow e trovo molte risposte di alta qualità. Spero che altri possano trovare questo thread e trovare una risposta informata utile.
Todd

Ciao David, hai trovato la risposta giusta a questa domanda?
Piatto

64000 connessioni TCP su un singolo IP del server. Puoi aggiornare la tua rete di server per scalare e supportare più di 64000.
Airy

Risposte:


109

In breve: dovresti essere in grado di ottenere nell'ordine di milioni di connessioni TCP attive simultanee e per estensione richieste HTTP. Questo ti dice le massime prestazioni che puoi aspettarti con la giusta piattaforma con la giusta configurazione.

Oggi ero preoccupato se IIS con ASP.NET avrebbe supportato nell'ordine di 100 connessioni simultanee (guarda il mio aggiornamento, si aspettano ~ 10.000 risposte al secondo sulle versioni precedenti di ASP.Net Mono). Quando ho visto questa domanda / risposte, non ho potuto resistere a rispondere a me stesso, molte risposte alla domanda qui sono completamente errate.

Caso migliore

La risposta a questa domanda deve riguardare solo la configurazione del server più semplice da disaccoppiare dalle innumerevoli variabili e configurazioni possibili a valle.

Quindi considera il seguente scenario per la mia risposta:

  1. Nessun traffico sulle sessioni TCP, ad eccezione dei pacchetti keep-alive (altrimenti avresti ovviamente bisogno di una quantità corrispondente di larghezza di banda di rete e altre risorse del computer)
  2. Software progettato per utilizzare socket e programmazione asincroni, anziché un thread hardware per richiesta da un pool. (es. IIS, Node.js, Nginx ... server web [ma non Apache] con software applicativo progettato in modo asincrono)
  3. Buone prestazioni / dollaro CPU / RAM. Oggi, arbitrariamente, diciamo i7 (4 core) con 8 GB di RAM.
  4. Un buon firewall / router da abbinare.
  5. Nessun limite / governatore virtuale - es. Linux somaxconn, IIS web.config ...
  6. Nessuna dipendenza da altro hardware più lento - nessuna lettura dal disco rigido, perché sarebbe il minimo comune denominatore e collo di bottiglia, non l'IO di rete.

Risposta dettagliata

I progetti associati a thread sincroni tendono ad essere i peggiori rispetto alle implementazioni di I / O asincrono.

WhatsApp ottiene un milione di traffico CON su una singola macchina con sistema operativo Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .

E infine, questo, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , entra in molti dettagli , esplorando come si potrebbero ottenere anche 10 milioni. I server spesso dispongono di motori di offload TCP hardware, ASIC progettati per questo ruolo specifico in modo più efficiente rispetto a una CPU generica.

Buone scelte di progettazione del software

La progettazione dell'I / O asincrono differirà tra i sistemi operativi e le piattaforme di programmazione. Node.js è stato progettato pensando all'asincrono . Dovresti usare almeno Promises e quando arriva ECMAScript 7, async/ await. C # /. Net ha già il pieno supporto asincrono come node.js. Qualunque sia il sistema operativo e la piattaforma, ci si dovrebbe aspettare che l'asincrono funzioni molto bene. E qualunque lingua tu scelga, cerca la parola chiave "asincrono", la maggior parte delle lingue moderne avrà un supporto, anche se si tratta di un componente aggiuntivo di qualche tipo.

Alla WebFarm?

Qualunque sia il limite per la tua situazione particolare, sì, una web farm è una buona soluzione per il ridimensionamento. Ci sono molte architetture per raggiungere questo obiettivo. Uno sta usando un bilanciatore del carico (i provider di hosting possono offrirli, ma anche questi hanno un limite, insieme al limite di larghezza di banda), ma non sono favorevole a questa opzione. Per le applicazioni a pagina singola con connessioni di lunga durata, preferisco invece avere un elenco aperto di server che l'applicazione client sceglierà in modo casuale all'avvio e riutilizzerà per tutta la durata dell'applicazione. Ciò rimuove il singolo punto di errore (bilanciamento del carico) e consente il ridimensionamento attraverso più data center e quindi molta più larghezza di banda.

Sfatare un mito: 64.000 porte

Per affrontare la componente domanda relativa a "64.000", questo è un malinteso. Un server può connettersi a molti più di 65535 client. Vedi /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284

A proposito, Http.sys su Windows consente a più applicazioni di condividere la stessa porta del server nello schema dell'URL HTTP. Ciascuno di essi registra un binding di dominio separato, ma alla fine c'è un'unica applicazione server che invia le richieste alle applicazioni corrette.

Aggiornamento 2019-05-30

Ecco un confronto aggiornato delle librerie HTTP più veloci: https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext

  • Data del test: 06/06/2018
  • Hardware utilizzato: Dell R440 Xeon Gold + 10 GbE
  • Il leader ha ~ 7 milioni di risposte in chiaro al secondo (risposte non connessioni)
  • Il secondo Fasthttp per golang pubblicizza 1,5 milioni di connessioni simultanee - vedere https://github.com/valyala/fasthttp
  • I linguaggi principali sono Rust, Go, C ++, Java, C e persino C # si classificano a 11 (6,9 M al secondo). Scala e Clojure si classificano più in basso. Python è al 29 ° posto con 2,7 milioni al secondo.
  • In fondo alla lista, noto laravel e cakephp, rails, aspnet-mono-ngx, symfony, zend. Tutto sotto i 10k al secondo. Nota, la maggior parte di questi framework sono costruiti per pagine dinamiche e piuttosto vecchi, potrebbero esserci varianti più recenti che sono presenti più in alto nell'elenco.
  • Ricorda che questo è testo in chiaro HTTP, non per la specialità Websocket: molte persone che vengono qui saranno probabilmente interessate a connessioni simultanee per websocket.

2
Grazie per aver incluso collegamenti a persone che parlano di come lo stanno facendo.
Rick Smith

Cosa succede se il singolo server a cui il client si è connesso si interrompe? E se tutte le tue SPA fossero collegate casualmente a un server e lo sovraccaricassero? L'idea per utilizzare i bilanciatori di carico non è solo usare 1, puoi usarne molti a tuo
piacimento

3
I client selezionerebbero in modo casuale un server. Le possibilità che tutti si colleghino casualmente a uno è praticamente impossibile. Sebbene si possa seguire il conteggio dei client e il server potrebbe chiedere a un client di spostarsi su un altro server se troppo sovraffollato.
Todd

1
Oggetto: il limite di 64 KB - quello che dici è vero, ma è abbastanza comune per un'app server inviare richieste tramite proxy ad alcuni servizi di backend, nel qual caso il "server" ora diventa un "client" e potrebbe avere preoccuparsi dell'esaurimento delle porte effimere (ad esempio: nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus ). Sono sicuro che lo sai, ma menzionandolo per gli altri (:
jwd

@jwd buon punto, contestuale per nginx su un'app Web, ma per un sito Web di base, tale proxy non dovrebbe verificarsi. Lo stesso si può dire anche della connessione a un database tramite TCP tramite un'applicazione web. In teoria, questo viene risolto utilizzando tutti gli indirizzi nell'intervallo 127. *. *. *, Ma in pratica non so se questa sia un'opzione disponibile.
Todd

54

Questa domanda è abbastanza difficile. Non vi è alcuna reale limitazione del software al numero di connessioni attive che una macchina può avere, sebbene alcuni sistemi operativi siano più limitati di altri. Il problema diventa una delle risorse. Ad esempio, supponiamo che una singola macchina desideri supportare 64.000 connessioni simultanee. Se il server utilizza 1 MB di RAM per connessione, avrebbe bisogno di 64 GB di RAM. Se ogni client deve leggere un file, il carico di accesso al disco o all'array di archiviazione diventa molto più grande di quanto tali dispositivi possano gestire. Se un server deve eseguire il fork di un processo per connessione, il sistema operativo impiegherà la maggior parte del suo tempo a cambiare contesto oa ridurre i processi per il tempo della CPU.

La pagina del problema C10K contiene un'ottima discussione su questo problema.


3
Una risposta un po 'mista. Il PO sembra riferirsi a uno scenario migliore e includere come sarebbe vantaggioso, piuttosto che trovare un caso peggiore e quindi fare riferimento a un articolo che potrebbe avere la soluzione. Notare il collo di bottiglia del disco è utile. Utilizzando l'IO asincrono è possibile raggiungere un numero molto elevato di client simultanei.
Todd

Come potresti dire che non ci sono limitazioni reali del software poiché la dimensione della porta è di per sé 16 bit, il che rende il massimo nessuna porta disponibile in qualsiasi istante a un massimo di 65.5K. Credo che la tua risposta non sia corretta.
आनंद

La tua macchina può avere più di 1 IP, quindi sono disponibili più di 2 ^ 16 porte.
Arman Ordookhani

8

Per aggiungere i miei due centesimi alla conversazione un processo può avere contemporaneamente aperto un numero di socket connessi pari a questo numero (in Linux type sytems) / proc / sys / net / core / somaxconn

cat / proc / sys / net / core / somaxconn

Questo numero può essere modificato al volo (solo dall'utente root ovviamente)

echo 1024> / proc / sys / net / core / somaxconn

Ma dipende interamente dal processo del server, dall'hardware della macchina e dalla rete, dal numero reale di socket che possono essere collegati prima di mandare in crash il sistema


1
Anche se probabilmente vero per Linux, questo si riferisce a un limite virtuale, non a un benchmark di possibilità. Questa risposta è un po 'specifica per i miei gusti e non fornisce alcun numero o indicazione del numero di connessioni simultanee. Nonostante i tuoi sforzi, non è molto utile. Forse potresti rispondere da solo a una domanda: "Perché non posso server più di X connessioni TCP simultanee su Linux"
Todd

2
Per quanto ne so, questo è sbagliato . somaxconn è il numero massimo di connessioni in coda su un socket aperto (cioè è il valore massimo del parametro backlog di listen(int socket, int backlog). Non è correlato al numero di socket che un processo può avere aperti.
Timmmm

8

Sembra che la risposta sia di almeno 12 milioni se hai un server robusto, il tuo software del server è ottimizzato per questo, hai abbastanza client. Se si esegue il test da un client a un server, il numero di numeri di porta sul client sarà uno degli ovvi limiti di risorse (ogni connessione TCP è definita dalla combinazione univoca di IP e numero di porta all'origine e alla destinazione).

(È necessario eseguire più client, altrimenti si raggiunge prima il limite di 64 KB sui numeri di porta)

Alla fine, questo è un classico esempio del motto che "la differenza tra teoria e pratica è molto più grande in pratica che in teoria" - in pratica il raggiungimento dei numeri più alti sembra essere un ciclo di a. proporre modifiche specifiche alla configurazione / architettura / codice, b. provalo fino a raggiungere un limite, c. Ho finito? In caso contrario, d. capire qual era il fattore limitante, e. tornare al passaggio a (risciacquare e ripetere).

Ecco un esempio con 2 milioni di connessioni TCP su una robusta scatola (128 GB di RAM e 40 core) che esegue Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections - sono terminate necessitano di circa 50 server ragionevolmente significativi solo per fornire il carico del client (i loro client iniziali più piccoli hanno raggiunto il massimo all'inizio, ad esempio "hanno massimizzato la nostra scatola da 4 core / 15 GB a 450k client").

Ecco un altro riferimento per andare questa volta a 10 milioni: http://goroutines.com/10m .

Questo sembra essere basato su java e 12 milioni di connessioni: https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/


Grandi nuovi collegamenti, con una corretta comprensione della domanda. Mi piace il consiglio generale per hit-barrier -> fix barrier. Ognuno ha una situazione specifica diversa, ma almeno qui hanno un'indicazione di ciò che è economicamente / praticamente realizzabile. Non si dovrebbe promettere a un cliente 100 milioni per server in qualunque momento presto.
Todd

5

Si noti che HTTP in genere non mantiene aperte le connessioni TCP per un periodo più lungo di quanto necessario per trasmettere la pagina al client; e di solito l'utente impiega molto più tempo per leggere una pagina web di quanto ne impiega per scaricare la pagina ... mentre l'utente sta visualizzando la pagina, non aggiunge alcun carico al server.

Quindi il numero di persone che possono visualizzare simultaneamente il tuo sito web è molto maggiore del numero di connessioni TCP che può servire simultaneamente.


12
Questo non risponde affatto alla domanda. Indipendentemente dalla precisione di ciò che hai detto, ci sarebbe ancora un numero di connessioni TCP simultanee in un dato momento, qual è il massimo? Questa è l'essenza della domanda.
Todd

3
Se hai qualcosa di utile da contribuire, Todd, vai avanti e fallo.
Jeremy Friesner

8
Avevo già una risposta il 28 marzo, devi averla persa. Nel mondo moderno delle applicazioni a pagina singola con connessioni a polling lungo e socket Web, HTTP non è sempre di breve durata. Ma anche se è di breve durata, esiste ancora un numero massimo di connessioni simultanee. Tentare di spiegare la domanda non è una risposta IMO. Questa risposta sarebbe meglio collocare come commento alla domanda, è certamente utile, ma la domanda riguarda le "connessioni socket", non le "persone". Una domanda sul rapporto (utenti: connessioni attive) dovrebbe essere una domanda separata, se lo si desidera.
Todd

1
Keep Alive su HTTP Le connessioni TCP sono in circolazione e richieste dai browser dall'ultimo millennio: spetta al server se consente alla connessione di rimanere attiva e quale sarà il periodo di inattività. Consentire Keep Alive riduce la latenza di un gruppo di richieste (ad esempio una pagina html e le risorse associate), ma aumenta l'utilizzo delle risorse sul server.
iheggie

1

nel caso del protocollo IPv4, il server con un indirizzo IP che ascolta su una sola porta può gestire 2 ^ 32 indirizzi IP x 2 ^ 16 porte quindi 2 ^ 48 socket univoci. Se parli di un server come di una macchina fisica e sei in grado di utilizzare tutte le 2 ^ 16 porte, potrebbe esserci un massimo di 2 ^ 48 x 2 ^ 16 = 2 ^ 64 socket TCP / IP univoci per un indirizzo IP. Tieni presente che alcune porte sono riservate al sistema operativo, quindi questo numero sarà inferiore. Per riassumere:

1 IP e 1 porta -> 2 ^ 48 prese

1 IP e tutte le porte -> 2 ^ 64 socket

tutti i socket IPv4 univoci nell'universo -> 2 ^ 96 socket


0

Ci sono due diverse discussioni qui: una è quante persone possono connettersi al tuo server. Questo ha ricevuto una risposta adeguata da altri, quindi non ne parlerò.

Altro su quante porte può ascoltare il tuo server? Credo che da qui provenga il numero 64K. In realtà, il protocollo TCP utilizza un identificatore a 16 bit per una porta, che si traduce in 65536 (un po 'più di 64K). Ciò significa che puoi avere tanti "listener" diversi sul server per indirizzo IP.


a tuo vantaggio, ho aggiunto una sezione extra alla mia risposta per affrontare il tuo malinteso. Anche questa domanda riguarda le "connessioni socket" e non le "persone", che è una distinzione importante nel contesto di questa domanda.
Todd

Se stiamo parlando di una singola macchina server e di un singolo router, penso che questa risposta sia giusta. Ma @Todd si occupa di una farm di macchine server, a cui l'utente può connettersi a qualsiasi di esse in modo casuale tramite un bilanciamento del carico.
Amr

@amr non è corretto. La mia risposta riguarda una singola macchina. La "Webfarm?" la sezione è lì per contrasto e consigli per andare oltre e conclude che i bilanciatori del carico non sono necessari con una buona architettura. Semplicemente non hai ancora letto a fondo la mia risposta.
Todd

0

Penso che il numero di connessioni socket simultanee che un server Web può gestire dipende in gran parte dalla quantità di risorse consumate da ciascuna connessione e dalla quantità di risorse totali disponibili sul server, salvo qualsiasi altra configurazione che limita le risorse del server Web.

Per illustrare, se ogni connessione socket consumasse 1 MB di risorse del server e il server ha 16 GB di RAM disponibili (teoricamente) ciò significherebbe che sarebbe in grado di gestire solo connessioni simultanee (16 GB / 1 MB). Penso che sia così semplice ... VERAMENTE!

Quindi, indipendentemente da come il server web gestisce le connessioni, ogni connessione alla fine consumerà alcune risorse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.