2012-03-09 14:13:35 +0000 2012-03-09 14:13:35 +0000
131
131

Linux: scoprire quale processo sta usando tutta la RAM?

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

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

total used free shared buffers cached
Mem: 3952 3929 22 0 1 18
-/+ buffers/cache: 3909 42
Swap: 16383 46 16337
``` ```
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

Quindi, in realtà ho solo 42 Mb da usare! Per quanto ho capito, -/+ buffers/cache in realtà non conta la cache del disco, quindi in realtà ho solo 42 Mb, giusto? Ho pensato, potrei sbagliarmi, così ho provato a spegnere la 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 ho usato top per questo. Ma, a quanto pare, riporta che nessun processo sta usando la mia RAM. L'unico processo nel mio top è MySQL, ma sta usando lo 0,1% della RAM e 400Mb di swap. Stessa immagine quando cerco di eseguire altri servizi o applicazioni - tutti vanno in swap, top mostra che il MEM non viene usato (0,1% massimo per qualsiasi processo).

&001 &001

Restart non aiuta, e, per inciso, è molto lento, cosa che normalmente non mi aspetterei su questa macchina (4 core, 4Gb di RAM, RAID1).

Quindi, con questo - sono abbastanza sicuro che questa non è una cache del disco, chi sta usando la RAM, perché normalmente avrebbe dovuto essere ridotta e lasciare che altri processi usassero la RAM, piuttosto che andare in swap.

Quindi, infine, la domanda è - se qualcuno ha qualche idea su come scoprire quale processo sta effettivamente usando la memoria in modo così pesante?

回答 (9)

115
115
115
2012-03-09 14:25:01 +0000

Su Linux nel processo top è possibile premere il tasto < per spostare l'ordinamento del display di uscita a sinistra. Per impostazione predefinita è ordinato per il %CPU quindi se si preme il tasto 4 volte lo si ordina per VIRT che è la dimensione della memoria virtuale che vi dà la risposta.

Un altro modo per farlo è:

ps -e -o pid,vsz,comm= | sort -n -k 2
``` ```
ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

dovrebbe dare e l'uscita ordinata per processi di dimensione virtuale.

Ecco la versione lunga:

&001

78
78
78
2016-02-09 21:12:26 +0000

Mostra la memoria di processo in megabyte e il percorso del processo.

ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n
14
14
14
2012-10-15 15:05:01 +0000

Solo una nota a margine su un server che mostra gli stessi sintomi ma che mostra ancora un esaurimento della memoria. Quello che alla fine si è trovato è stato un sysctl.conf da un box con 32 GB di RAM e il setup per un DB con enormi pagine configurato a 12000. Questo box ha solo 2 GB di RAM e quindi assegnava tutta la RAM libera alle pagine enormi (solo 960). Impostando le pagine enormi a 10, dato che non ne veniva usata nessuna, si liberava 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 inaspettato.

5
5
5
2018-03-31 03:38:27 +0000

Nel mio caso il problema era che il server era un server virtuale VMware con modulo vmw_balloon 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
``` ```
$ free
              total used free shared buff/cache available
Mem: 8174716 5609592 53200 27480 2511924 2458432
Swap: 8386556 6740 8379816

Quindi circa 5 GB di memoria sono stati in realtà recuperati dall'host. Quindi, pur avendo 8 GB alla mia VM “ufficialmente”, in pratica era molto meno:

&001

2
2
2
2013-07-08 06:05:54 +0000

È anche possibile utilizzare il comando ps per ottenere maggiori informazioni sul processo.

ps aux | less
2
2
2
2016-10-21 10:51:37 +0000

Mi riferisco a questo e Memoria totale usata dal processo Python? - Stack Overflow , questa è la mia risposta. Ottengo uno specifico strumento di conteggio del processo (python), ora.

# 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
``` ```
$ 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

Allega la mia lista dei processi.

&001 &001

Reference

1
1
1
2016-03-14 20:50:46 +0000

Realizzare uno script chiamato show-memory-usage.sh con 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") }
 '
0
0
0
2019-07-12 19:46:37 +0000

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

La risposta è che Hyper-V ha memoria dinamica, quindi ha preso la memoria per l'uso principale del sistema e ubuntu l'ha segnalata come usata.

Spero che aiuti qualcuno.

0
0
0
2019-03-31 17:51:48 +0000

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

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