Ir para o conteúdo

Como faço para ajustar a alocação de memória do servidor da Web Apache para evitar erros de falta de memória na minha instância EC2 Linux?

6 minuto de leitura
0

Meu servidor da Web Apache que executa em uma instância Linux do Amazon Elastic Compute Cloud (Amazon EC2) não responde de forma intermitente. Eu recebo as mensagens “out of memory”, “oom”, “oom-killer,” “failure to fork process” ou outras mensagens de memória insuficiente no log do sistema da instância.

Breve descrição

Por padrão, o Apache aceita 256 conexões ao mesmo tempo. Use o ServerLimit de configuração do Apache para configurar a cota.

Tipos de instâncias pequenas, como t2.small, têm apenas 2 gigabytes (GB) de memória e não conseguem gerenciar 256 conexões Apache simultâneas. Como resultado, você pode receber um dos seguintes erros quando o servidor recebe tráfego intenso:

  • “Out of memory”
  • “Oom”
  • “Oom-killer”
  • “Failure to fork process”
  • Uma observação sobre memória insuficiente nos logs do sistema

Para analisar os logs do sistema da instância, verifique os seguintes arquivos de log com base na distribuição do seu sistema operacional (SO):

  • Para Debian e Ubuntu, verifique /var/log/syslog.
  • Para Amazon Linux, CentOS e Red Hat Enterprise Linux (RHEL), verifique /var/log/messages.

Resolução

Para evitar erros de memória na sua instância, defina uma cota no número de conexões Apache e httpd simultâneas que o servidor aceita. Use o parâmetro MaxRequestWorkers (Apache 2.4) na configuração do Apache para definir a cota. Para servidores Prefork sem thread, MaxRequestWorkers representa o número máximo de processos secundários que o Apache inicia para solicitações do servidor.

A resolução a seguir é para o modelo padrão do módulo de multiprocessamento (MPM) Prefork Apache que os servidores da Web usam. Para confirmar seu MPM, execute o seguinte comando:

# apachectl -V | grep "MPM"

Para calcular o valor aproximado a ser definido para MaxRequestWorkers, determine o quanto seu workload usa as seguintes configurações:

  • A RAM física do seu servidor
  • A memória mantida após outros serviços usarem a memória
  • Seu processo Apache que usa mais memória

Observação: é uma prática recomendada usar uma faixa de 90 a 100% da RAM RESTANTE para MaxRequestWorkers para conciliar o desempenho e a estabilidade do servidor. No entanto, seu workload pode ter necessidades diferentes.

Calcular a RAM física do servidor

Para calcular a RAM, execute o seguinte comando:

# free -m | grep Mem: | awk '{print $2}'

Calcular a memória que permanece após outros serviços usarem a memória

Primeiro, calcule o uso de memória de todos os serviços principais que não são Apache. Execute o seguinte comando para cada serviço:

# usage_mbytes=0; for usage_by_pids in `ps -C $proc_cmd -o rss | grep -v RSS`; do usage_mbytes=$(($usage_mbytes + $usage_by_pids)); done; echo $(($usage_mbytes/1024)) MB;

Observação: no comando anterior, substitua $proc\ _cmd pelo nome ou comando do serviço. Por exemplo, use mysqld para calcular o uso de memória do serviço mysqld.

Depois de calcular o uso de memória de cada serviço, some os valores para obter a soma total do uso de memória por todos os outros serviços principais.

Em seguida, use a fórmula a seguir para subtrair o uso de memória por todos os outros serviços principais da RAM física do seu servidor em megabytes (MB):

Memória restante = (RAM física do seu servidor) - (Uso de memória por todos os outros serviços principais)

Identificar o processo Apache que usa mais memória

Para identificar o processo que usa mais memória, execute o seguinte comando:

# sudo bash -c 'high_mem=0; for pid in $(ps aux | grep -E "httpd|apache2" | grep -v ^root | awk "{print \$2}"); do memory=$(pmap -d $pid | grep "writeable/private" | awk "{print \$4}" | sed "s/[^0-9]//g"); if [[ $memory -gt $high_mem ]]; then high_mem=$memory; fi; done; echo $((high_mem/1024)) MB'

Observe a quantidade de memória que o processo usa.

Calcular MaxRequestWorkers

Use a fórmula a seguir para calcular MaxRequestWorkers:

MaxRequestWorkers = (Memória restante * 90/100)/(Memória consumida pelo maior processo Apache)

Observação: substitua a Memória restante pela memória que permanece após outros serviços usarem a memória e a memória consumida pelo maior processo Apache pela memória usada pelo maior processo.

O cálculo anterior é o mesmo para sistemas baseados em Ubuntu, Debian e RHEL. No entanto, o caminho de configuração do Apache e os nomes dos arquivos dependem do tipo de sistema operacional. Defina MaxRequestWorkers com base no seu sistema operacional.

Observação: os exemplos a seguir usam o Apache versão 2.4 ou posterior.

Debian e Ubuntu

Conclua as etapas a seguir:

  1. Conecte-se à sua instância do Linux.

  2. Para abrir o arquivo /etc/apache2/mods-available/mpm_prefork.conf no modo editor, execute o seguinte comando:

    # vi /etc/apache2/mods-available/mpm_prefork.conf
  3. Altere o parâmetro MaxRequestWorkers pelo valor que você calculou.
    Exemplo:

    <IfModule mpm_prefork_module>      StartServers            5  
        MinSpareServers         5  
        MaxSpareServers        10  
        MaxRequestWorkers    your_value  
        MaxConnectionsPerChild  0  
    </IfModule>

    Observação: substitua your_value pelo valor calculado de MaxRequestWorkers. Além disso, configure os outros parâmetros para se alinharem às suas necessidades.

  4. Salve o arquivo e, em seguida, saia dele.

  5. Execute o comando a seguir para realizar uma verificação de sintaxe do Apache:

    # apachectl configtest
  6. Se você receber uma saída de Syntax OK, execute o seguinte comando para reiniciar o Apache:

    # systemctl restart apache2

Amazon Linux, CentOS e RHEL

Conclua as etapas a seguir:

  1. Use SSH para fazer login no servidor.

  2. Crie um arquivo com o caminho /etc/httpd/conf.d/mpm\ _prefork.conf e adicione o seguinte bloco de comando:

    <IfModule mpm_prefork_module>      StartServers            5  
        MinSpareServers         5  
        MaxSpareServers        10  
        MaxRequestWorkers    your_value
        MaxConnectionsPerChild  0  
    </IfModule>

    Observação: substitua your_value pelo valor calculado de MaxRequestWorkers. Além disso, configure os outros parâmetros para se alinharem às suas necessidades.

  3. Salve o arquivo e, em seguida, saia dele.

  4. Execute o seguinte comando para verificar a sintaxe de configuração do Apache:

    # httpd -t
  5. Se você receber uma saída de Syntax OK, execute o seguinte comando para reiniciar o Apache:

    # systemctl restart httpd

Informações relacionadas

Tutorial: instalar um servidor LAMP no Amazon Linux 2

Tutorial: instalar um servidor LAMP no Amazon Linux 2023

AWS OFICIALAtualizada há 9 meses