Como aumentar as conexões simultâneas no Apache

Hoje venho falar mais uma vez sobre um dos serviços web mais usados ​​no mundo: o servidor web Apache2.

É um assunto que já foi falado muitas vezes, mas agora venho falar sobre outro recurso a levar em consideração com este serviço: O limite de conexões simultâneas. Não importa se temos muito básico ou uma nave espacial com processador i7 e 32 GB de RAM ...

O limite de conexões simultâneas será sempre o mesmo, a menos que tomemos as medidas cabíveis, o que significa que se quisermos ter muitas pessoas conectadas ao mesmo tempo, não vamos exigir apenas um bom hardware, mas também uma boa configuração.

Neste caso, não é necessário instalar nada, tudo é baseado em conceitos simples que devem ser levados em consideração para configurar o apache; conceitos que devem ser muito claros antes de querer fazer qualquer alteração.

logotipo_apache2

A primeira coisa a pensar é: Qual é a capacidade da minha equipe? Quantas conexões simultâneas meu equipamento pode suportar se eu forçar tanto quanto possível? Tudo isso depende de um único fator; RAM (memória de acesso aleatório).

Quanto maior a RAM, maior o número de conexões, embora não haja um valor fixo (ou seja, X clientes para cada X ram), por isso, antes de mais nada, é importante fazer alguns pequenos cálculos em nosso servidor web, com o a fim de conhecer nossos limites.

A primeira coisa que você deve saber é quanta memória RAM em média consome cada conexão com o Apache, já que cada conexão estabelecida supõe um certo consumo de RAM no sistema ... Obviamente nem todas as conexões consomem a mesma RAM, com a qual você teria que fazer um mídia ... Tudo isso pode ser obtido com o seguinte comando:

ps -ylC apache2 --sort: rss | awk '{SUM + = $ 8; I + = 1} END {print SUM / I / 1024} '

O resultado obtido seria representado em megabytes e pode variar em função do número de conexões ativas, do tipo de páginas acessadas, etc ... Portanto, é aconselhável realizar o teste com diferentes abas abertas; cada um deles mostrando conteúdos diferentes se possível. No meu caso, por exemplo, o resultado foi 9.5458, que se arredondarmos para o topo seria 10 MB RAM consumida em média por conexão.

Também é importante saber quanta RAM é consumida pelos demais processos que estão ativos no sistema, já que o serviço web não é o único que roda no sistema operacional e é necessário deixar memória RAM livre no servidor para que possa executar o resto das tarefas. Isso pode ser obtido com o comando mostrado abaixo:

ps -N -ylC apache2 --sort: rss | awk '{SUM + = $ 8} END {print SUM / 1024}'

O resultado obtido também seria representado em megabytes e nos mostraria com bastante precisão a quantidade de RAM consumida pelo resto dos processos; no meu caso 800 MB. Com esta informação poderíamos fazer um cálculo geral do número de conexões simultâneas que poderíamos ter; Calculo que obteríamos através de uma operação muito simples.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Com esta fórmula em mãos, vamos imaginar que temos um computador com 4 GB de RAM, ou seja, 4096 MB e que nosso computador apresentou os resultados citados; o cálculo seria:

(4096 - 800) / 10 = 329 conexões simultâneas

O problema desse cálculo é que um é muito extremo, pois consumiria toda a RAM (fazendo com que o servidor consuma a troca) e também, no caso de ter um banco de dados, como MySQL ou qualquer outro, as conexões para ele também consumiriam RAM, então o número obtido pode ser qualificado como um número utópico. Portanto, a fim de liberar memória para possíveis processos adicionais e também considerar a possibilidade de que conexões com um banco de dados sejam executadas, reduziríamos o número de conexões para 250.

Agora que temos nosso número máximo de conexões simultâneas, teríamos que preparar o Apache para receber este número, o que é feito no arquivo de configuração desta chamada apache2.conf, que está hospedado em / etc / apache2.

O arquivo em questão segue uma estrutura baseada em módulos, cada um com seu nome correspondente, mas estaríamos interessados ​​apenas em um deles, cujo nome é  mpm_prefork_module. O módulo em questão possui os seguintes dados por padrão:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Este módulo contém uma série de parâmetros muito importantes, embora exista um deles que nos interessaria particularmente, denominado MaxClients. Este parâmetro especifica o número máximo de conexões simultâneas e deve ser modificado para 250.

Um detalhe a ter em conta é que quando se especifica um valor diferente do padrão no referido parâmetro, é necessário adicionar mais um ANTES deste. Este parâmetro é chamado ServerLimit e define o limite de conexões que o servidor pode "manter" mesmo quando está fora do limite.

