Linux: scopri quale processo utilizza tutta la RAM?


127

Prima di chiedere, per essere chiari: sì, conosco la cache del disco e no, non è il mio caso :) Scusate, per questo preambolo :)

Sto usando CentOS 5. Ogni applicazione nel sistema si sta scambiando pesantemente e il sistema è molto lento. Quando lo faccio free -m, ecco cosa ho ottenuto:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Quindi, in realtà ho solo 42 Mb da usare! Per quanto ho capito, in -/+ buffers/cacherealtà non conta la cache del disco, quindi in effetti ho solo 42 Mb, giusto? Ho pensato che potrei sbagliarmi, quindi ho cercato di disattivare la memorizzazione nella cache del disco e non ha avuto alcun effetto: l'immagine è rimasta la stessa.

Quindi, ho deciso di scoprire chi sta usando tutta la mia RAM e l'ho usato topper quello. Ma, a quanto pare, segnala che nessun processo utilizza la mia RAM. L'unico processo nella mia parte superiore è MySQL, ma utilizza lo 0,1% di RAM e 400 Mb di swap. Stessa immagine quando provo ad eseguire altri servizi o applicazioni - tutti vanno in swap, topmostra che MEM non viene utilizzato (0,1% massimo per qualsiasi processo).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Il riavvio non aiuta e, a loro modo, è molto lento, cosa che normalmente non mi aspetto su questa macchina (4 core, 4 GB di RAM, RAID1).

Quindi, con quello - Sono abbastanza sicuro che questa non è una cache del disco, che sta usando la RAM, perché normalmente avrebbe dovuto essere ridotta e lasciare che altri processi usassero la RAM, piuttosto che passare allo scambio.

Quindi, alla fine, la domanda è: se qualcuno ha qualche idea su come scoprire quale processo sta effettivamente utilizzando la memoria così pesantemente?


1
Hai mai trovato la risposta a questo?
Hackeron,

@Hackeron: OP ha accettato questa risposta . So che la risposta non risponde alla tua domanda , però. Sono stato in grado di riprodurre il tuo problema su uno dei miei server e attualmente sto cercando un modo per risolverlo.
Deltik,

@Deltik Ah, ok. Grazie :) - Qui ho 2 server che perdono tutta la memoria disponibile nell'arco di circa 12 ore, fammi sapere se c'è qualcosa che posso fare per aiutare a diagnosticare questo. Sono raggiungibile come soprannome "hackeron" su IRC (irc.freenode.org).
Hackeron,

@Hackeron: non sono riuscito a trovarti come "hackeron" su irc.freenode.org. Ho creato una chat room per una discussione estesa qui .
Deltik,

Vale la pena notare che la cache ARC (e / o L2ARC) ZFS in-memory non viene visualizzata free -m, ma è possibile interrogarne la dimensione su Linux con cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Risposte:


112

Su Linux nel topprocesso è possibile premere il <tasto per spostare l'output di visualizzazione a sinistra. Per impostazione predefinita, viene ordinato per, %CPUquindi se si preme il tasto 4 volte lo si ordina in base VIRTalla dimensione della memoria virtuale che fornisce la risposta.

Un altro modo per farlo è:

ps -e -o pid,vsz,comm= | sort -n -k 2

dovrebbe darti e output ordinati per dimensione virtuale dei processi.

Ecco la versione lunga:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

Questo mi dà Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlsul server Ubuntu 11.10.
Der Hochstapler,

1
@OliverSalzburg Il problema sono le -oopzioni. RHEL4 funziona. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2funziona. Proverò più tardi l'11.10 stasera ma se trovi le giuste opzioni di ordinamento prima per favore fammi sapere. ps -e -o pid,vsz,comm | sort -n -k 2potrebbe funzionare ma al momento non ho un posto da verificare.
Karlson

2
Non ho molta familiarità con l' -efopzione. Ma questo sembra produrre un risultato ragionevole:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler

1
Ty, mi piace il massimo suggerimento di <non sapere che fosse possibile, fedora
SSH Questo

2
Versione leggermente modificata per ottenere i processi che occupano la RAM e mostra il comando completo:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

