Salta al contenuto

Come posso ottimizzare l'allocazione di memoria del server web Apache per evitare errori di memoria insufficiente nella mia istanza EC2 Linux?

5 minuti di lettura
0

Il mio server Web Apache in esecuzione in un'istanza Amazon Elastic Compute Cloud (Amazon EC2) Linux non risponde a intermittenza. Nel log di sistema dell'istanza ricevo messaggi "out of memory", "oom", "oom-killer," "failure to fork process" o altri messaggi di memoria insufficiente.

Breve descrizione

Per impostazione predefinita, Apache accetta contemporaneamente 256 connessioni. Utilizza ServerLimit della configurazione Apache per configurare la quota.

I tipi di istanza di piccole dimensioni, come t2.small, hanno solo 2 gigabyte (GB) di memoria e non possono gestire 256 connessioni Apache simultanee. Di conseguenza, potrebbe verificarsi uno dei seguenti errori quando il server riceve traffico intenso:

  • "Out of memory"
  • "Oom"
  • "Oom-killer"
  • "Failure to fork process"
  • Nota sugli errori di memoria insufficiente nei log di sistema

Per analizzare i log di sistema dell'istanza, controlla i seguenti file di log in base alla distribuzione del sistema operativo:

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

Risoluzione

Per evitare errori di memoria nell'istanza, imposta una quota per il numero di connessioni Apache e httpd simultanee accettate dal server. Utilizza il parametro MaxRequestWorkers (Apache 2.4) nella configurazione di Apache per impostare la quota. Per i server Prefork non thread, MaxRequestWorkers rappresenta il numero massimo di processi secondari che Apache avvia alle richieste del server.

La seguente risoluzione si riferisce al modello MPM (Multi-Processing Module) di Prefork Apache utilizzato dai server web. Per verificare il MPM, esegui questo comando:

# apachectl -V | grep "MPM"

Per calcolare il valore approssimativo da impostare per MaxRequestWorkers, determina in che misura il carico di lavoro utilizza le seguenti impostazioni:

  • RAM fisica del server
  • Memoria rimanente dopo l'utilizzo della memoria da parte di altri servizi
  • Processo Apache che utilizza più memoria

Nota: per bilanciare prestazioni e stabilità del server, è consigliabile utilizzare un intervallo del 90-100% di REMAINING RAM per MaxRequestWorkers. Tuttavia, il carico di lavoro potrebbe avere esigenze diverse.

Calcola la RAM fisica del server

Per calcolare la RAM, esegui questo comando:

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

Calcola la memoria rimanente dopo l'utilizzo della memoria da parte di altri servizi

Innanzitutto, calcola l'utilizzo della memoria da parte di tutti i principali servizi non Apache. Esegui questo comando per ogni servizio:

# 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;

Nota: nel comando precedente, sostituisci $proc_cmd con il nome o il comando del servizio. Ad esempio, utilizza mysqld per calcolare l'utilizzo della memoria da parte del servizio mysqld.

Dopo aver calcolato l'utilizzo della memoria da parte di ciascun servizio, somma i valori per ottenere la memoria totale utilizzata da tutti gli altri servizi principali.

Quindi utilizza la formula seguente per sottrarre dalla RAM fisica del server in megabyte (MB) la memoria utilizzata da tutti gli altri servizi principali:

Memoria rimanente = (RAM fisica del server) - (Memoria utilizzata da tutti gli altri servizi principali)

Identifica il processo Apache che utilizza più memoria

Per identificare il processo che utilizza più memoria, esegui questo 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'

Annota quanta memoria utilizza il processo.

Calcola MaxRequestWorkers

Utilizza la seguente formula per calcolare MaxRequestWorkers:

MaxRequestWorkers = (Remaining Memory * 90/100)/(Memory consumed by largest Apache process)

Nota: sostituisci Remaining Memory con la memoria rimanente dopo che altri servizi hanno utilizzato la memoria e Memory consumed by largest Apache process con la memoria utilizzata dal processo più grande.

Il calcolo precedente è lo stesso per i sistemi basati su Ubuntu, Debian e RHEL. Tuttavia, il percorso di configurazione e i nomi dei file di Apache dipendono dal tipo di sistema operativo. Imposta MaxRequestWorkers in base al sistema operativo.

Nota: gli esempi seguenti utilizzano una versione Apache 2.4 o successiva.

Debian e Ubuntu

Completa i seguenti passaggi:

  1. Connettiti all'istanza Linux.

  2. Per aprire il file /etc/apache2/mods-available/mpm_prefork.conf in modalità editor, esegui questo comando:

    # vi /etc/apache2/mods-available/mpm_prefork.conf
  3. Modifica il parametro MaxRequestWorkers con il valore calcolato.
    Esempio:

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

    Nota: sostituisci your_value con il valoreMaxRequestWorkers calcolato. Inoltre, configura gli altri parametri per allinearli ai tuoi requisiti.

  4. Esci dal file dopo averlo salvato.

  5. Esegui questo comando per verificare la sintassi di Apache:

    # apachectl configtest
  6. Se ricevi un output Syntax OK, esegui questo comando per riavviare Apache:

    # systemctl restart apache2

Amazon Linux, CentOS e RHEL

Completa i seguenti passaggi:

  1. Utilizza SSH per accedere al server.

  2. Crea un file con il percorso /etc/httpd/conf.d/mpm_prefork.conf, quindi aggiungi il seguente blocco di comandi:

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

    Nota: sostituisci your_value con il valoreMaxRequestWorkers calcolato. Inoltre, configura gli altri parametri per allinearli ai tuoi requisiti.

  3. Esci dal file dopo averlo salvato.

  4. Esegui questo comando per verificare la sintassi di configurazione di Apache:

    # httpd -t
  5. Se ricevi un output Syntax OK, esegui questo comando per riavviare Apache:

    # systemctl restart httpd

Informazioni correlate

Tutorial: installa un server LAMP su AL2

Tutorial: Installazione di un server LAMP su AL2023

AWS UFFICIALEAggiornata un anno fa