• Moderatore

    Ottimizzare la configurazione di apache2

    Salve ragazzi,
    ho un VPS con 512 mb di ram e senza possibilità di Swap.
    Ho l'esigenza di tenere operativo apache2 al meglio delle sue possibilità, cioè che anche in presenza di molte richieste non mi si schianti tutto per carenza di memoria.
    Senza apache2 attivo ho liberi 360mb di ram (ho scelto la mpmprefork)
    appena partito ho 290 mb liberi, dopo giorni di utilizzo mi attesto sui 250mb.
    La configurazione l'ho fatta un po' a prove e tentativi, ma penso che non sia giusta perché ogni tanto google mi riporta "url non raggiungibile".

    la configurazione l'ho impostata così:
    <IfModule mpm_prefork_module>
    StartServers 20
    MinSpareServers 30
    MaxSpareServers 50
    ServerLimit 128
    MaxClients 128
    MaxRequestsPerChild 1000
    </IfModule>

    Esiste un modo per ottimizzare questa configurazione in modo che mi risponda a più richieste contemporanee (di come è settata adesso) in modo che non mi sfondi la quota dei 400 mb totali (cioè apache non prenda più di 250mb di ram)?

    Ho letto molto in giro, ma non mi è chiaro.
    Sulla vps ho anche mysql e php ma non li uso se non per l'amministrazione, quindi ritengo che conservare 100mb di ram sia ok, ma magari sbaglio.


  • Moderatore

    in condizioni di memoria limita usare il prefork non è il massimo....tieni conto che il prefork genera N processi e ogni processo contiene tutti i dati di apache, consumando un botto di memoria

    in quella situazione il worker sarebbe meglio

    però supponendo tu abbia Centos su quel VPS e magari è pure un VPS virtuozzo, è difficile che sotto carico elevato apache possa darti chissà quali performance

    tu hai cercato di limitare il numero di richieste contemporanee a cui apache può rispondere, settandolo a 128

    ma 128 è un valore decisamente basso....se consideri che mediamente un browser per caricare una pagine invia una trentina di richieste ( tra html, javascript, immagini varie presenti sulla pagina )....quei 128 slot si saturano subito

    con quella configurazione è naturale che spesso google riceva "url non raggiungibile"

    la cosa importante da tenere in conto è il numero di hit che quel server riceve ogni giorno....ci sono limiti all'ottimizzazione e a mio avviso nel tuo caso sono stati raggiunti

    a questo punto più che cercare di ottimizzare apache sarebbe meglio prendere in considerazione un web server ultraleggero come nginx


  • Moderatore

    Grazie Paolino,
    Purtroppo mi tocca rimanere con apache2 in quanto non saprei cambiare la configurazione della macchina vps che monta un sistema per gestire più domini (non penso sia virtuozzo, non l'ho mai visto).
    Con la ram che ho a disposizione qual è la migliore soluzione, mantenendo apache? Mi pare di capire che worker sia da preferire, ma con quello non sono riuscito a evitare la morte del processo per fine memoria (probabilmente il mdr arriva a filotti e mi satura tutto).


  • Moderatore

    il problema è che senza swap c'è poco da fare

    il web server si trova un certo numero di richieste dai client, prova ad allocare memoria per le strutture e non la trova

    però d'altro canto impostare un numero così basso per MaxClients, vuol dire avere continuamente url non raggiungibile

    a questo punto bisogna capire perchè consuma tanta memoria....il sito è forse dinamico? in quel caso potrebbero essere gli script il problema

    oppure il sito ha un numero elevato di visitatori? in questo caso l'unica opzione è passare ad un server più potente


  • Moderatore

    Grazie Paolino,
    Allora ho provato a capire qualcosa di più del server e ho disabilitato alcuni servizi che ritengo non mi siano necessario (bind9, courier, postfix, postgrey, spero di non aver errato 🐵 e ora ho liberi 439mb di memoria senza che sia eseguito apache2
    Adesso lo lascio così per un po' (una quindicina di giorn) per vedere se le routine cronnate non si arrabbiano e se continua a funzionare tutto come prima.
    Con 439MB ci sono speranze o è sempre pochetto? Non immaginavo ci volessero tante risorse per un web server!
    Dando un occhio ai log c'è modo di trovarci qualcosa di interessante?


  • Moderatore

    bind9???? quello è il server dns...sei sicuro che adesso i siti che si trovano sul vps siano accessibili?

    courier e postfix servono per gestire la posta

    postgres è il database


  • Moderatore

    ho spento bind9 in quanto uso in dns del registrar e non quello locale.
    Mi pare che tutto sia a posto.
    La posta non la gestisce questa VPS, però mi sono accorto che postfix mi serve operativo altrimenti i moduli php non riescono a inviarmi le email di avviso.
    Per il resto mi pare tutto sia ok. Mi ritengo, forse sbagliando, tranquillo :fumato:


  • Moderatore

    Allora ho fatto un po' di prove, però non penso di avere trovato la strada giusta.

    Ho messo questa configurazione:

    <IfModule mpm_prefork_module>
    StartServers 20
    MinSpareServers 30
    MaxSpareServers 50
    ServerLimit 256
    MaxClients 256
    MaxRequestsPerChild 1000
    </IfModule>

    e mi pare non sfondare la memoria libera.

    Ho provato anche a mettere il modulo worker al posto del prefork con questa configurazione:

    <IfModule mpm_worker_module>
    StartServers 50
    MaxClients 256
    MinSpareThreads 10
    MaxSpareThreads 50
    ThreadsPerChild 32
    MaxRequestsPerChild 500
    ThreadStackSize 65535
    </IfModule>

    Però a questo punto la mia ignoranza viene a galla 🙂

    Per testare le connessioni al webserver uso jakarta meter (accetto consigli) lanciato da osx con 128 thread contemporanei.
    Con prefork inizia ad apparirmi un error rate del 50% intorno al 100 sample. Il che lo interpreto come "URL non raggiungibile" ma magari sbaglio, non è un tool molto chiaro.
    Con worker questo accade molto prima, intorno al 50esimo, ma si attesta intorno al 50%.

    Leggendo mi pare di avere capito che in questo centri in timeout che ho configurato così:
    Timeout 60
    KeepAlive On
    MaxKeepAliveRequests 25
    KeepAliveTimeout 15

    In teoria avendo impostato 256 come maxclient dovrei avere 25 bloccati per un periodo di 15 secondi, però magari ho capito male.

    A questo punto mi servono anche dei consigli su come testare/stressare il server in modo da capire.

    Grazie!


  • Moderatore

    prova con ab che è fornito con apache stesso per stressare il server

    però ripeto, con quella quantità di ram e il numero di richieste che gli invii è normale che vada in crisi, soprattutto se sotto c'è un sito dinamico in php