Qualcosa mangia tutta la memoria (sospetto che ci sia perdita di memoria su alcune app). Come rilevare cosa?


16

Ho un server che esegue bundle liquidsoap + icecast e un sito Web semplice (httpd + mysqld). Niente di speciale. Visitatori circa 2000+ al giorno, con circa 50 che sono online contemporaneamente in media.

Il server ha 8 GB di RAM. Col passare del tempo, la quantità di memoria libera diminuisce costantemente, anche se non viene avviato nulla di nuovo sul server e non ci sono nuovi utenti. Ad un certo punto inizia a scambiarsi, il caricamento sul server aumenta e non risponde. Di solito quello che faccio è solo riavviare il server ...

Cosa si può fare per rilevare cosa perde esattamente la memoria? Uso top per monitorare l'utilizzo delle risorse, ma a mio avviso non mostra nulla di utile:

inserisci qui la descrizione dell'immagine

Esiste un modo per scoprire cosa utilizza così tanta memoria? o cosa inizia a scambiare pesantemente su disco? Un modo per liberare memoria senza riavviare il server?


Qual è il motivo per cui non provi a riavviare alcuni dei servizi (apache, liquidsoap) invece del server?
jamespo,

Inizialmente ho risposto per il normale utilizzo della memoria. Ho aggiornato con una serie di strumenti che possono aiutare a identificare il problema.
BillThor,

@jamespo, in realtà l'ho provato, ma non ha avuto alcun effetto, quindi il riavvio è stata l'unica cosa che sapevo potesse aiutare.
jayarjo,

La cache 4027092k dovrebbe spiegare l'utilizzo della memoria, no? Attualmente sto lavorando su un problema simile altrove, e finora sono riuscito a capire che il trasferimento di memoria può essere regolato con i seguenti parametri: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Questa non è una soluzione completa e nessun feedback molto gradito. Spero che sia la giusta direzione da percorrere.

Risposte:


16

L'esecuzione topin modalità batch per segnalare periodicamente le dimensioni della memoria può essere utilizzata per vedere chi sta usando la memoria quando le cose vanno a sud. L'esecuzione sarin modalità batch dovrebbe fornire una buona diagnostica sull'uso della memoria e sui relativi I / O. L'esecuzione muninper monitorare il sistema dovrebbe fornire un grafico con buoni dettagli su quale memoria viene utilizzata. Questo può aiutare molto.

È possibile utilizzare limits.conf per limitare la dimensione massima dei programmi. Impostato correttamente, questo dovrebbe uccidere tutti i programmi che perdono memoria. Funziona con il modulo pam_limits. I limiti possono anche essere impostati con il ulimitscomando.

Stai eseguendo alcuni programmi che potrebbero utilizzare grandi quantità di memoria. Alcune cose che potresti guardare includono.

  • Le applicazioni mal programmate in esecuzione sotto apache2possono perdere memoria. Dovresti vedere aumentare la dimensione della memoria quando ciò accade. Puoi sintonizzare apache2 per riciclare i bambini dopo un certo numero di usi impostando MaxRequestsPerChildsu 100 o giù di lì. Se ciò risolve il problema, è necessario risolvere la perdita. Lo guarderei prima io.
  • MySQL potrebbe tentare di caricare i dati in memoria. Se hai molti dati in memoria, ciò potrebbe causare alcuni ostacoli, ma non dovrebbe essere così drammatico come stai vedendo.
  • Se è installato un tmpfsfile system di grandi dimensioni, è possibile che si verifichi una perdita di memoria se i file non vengono eliminati quando utilizzati. Anche i file di lunga durata possono essere un problema.
  • Se il problema si verifica all'incirca alla stessa ora del giorno, è possibile che si disponga di un programma programmato che perde memoria.
  • Se si dispone di un programma che alloca memoria condivisa, ma non la rilascia prima di uscire, si avrà una perdita di memoria relativamente invisibile. Se la memoria condivisa è bloccata in memoria, potrebbe forzare lo scambio. La quantità di memoria condivisa disponibile è in genere relativamente limitata.
  • Il bundle liquidsoap + icecast potrebbe incorrere in problemi di buffering che utilizzano la memoria. Non ho usato questa combinazione, quindi non sono sicuro di come apparirebbe.

Utilizzo normale della memoria: la memoria libera non è qualcosa che si desidera molto. Se il tuo sistema è attivo da molto tempo e ha molta memoria libera, qualcosa non va. Ogni volta che leggi o scrivi un file, i blocchi andranno nella cache del buffer. Ciò ridurrà la tua memoria libera ed è una buona cosa. Il sistema manterrà abbastanza spazio libero per avviare alcuni programmi senza cercare altrove memoria. Poiché molti programmi vengono eseguiti rapidamente, la loro memoria verrà restituita al pool gratuito quando si arrestano.