72

Mostra la memoria dei processi in megabyte e il percorso del processo.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
Benvenuto in Super User. Puoi espandere la tua risposta per spiegare cosa fa questo codice e come risolve il problema? Il codice inspiegabile è scoraggiato , perché non insegna la soluzione. Grazie.
Fixer 1234

9
Sono sorpreso che questa risposta sia stata sottoposta a downgrade e abbia un commento che chiede di spiegarlo .. è abbastanza breve che dovrebbe essere chiaro ciò che fa (pipe ps aux in awk e quindi ordinare), e nel contesto della domanda, mostra quali processi utilizzano più RAM. Penso che sia una buona risposta.
Giovanni,

14

Solo una nota a margine su un server che mostra gli stessi sintomi ma mostra ancora esaurimento della memoria. Ciò che alla fine è stato scoperto è stato un sysctl.conf da una scatola con 32 GB di RAM e configurazione per un DB con enormi pagine configurate a 12000. Questa scatola ha solo 2 GB di RAM, quindi stava assegnando tutta la RAM libera alle enormi pagine (solo 960 di loro). L'impostazione di enormi pagine su 10, dato che nessuna era utilizzata, liberò tutta la memoria.

Un rapido controllo di / proc / meminfo per cercare le impostazioni di HugePages_ può essere un buon inizio per la risoluzione dei problemi di almeno un maiale di memoria imprevisto.


2
Di recente ho avuto un altro server in cui questo era il problema. Se la tua organizzazione ha dipendenti ex Oracle, questa impostazione potrebbe essere il tuo colpevole.
campi

5

Nel mio caso il problema era che il server era un server virtuale VMware con il vmw_balloonmodulo abilitato:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

In esecuzione:

$ vmware-toolbox-cmd stat balloon
5189 MB

Quindi circa 5 GB di memoria sono stati infatti recuperati dall'host. Quindi, nonostante abbia 8 GB sulla mia VM "ufficialmente", in pratica era molto meno:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

Puoi anche usare il comando ps per ottenere maggiori informazioni sul processo.

ps aux | less

Per curiosità, qual è il modo corretto di sfuggire a questo comando? Mostra END ocne che raggiungo l'ultima riga, non uccide il processo quando lo premo Ctrl + C.
KingsInnerSoul,

1
@KingsInnerSoul premi 'q'
enobayram il

2

Mi riferisco a questa e alla memoria totale utilizzata dal processo Python? - Stack Overflow , questa è la mia risposta. Ora ho uno strumento di conteggio di processi specifici (python).

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Allega la mia lista dei processi.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Riferimento


1

Crea uno script chiamato show-memory-usage.shcon il contenuto:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
Perché? Cosa fa questo? Come funziona? Non dire alle persone di eseguire codice casuale; spiegare il suo scopo e come funziona.
un CVn

2
Figura Spiegherò il codice per coloro che non capiscono in quanto sembra essere sicuro da eseguire, ma il downvote potrebbe allontanare quelli per cui sarebbe utile. Sta eseguendo lo stesso comando delle risposte sopra , ma sta aggiungendo la formattazione con AWK. Non ho eseguito personalmente lo script perché non ne ho bisogno, ma spiegarlo aiuta chi ha bisogno di una formattazione.
Dooley_labs,

1
Ho letto il codice ed eseguito. Allinea i campi come una tabella e formatta la memoria residente consumata con i prefissi (come 1,12 GB, 582,79 MB).
Stéphane Gourichon,

0

Questo prende anche l'id del processo, ordina per MB usato e delinea il comando (che ha creato il processo):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

Il mio server ubuntu DISTRIB RELEASE = 18.04 su Hyper-V utilizzava la maggior parte della memoria, ma tutti i processi andavano bene. (Ho ammesso di aver rimosso i pacchetti snapd e unattended-upgr, ma il 95% della memoria era ancora utilizzato.)

La risposta è che Hyper-V ha una memoria dinamica, quindi ha impiegato memoria per l'uso del sistema principale e ubuntu l'ha contrassegnata come utilizzata.

Spero che aiuti qualcuno.

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.