sviluppo-web-qa.it

Come ridurre l'utilizzo della memoria su un server Web Unix

Attualmente sto usando un Joyent Accelerator per ospitare le mie webapp, e funziona bene, tuttavia devo ridurre i costi, quindi sto declassando il mio piano attuale e questo impone alcuni nuovi limiti di memoria (256 M rss, 512 M di scambio). Ieri non ero molto lontano da loro, ma dopo aver riavviato Apache più volte oggi, ora sono 411M rss, 721M swap (prstat -Z -s cpu).

La ricerca in Server Fault mi offre solo molti modi e strumenti specifici per monitorare il server, ma nessun consiglio su come ridurre/ottimizzare l'utilizzo della memoria. Ho anche visto questa domanda , ma non penso che sia buono per questa situazione particolare (o posso dire generica?).

Il server esegue Solaris su una CPU condivisa e sto usando uno Apache + MySQL + PHP.

Sono interessato a conoscere i passi che uno può fare per risolvere questo problema e risolvere i problemi. Tuttavia, sto anche esaurendo il tempo per abbassare la mia impronta di memoria e declassare il piano prima che finisca l'attuale, quindi anche tutto ciò che può fare magie e salvare la giornata è il benvenuto :)

36
lima

Grazie a tutti per le risposte ! Seguendo i tuoi suggerimenti sono stato in grado di ridurre il mio utilizzo della memoria a 195M SWAP e 108M RSS, senza toccare il mio codice (sicuramente lo ottimizzerò presto, ma questo doveva essere una soluzione per tirarmi fuori dai guai velocemente).

Ecco l'elenco delle cose che ho fatto:

Mi sono sbarazzato del carattere jolly usato nelle voci VirtualHost. Invece di *: 80 e *: 443, ho usato l'IP reale del mio server.

MPM prefork di Apache modificato. Questi sono i valori che ho finito usando:

 StartServers 1 
 MinSpareServers 1 
 MaxSpareServers 5 
 ServerLimit 16 
 MaxClients 16 
 MaxRequestsPerChild 0 
 ListenBacklog 100 

Questi non sono affatto numeri magici. Ho trascorso un po 'di tempo a provare diversi valori e combinazioni, quindi a testarli sul reale utilizzo del mio server e tutti dovrebbero fare lo stesso nel loro ambiente. Per la cronaca, il mio server riceve quasi 2 milioni di pv al mese, offrendo pagine dinamiche e risorse a un ritmo regolare - nessun effetto digg. L'intenzione, ancora una volta, era di ridurre il footprint di memoria, non di migliorare le prestazioni o l'HA.

Riferimento:

Ottimizzato KeepAlive di Apache. Impostando KeepAliveTimeout su un valore più basso (2 nel mio caso) posso aspettarmi meno processi server solo aspettando connessioni con client inattivi che potrebbero non richiedere più contenuti.

Riferimento: http://httpd.Apache.org/docs/2.0/mod/core.html#keepalivetimeout

Rimosso il modulo inutilizzato di MySQL. Ho aggiunto skip-innodb a MySQL's my.cnf. Massiccia riduzione del consumo di memoria.


Ci sono anche alcuni notevoli suggerimenti che non potrei fare personalmente:

  • Rimuovi PHP moduli che non ti servono. Il PHP sul mio server ha la maggior parte delle mod già compilate, probabilmente proverò il mio minimo PHP su altri VPS.
  • Passa a nginx con php-fastcgi. Questo è un altro buon consiglio che proverò presto, ma in questo momento non posso rischiare i tempi di inattività.
23
lima

Ho trovato questo articolo sulle configurazioni a memoria insufficiente per Apache e MySQL

Per essere molto utile nel definire le modifiche alla configurazione necessarie per le configurazioni di memoria insufficiente. Li ho ottimizzati per la mia situazione, ma dovrebbero darti gli strumenti necessari per trovare la soluzione migliore per il tuo ambiente

6
Kevin Kuphal

Dovrai limitare il numero di processi del server Apache in esecuzione e, essendo vicino al limite come te, non sarai in grado di gestire molto traffico di picco. Avere un web server al massimo durante il normale utilizzo è generalmente una cattiva idea (tm), poiché il traffico web è buono e basso per la maggior parte fino a quando non si viene tagliati o scavati o sbarrati o altro.

I problemi principali sono il numero di processi Apache che sono in esecuzione in qualsiasi punto - assumendo prefork qui, poiché ho distribuito solo PHP e PHP non è sicuro per i thread. Non ho esperienza nel dimensionamento dell'MPM di lavoro. Vi sono alcuni elementi nella memoria condivisa e altri nella memoria di ciascun processo.