Quando si legge un file che si trova nella cache del buffer, non è necessario l'accesso al disco e la lettura viene risolta dalla cache del buffer. Le scritture usano un meccanismo simile. Se il sistema necessita di memoria, la cache del buffer è una delle prime posizioni utilizzate. La maggior parte dei buffer può essere rilasciata immediatamente.

Se si verifica una perdita di memoria, verrà visualizzata la memoria libera e entrambi i buffer inizieranno a ridursi. Questo non è ancora un problema grave, poiché la memoria trapelata dovrebbe essere spostata nello spazio di scambio. Il sistema continuerà a funzionare correttamente fino a quando non si riempie lo spazio di scambio e si disegna lo spazio libero rimanente fino a quando non è possibile avviare i programmi. È tipico che può essere utilizzata una piccola quantità di spazio di swap.


Il problema nel mio caso è piuttosto strano. Anche quando il carico è enorme e il server si scambia pesantemente, c'è molta memoria libera (come ho capito dopo aver letto su buffer e cache). top non mostra alcuna memoria di hogging di processo in modo crescente. Ma il carico aumenta e ad un certo punto il server diventa inutilizzabile: | Grazie per la risposta dettagliata.
jayarjo,

2
@jayarjo: Munin e sar dovrebbero aiutare a scoprire cosa sta succedendo. Se hai un sacco di memoria libera non dovresti scambiare. Potresti avere un diverso problema I / O. saraiuterà a individuare quale partizione ha l'I / O e potrebbe aiutare a scoprire il problema.
BillThor,

+1 per i consigli MaxRequestsPerChild
jamespo,

11

È possibile utilizzare questo comando per visualizzare le prime 10 applicazioni relative all'utilizzo della RAM:

ps -A --sort -rss -o comm,pmem | head -n 11

A volte questo comando ti aiuta se sono stati generati molti processi secondari:

ps auxf

In questo modo puoi vedere quali processi appartengono insieme.


Questi sono comandi utili, grazie li prenderò nota per il futuro. Ma il problema è che ci sono sempre gli stessi processi in cima (puoi vederli nello screenshot allegato) - apache, mysql, liquidsoap, icecast. E usano (o almeno si mostra che usano) la stessa quantità di memoria (davvero trascurabile), anche quando il server sta morendo di carico: |
jayarjo,

@jayarjo: il numero di processi cambia? Hai molti più processi? Ed è un server fisico o virtuale?
Raffael Luthiger,

Non ho notato alcun cambiamento nel numero di processi. Fondamentalmente quando faccio il top, mentre il server sta morendo di carico vedo un'immagine molto simile a quella che ho allegato nella domanda originale, tranne l'enorme carico: | Il server è fisico.
jayarjo,

2
Prova a ottenere maggiori informazioni con "vmstat" (es. Vmstat -s). O con lo strumento già menzionato "sar". Hai forse un filesystem basato su RAM? Quindi forse "iostat" può fornire anche maggiori informazioni.
Raffael Luthiger,

1
Ho avuto dei dubbi sul fatto che il campo "pmem" (% MEM) in entrata pso in topuscita sia la cosa giusta da guardare se si cerca di rilevare una perdita di memoria: non è solo questa la percentuale della memoria fisica attualmente utilizzata dal processo? Ma altre parti della memoria utilizzata (inclusa la perdita) del processo possono essere scambiate. Forse "size" o "vsize" sarebbe più appropriato per misurare la dimensione di un processo? Ad esempio, ps -A --sort -size -o comm,size | head -n 11oppureps -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev,

8

Niente usa davvero quella memoria in termini di applicazioni.

È necessario dedurre il valore "memorizzato nella cache" che rappresenta la cache della pagina per farsi un'idea più precisa dell'utilizzo effettivo della memoria in termini di utilizzo del programma.

Fondamentalmente questa è una buona gestione della memoria e questo è idealmente quello che vuoi.

Vedi il link qui per maggiori informazioni: http://www.linuxatemyram.com/


sì, ho trovato quel link e letto su buffer e cache, ma per quanto ho potuto ottenere da quello che ho letto, non possono causare lo scambio, vero?
jayarjo,

@jayarjo Penso che per capire cosa succede lì avremmo bisogno di statistiche che dimostrino il problema allora. I numeri forniti non mostrano lo scambio o l'utilizzo della memoria reale.
Matthew Ife,

1

Non sono un professionista in questo, ma il sapone liquido + icecast è multimediale. Quando il sistema è libero, memorizza nella cache e / o occupa la memoria per uso futuro. E se il traffico aumenta a una determinata ora del giorno / per un periodo di tempo, inizierà lo scambio. A questo punto, se le richieste (utenti che visualizzano contenuti) aumentano, le risorse necessarie saranno più di 8 GB di RAM.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.