Olá, já que sou o autor desta citação, vou responder :-)
Existem dois grandes problemas em sites grandes: conexões simultâneas e latência. As conexões simultâneas são causadas por clientes lentos, que demoram muito para baixar o conteúdo, e por estados de conexão ociosa. Esses estados de conexão ociosa são causados pela reutilização da conexão para buscar vários objetos, conhecido como keep-alive, que é ainda mais aumentado pela latência. Quando o cliente está muito próximo do servidor, ele pode fazer um uso intensivo da conexão e garantir que quase nunca fique ocioso. Porém, quando a sequência termina, ninguém se preocupa em fechar rapidamente o canal e a conexão permanece aberta e sem uso por um longo tempo. Essa é a razão pela qual muitas pessoas sugerem o uso de um tempo limite de manutenção de atividade muito baixo. Em alguns servidores como o Apache, o menor tempo limite que você pode definir é um segundo, e muitas vezes é muito para sustentar altas cargas: se você tiver 20.000 clientes à sua frente e eles buscarem em média um objeto a cada segundo, você terá essas 20.000 conexões estabelecidas permanentemente. 20.000 conexões simultâneas em um servidor de propósito geral como o Apache é enorme, exigirá entre 32 e 64 GB de RAM dependendo de quais módulos são carregados, e você provavelmente não pode esperar ir muito mais longe, mesmo adicionando RAM. Na prática, para 20.000 clientes, você pode até ver 40.000 a 60.000 conexões simultâneas no servidor porque os navegadores tentarão configurar 2 a 3 conexões se tiverem muitos objetos para buscar. e você provavelmente não pode esperar ir muito mais alto, mesmo adicionando RAM. Na prática, para 20.000 clientes, você pode até ver 40.000 a 60.000 conexões simultâneas no servidor porque os navegadores tentarão configurar 2 a 3 conexões se tiverem muitos objetos para buscar. e você provavelmente não pode esperar ir muito mais alto, mesmo adicionando RAM. Na prática, para 20.000 clientes, você pode até ver 40.000 a 60.000 conexões simultâneas no servidor porque os navegadores tentarão configurar 2 a 3 conexões se tiverem muitos objetos para buscar.
Se você fechar a conexão após cada objeto, o número de conexões simultâneas diminuirá drasticamente. Na verdade, ele cairá por um fator correspondente ao tempo médio para baixar um objeto pelo tempo entre os objetos. Se você precisar de 50 ms para baixar um objeto (uma foto em miniatura, um botão, etc ...), e baixar em média 1 objeto por segundo como acima, então você terá apenas 0,05 conexão por cliente, que é de apenas 1000 conexões simultâneas para 20.000 clientes.
Agora, o tempo para estabelecer novas conexões vai contar. Os clientes muito remotos experimentarão uma latência desagradável. No passado, os navegadores costumavam usar grandes quantidades de conexões simultâneas quando o keep-alive estava desativado. Lembro-me de figuras de 4 no MSIE e 8 no Netscape. Isso realmente teria dividido a latência média por objeto por isso. Agora que o keep-alive está presente em todos os lugares, não estamos mais vendo esses números altos, porque fazer isso aumenta ainda mais a carga nos servidores remotos e os navegadores cuidam da proteção da infraestrutura da Internet.
Isso significa que, com os navegadores de hoje, é mais difícil fazer com que os serviços não-keep-alive sejam tão responsivos quanto os keep-alive. Além disso, alguns navegadores (por exemplo: Opera) usam heurística para tentar usar pipelinining. O pipelining é uma forma eficiente de usar o keep-alive, porque quase elimina a latência enviando várias solicitações sem esperar por uma resposta. Eu tentei em uma página com 100 fotos pequenas, e o primeiro acesso é cerca de duas vezes mais rápido do que sem keep-alive, mas o próximo acesso é cerca de 8 vezes mais rápido, porque as respostas são tão pequenas que apenas a latência conta (apenas Respostas "304").
Eu diria que idealmente deveríamos ter alguns ajustáveis nos navegadores para fazê-los manter as conexões vivas entre os objetos buscados e descartá-los imediatamente quando a página estiver completa. Mas não estamos vendo isso, infelizmente.
Por esse motivo, alguns sites que precisam instalar servidores de uso geral, como o Apache, na parte frontal e que precisam oferecer suporte a grandes quantidades de clientes, geralmente precisam desativar o keep-alive. E para forçar os navegadores a aumentar o número de conexões, eles usam vários nomes de domínio para que os downloads possam ser paralelizados. É particularmente problemático em sites que fazem uso intensivo de SSL porque a configuração da conexão é ainda maior, pois há uma viagem de ida e volta adicional.
O que é mais comumente observado hoje em dia é que tais sites preferem instalar front-ends leves, como haproxy ou nginx, que não têm problemas em lidar com dezenas a centenas de milhares de conexões simultâneas, eles permitem o keep-alive no lado do cliente e desabilitam-no no Lado Apache. Nesse lado, o custo de estabelecer uma conexão é quase nulo em termos de CPU e nada perceptível em termos de tempo. Dessa forma, isso fornece o melhor dos dois mundos: baixa latência devido ao keep-alive com tempos limites muito baixos no lado do cliente e baixo número de conexões no lado do servidor. Todo mundo está feliz :-)
Alguns produtos comerciais melhoram ainda mais isso, reutilizando conexões entre o balanceador de carga frontal e o servidor e multiplexando todas as conexões de cliente sobre eles. Quando os servidores estão próximos ao LB, o ganho não é muito maior do que a solução anterior, mas muitas vezes exigirá adaptações no aplicativo para garantir que não haja risco de cruzamento de sessão entre usuários devido ao compartilhamento inesperado de uma conexão entre vários usuários . Em teoria, isso nunca deveria acontecer. A realidade é muito diferente :-)