È possibile ridurre il footprint di memoria totale tralasciando i moduli condivisi non necessari. Fondamentalmente, Apache viene configurato dalla maggior parte degli host per fare praticamente tutto sotto il sole. Se non stai usando mod_userdir, commentalo dalla tua configurazione di Apache. Fai solo attenzione a quanto rimuovi, perché alcune delle cose che potresti aver bisogno o le loro dipendenze non sono intuitive! Tutti i moduli dovrebbero essere documentati sul sito Web Apache.org. L'impronta per processo è più difficile da ridurre; la maggior parte delle configurazioni di Apache in questi giorni vengono solo con i quattro moduli essenziali compilati. Oltre a questi quattro moduli, la maggior parte dell'utilizzo della memoria proviene da perdite o da application RAM che non è garbage collection in modo efficace, motivo per cui potresti voler impostare un numero basso di richieste gestite da ciascun processo.

davvero vuoi mantenere l'utilizzo della memoria in RAM stesso e non andare in swap. Swap significa I/O. I/O è lento e guiderà l'utilizzo della CPU attraverso il tetto mentre i processi si bloccano in attesa che qualcosa venga spostato dallo swap.

4
Karl Katzke

Dato che hai già raggiunto il tuo obiettivo, ecco alcuni extra:

Dato che hai rimosso tutti i moduli php non necessari, potresti fare lo stesso con Apache. Per impostazione predefinita (a seconda dell'installazione), Apache carica un bel po 'di moduli extra e la maggior parte di essi non è realmente necessaria per il normale utilizzo quotidiano. Ad esempio, ci sono molti moduli di autenticazione che vengono sempre caricati. in genere non è necessario deflate a meno che non si stia tentando di limitare l'utilizzo della larghezza di banda. Autoindex e status vanno anche discutibili.

E un altro è che puoi limitare la quantità di memoria disponibile per php in php.ini: memory_limit = xxxM

2
rasjani

Per Apache, rimuovi i moduli che non usi, poiché usano solo memoria aggiuntiva. Per MySQL, rimuovere innodb/bbdb se non li si utilizza e rimuovere PHP non necessari.

Successivamente è necessario configurare Apache MaxClients in base alla dimensione di un processo e alla quantità di memoria che si desidera fornire ad Apache. Lo stesso vale per le connessioni massime su MySQL (consiglio lo script MySQL Tuning Primer eccellente.

Se hai il controllo della tua PHP, assicurati che non usi troppa memoria (ad es. Nelle variabili, specialmente quelle statiche).

Se vuoi andare oltre, puoi sostituire Apache + mod_php con l'installazione di nginx + fcgi, il che probabilmente porterà a un'ulteriore riduzione della memoria.

Un'ultima cosa: davvero non vuoi scambiare su un server web. Solo un po ', per rimuovere le cose non necessarie, ma lo scambio regolare su un server Web si tradurrà in un sito Web non responsive.

2
yhager

Il server esegue Solaris su una CPU condivisa e sto usando uno Apache + MySQL + PHP.

Non ho esperienza con Solaris, ma la cosa migliore che puoi fare è non usare Apache/mod_php.

  • Passa a nginx con php-fastcgi.
  • Ricompila php per utilizzare la quantità minima di plugin.
  • Sbarazzarsi di processi non necessari come ntpd (usa ntpdate), ftp (usa scp) ecc ...
0
Unknown

Ovviamente potresti limitare il numero di processi che Apache è in grado di fare fork, tuttavia questo funzionerebbe solo come un limite Sudo all'utilizzo della memoria. Da un punto di vista di livello inferiore è possibile utilizzare plimit per limitare le risorse disponibili per un processo. Credo che sia applicabile ai processi genitore e figlio ereditati.

Tuttavia, dal punto di vista della configurazione del server Web, ciò può dipendere dal modo in cui il codice viene eseguito davvero! Tuttavia, tieni presente che piccole cose come l'uso dei file .htaccess utilizzano più risorse rispetto all'utilizzo dei file di configurazione di Apache centrale (poiché vengono letti ogni volta che arriva una richiesta, portando a un sovraccarico maggiore), che è un significato in siti Web di grandi dimensioni.

0
Coops

Una cosa che potrebbe aiutare la crescita della memoria nel tempo è di abbassare il keepalive httpd, ma lo testerei attentamente nel caso in cui la tua applicazione abbia bisogno di processi più duraturi.

0
D.F.