O parâmetro ServerLimit sempre tem que ser um pouco maior que o MaxClients e aqui, como há pouco espaço de manobra, um limite de 270. Isso faria com que o módulo tivesse a seguinte aparência:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

Agora só seria necessário reiniciar o serviço Apache usando o comando: 

/etc/init.d/apache2 reinicie

Com isso já pudemos desfrutar de nosso servidor web otimizado.

Saudações.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   zetatina dito

    Obrigado pela postagem!

    1.    Drassil dito

      Estou feliz que você achou útil.

      Saudações.

  2.   Miguel Angel dito

    Existe uma maneira de agrupar o Apache e dois servidores, você pode explicar como funciona?

    1.    Drassil dito

      Embora eu tenha lido alguma teoria sobre isso, nunca a apliquei na prática. Mesmo assim, talvez este artigo possa lhe dar alguma orientação a esse respeito, embora repita que não tive a oportunidade de colocá-lo em prática:

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    Eduardo jalil dito

      Você já perguntou há muito tempo, se não resolve; Eu tenho um esquema de balanceamento com um terceiro que atua como um sistema de arquivos, você aponta as pastas que estão em var / www / html / (no meu caso) para o sistema de arquivos, então eles compartilham as mesmas informações, e você possivelmente irá requer um ip virtual que responde e redireciona para os ips dos apaches, para isso você pode ocupar um haproxy e se quiser em alta disponibilidade pode integrar o keepalive caso um caia, o outro continue respondendo, ou também se você já tiver um domínio para o aplicativo, você pode balancear com libra fazendo back-ends para ambos os servidores, para casos específicos como o moodle ou certos aplicativos que se conectam a um banco de dados no mysql, você teria que criar um usuário por servidor de aplicativo que aponta para o mesmo banco de dados .

  3.   shamaru dito

    Muito obrigado pela postagem, você está absolutamente certo, a ram é o cálculo primário, embora eu imagine que também calculemos o número máximo de processos que nosso processador pode manipular (claro, primeiro fazendo o cálculo da memória principal) e como o disco seria distribuído difícil (Exemplo de partições / var = 1TR).

    1.    Drassil dito

      Você está certo; tudo é importante, como controle de temperatura entre outras coisas. Obviamente, um processador poderoso pode executar um maior número de tarefas simultaneamente com grande eficiência, mas o objetivo deste post foi explicar a importância da RAM no que diz respeito ao número de conexões simultâneas.

      Uma boa maneira de controlar todos esses fatores e ver se nosso processador não está saturado ou se temos pouca memória RAM livre, seria usar um script bash. Talvez este post que fiz há alguns dias sobre isso seja interessante para você, que deixo no link a seguir; É um monitoramento global, mas pode ser interessante para um:

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      lembranças

  4.   Sérgio S dito

    Muito boa nota, muito obrigado!

    1.    Drassil dito

      Muito obrigado! Espero que você tenha aproveitado isso.

  5.   palhaço dito

    Eu não quero ser um idiota ...
    … Mas, ao aumentar o número de conexões, você não fica mais vulnerável a um ataque DDoS?

    1.    Drassil dito

      Não é uma pergunta silenciosa de cretino. A verdade é que ao aumentar o número de conexões simultâneas, fortalecemos parcialmente o Apache contra ataques DDoS, já que você deve levar em consideração que o número máximo de conexões simultâneas estabelecidas no servidor é o número máximo de conexões totais, não as provenientes de um único usuário. Assim, enquanto no início só podíamos suportar 150 conexões simultâneas (sejam conexões de uma fonte legítima ou não) agora podemos contar com tantas quantas o nosso servidor suporta, exigindo um maior número de conexões ao mesmo tempo para ficar sem serviço. Obviamente, aumentar o número máximo de conexões não é uma forma de se proteger desse tipo de ataque, mas sim implementar políticas de firewall. Se, por exemplo, o serviço da web que você deseja colocar for exposto à internet, uma medida de segurança que poderia ser implementada seria a adição destas linhas ao nosso firewall:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-upto 10 -m estado –state NOVO -j ACEITAR

      iptables -A INPUT -p tcp –dport 80 -m state –state ESTABELECIDO, RELACIONADO -j ACEITAR

      iptables -A INPUT -p tcp –dport 80 -j DROP

      1.    palhaço dito

        Uma das características dos ataques DDoS é que um invasor pode parecer enviar pacotes de várias direções diferentes, o que impede que o fluxo de pacotes venha apenas de uma direção.

    2.    Drassil dito

      Você está certo no sentido de que um firewall como o que eu configurei não é muito eficiente contra um ataque de DDoS, já que ele vem de fontes diferentes. Ainda assim, é melhor limitar o número de conexões a 10 para cada uma dessas fontes, em vez de não ter um limite, de modo que cada fonte possa estabelecer cem ou mais conexões.

      Em qualquer caso, o kit da questão é que quanto mais conexões simultâneas o servidor suportar, mais difícil será derrubá-lo com um ataque de DDoS, o que tornaria mais difícil para a página ser derrubada por um invasor.

      Saudações.

  6.   eliotime3000 dito

    Boa. Por enquanto continuo com o NGINX no meu site para não torturar o VPS que tenho.

  7.   Bruno cascio dito

    Bela postagem @Drassill!

    Eu queria contribuir com algo talvez mais estatístico do que configuração.
    Embora a forma mais fácil e rápida de calcular o parâmetro de consumo seja com a média, talvez pudéssemos ser mais rigorosos e usar a “mediana” em vez da “média”. O que nos salvaria? Que os números disparam caso uma conexão consuma muita memória. Por exemplo, suponha que os seguintes clientes consumam os seguintes valores, na unidade de memória que desejam (KB, MB, MiB, etc):

    10, 15, 150, 5, 7, 10, 11, 12

    A média daria cerca de 30

    E isso porque temos um extremo muito grande (150), e os cálculos são loucos. A mediana consiste em ordenar esses dados, dividindo o número de amostras por 2 (nosso centro) e, em seguida, obter o número dessa posição. Com isso teríamos algo como

    5, 7, 10, 10, 11, 12, 15, 150

    Portanto, nossa média seria: 8/2 = 4 que é ~ 10

    Aqui você pode ver que não importa quão louco seja o extremo, ele sempre nos dará um valor mais realista. Se adicionarmos um cliente que consome 200, nossa mediana será 11, enquanto a média pode ir para …….

    É apenas uma contribuição, e é muito discutível, pois com as conexões não aparafusa.

    Abraço pessoas linuxera 🙂

  8.   Carlos dito

    Olá, tive um problema no meu servidor dedicado, e é que cada vez que se aproxima o número de aproximadamente 250 pessoas online, de acordo com o google analytics em tempo real, o meu servidor colapsa e a conexão fica lenta até cair para o site e nunca carrega mais que esse número de usuários online, mas quando vejo o desempenho do servidor dedicado que é de 8 gb de RAM mostra 10% de uso, a cpu: 5% de uso e o disco rígido em: 1.99% de uso.
    Pode me ajudar? Não consigo encontrar o que fazer, seguir essas etapas é a solução?

    1.    Drassil dito

      Bom Carlos.

      O problema que você descreve é ​​muito comum quando o servidor não está devidamente preparado. Seu servidor provavelmente aceitará um número muito menor de conexões simultâneas e, quando atingir 250 conexões, ele irá travar. Seguindo o manual, você deverá ser capaz de resolver o problema, embora se você tiver um banco de dados nesse servidor, também terá que otimizar esse banco de dados.

      Saudações.

      1.    Carlos dito

        Drassill, fiz a configuração que você mencionou e está satisfatória, ontem alcancei 280 usuários online e o servidor não travou, estou muito feliz com esse resultado, e também quero fazer a outra coisa que você me diz para otimizar o banco de dados, ¿Como faço para fazer isso?

    2.    Drassil dito

      O conceito de banco de dados é bastante aberto; usar mysql não é o mesmo que postgres (por exemplo). Obviamente, não conheço todos os bancos de dados; Eu tentei mysql e postgres, e o aumento das conexões simultâneas nestes seria baseado no parâmetro max connections; A otimização do mysql seria feita em /etc/my.conf e o parâmetro max connections deveria ser alterado (entre outros). Em vez disso, para o postgres, tenho um artigo em meu blog que explica como otimizá-lo que pode ser útil para você ou que você pode usar como referência para seu banco de dados:

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      Saudações.

  9.   Erickson vasquez dito

    Olá, quando eu lanço o primeiro comando, ele me mostra o valor 0. O que poderia ser?

  10.   Daniel Ojeda dito

    Obrigado por este post.

  11.   Rolando Aguilera Salazar dito

    Que bom manual, essa informação faz parte do que procuro... obrigado!

    Mas agora, se eu quiser que quando esses 250 visitantes forem ultrapassados, o visitante 251 vá para uma página de espera ou fila virtual, posso fazer isso a partir desta mesma configuração?

    Cumprimentos e obrigado!