Ehi, dato che sono l'autore di questa citazione, risponderò :-)
Ci sono due grandi problemi su siti di grandi dimensioni: connessioni simultanee e latenza. Le connessioni simultanee sono causate da client lenti che impiegano anni per scaricare i contenuti e da stati di connessione inattiva. Questi stati di connessione inattiva sono causati dal riutilizzo della connessione per recuperare più oggetti, noto come keep-alive, che è ulteriormente aumentato dalla latenza. Quando il client è molto vicino al server, può fare un uso intensivo della connessione e assicurarsi che non sia quasi mai inattivo. Tuttavia, quando la sequenza finisce, nessuno si preoccupa di chiudere rapidamente il canale e la connessione rimane aperta e inutilizzata per molto tempo. Questo è il motivo per cui molte persone suggeriscono di utilizzare un timeout keep-alive molto basso. Su alcuni server come Apache, il timeout più basso che puoi impostare è di un secondo, ed è spesso troppo per sostenere carichi elevati: se hai 20000 client davanti a te e questi recuperano in media un oggetto ogni secondo, avrai quelle 20000 connessioni stabilite in modo permanente. 20000 connessioni simultanee su un server generico come Apache sono enormi, richiederanno tra 32 e 64 GB di RAM a seconda di quali moduli vengono caricati e probabilmente non si può sperare di andare molto più in alto anche aggiungendo RAM. In pratica, per 20000 client potresti persino vedere da 40000 a 60000 connessioni simultanee sul server perché i browser proveranno a impostare da 2 a 3 connessioni se hanno molti oggetti da recuperare. e probabilmente non puoi sperare di andare molto più in alto anche aggiungendo RAM. In pratica, per 20000 client potresti persino vedere da 40000 a 60000 connessioni simultanee sul server perché i browser proveranno a impostare da 2 a 3 connessioni se hanno molti oggetti da recuperare. e probabilmente non puoi sperare di andare molto più in alto anche aggiungendo RAM. In pratica, per 20000 client potresti persino vedere da 40000 a 60000 connessioni simultanee sul server perché i browser proveranno a impostare da 2 a 3 connessioni se hanno molti oggetti da recuperare.
Se chiudi la connessione dopo ogni oggetto, il numero di connessioni simultanee diminuirà drasticamente. Infatti, scenderà di un fattore corrispondente al tempo medio per scaricare un oggetto dal tempo tra gli oggetti. Se hai bisogno di 50 ms per scaricare un oggetto (una foto in miniatura, un pulsante, ecc ...) e scarichi in media 1 oggetto al secondo come sopra, avrai solo 0,05 connessioni per client, che è solo 1000 connessioni simultanee per 20000 client.
Ora il tempo per stabilire nuove connessioni sta per contare. I client remoti sperimenteranno una spiacevole latenza. In passato, i browser utilizzavano grandi quantità di connessioni simultanee quando Keep-Alive era disabilitato. Ricordo le cifre di 4 su MSIE e 8 su Netscape. Questo avrebbe davvero diviso la latenza media per oggetto di molto. Ora che keep-alive è presente ovunque, non vediamo più numeri così alti, perché così facendo aumenta ulteriormente il carico sui server remoti e i browser si occupano di proteggere l'infrastruttura di Internet.
Ciò significa che con i browser odierni, è più difficile rendere i servizi non keep-alive altrettanto reattivi di quelli keep-alive. Inoltre, alcuni browser (ad esempio: Opera) utilizzano l'euristica per provare a utilizzare il pipelinining. Il pipelining è un modo efficiente di utilizzare keep-alive, perché elimina quasi la latenza inviando più richieste senza attendere una risposta. L'ho provato su una pagina con 100 foto piccole e il primo accesso è circa due volte più veloce che senza keep-alive, ma il prossimo accesso è circa 8 volte più veloce, perché le risposte sono così piccole che conta solo la latenza (solo Risposte "304").
Direi che idealmente dovremmo avere alcuni parametri sintonizzabili nei browser per mantenere attive le connessioni tra gli oggetti recuperati e rilasciarlo immediatamente quando la pagina è completa. Ma sfortunatamente non lo stiamo vedendo.
Per questo motivo, alcuni siti che necessitano di installare server generici come Apache sul lato anteriore e che devono supportare grandi quantità di client generalmente devono disabilitare keep-alive. E per forzare i browser ad aumentare il numero di connessioni, utilizzano più nomi di dominio in modo che i download possano essere parallelizzati. È particolarmente problematico sui siti che fanno un uso intensivo di SSL perché la configurazione della connessione è ancora più elevata in quanto vi è un round trip aggiuntivo.
Ciò che è più comunemente osservato al giorno d'oggi è che tali siti preferiscono installare frontend leggeri come haproxy o nginx, che non hanno problemi a gestire da decine a centinaia di migliaia di connessioni simultanee, abilitano keep-alive lato client e disabilitano sul lato Lato Apache. Da questo lato, il costo per stabilire una connessione è pressoché nullo in termini di CPU, e per nulla percepibile in termini di tempo. In questo modo ciò fornisce il meglio di entrambi i mondi: bassa latenza dovuta al keep-alive con timeout molto bassi sul lato client e basso numero di connessioni sul lato server. Sono tutti felici :-)
Alcuni prodotti commerciali migliorano ulteriormente questo aspetto riutilizzando le connessioni tra il servizio di bilanciamento del carico anteriore e il server e eseguendo il multiplexing di tutte le connessioni client su di esse. Quando i server sono vicini all'LB, il guadagno non è molto maggiore rispetto alla soluzione precedente, ma spesso richiederà adattamenti sull'applicazione per garantire che non vi sia alcun rischio di incrocio di sessioni tra utenti a causa della condivisione inaspettata di una connessione tra più utenti . In teoria questo non dovrebbe mai accadere. La realtà è molto diversa :-)