Come visualizzare i processi principali ordinati in base all'utilizzo effettivo della memoria?


240

Ho un server con 12G di memoria. Di seguito è mostrato un frammento di cima:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

Ciò free -mmostra quanto segue:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

Se ho capito bene, il sistema ha solo 362 MB di memoria disponibile. La mia domanda è: come posso sapere quale processo sta consumando la maggior parte della memoria?

Proprio come le informazioni di sfondo, il sistema è in esecuzione 64bit OpenSuse 12.


Risposte:


280

Per prima cosa, ripeti questo mantra per un po ': "la memoria inutilizzata è memoria sprecata". Il kernel di Linux conserva enormi quantità di metadati e file richiesti, fino a quando qualcosa che sembra più importante non espelle tali dati. È per questo che puoi eseguire:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

e far findeseguire la seconda istanza a velocità ridicola.

Linux lascia solo un po 'di memoria "libera" per gestire picchi nell'uso della memoria senza troppi sforzi.

Secondo, vuoi trovare i processi che stanno mangiando tutta la tua memoria; in topuso il Mcomando per ordinare in base all'uso della memoria. Sentiti libero di ignorare la VIRTcolonna, che ti dice solo quanta memoria virtuale è stata allocata, non quanta memoria sta usando il processo. RESriporta quanta memoria è residente , o attualmente in ram (al contrario di scambiata su disco o mai effettivamente allocata, nonostante sia stata richiesta).

Ma, poiché RESconterà ad esempio la /lib/libc.so.6memoria una volta per quasi ogni processo, non è esattamente una misura impressionante di quanta memoria sta utilizzando un processo. La SHRcolonna riporta quanta memoria è condivisa con altri processi, ma non vi è alcuna garanzia che un altro processo stia effettivamente condividendo: potrebbe essere condivisibile, ma nessun altro vuole condividere.

Lo smemstrumento è progettato per aiutare gli utenti a valutare meglio quanta memoria dovrebbe davvero essere incolpata di ogni singolo processo. Fa un lavoro intelligente per capire ciò che è veramente unico, ciò che è condiviso e raccoglie proporzionalmente la memoria condivisa ai processi che la condividono. smempuò aiutarti a capire dove la tua memoria sta andando meglio della topvolontà, ma topè un eccellente primo strumento.


Quindi se solo la statistica della colonna "libera" diminuisce, top mostra nient'altro di diverso, possiamo concludere che la memoria è allocata dal kernel di Linux per archiviare le cose dei file e daremo la memoria ad altri processi quando nessary?
Al2O3,

@ Ruby, probabilmente è vero; i file /proc/meminfoe /proc/slabinfodescrivono in dettaglio a cosa serve il kernel per l'archiviazione - il slabtopprogramma è molto simile top, ma mostra a quale degli allocatori di lastre è stato assegnato quanto, quali sono i loro rapporti, ecc.
sarnold

Grazie per il suggerimento su 'smem': voglio che Linux "sprechi" un po 'di RAM in modo che la mia macchina possa funzionare velocemente. Se "trovare" impiega un po 'più di tempo in un secondo passaggio, va bene. Un mouse bloccato e finestre bloccate mentre Linux decide quale RAM (che ha inutilmente bloccato), deve essere cancellata e riassegnata a ciò che sto facendo ADESSO - o addirittura scambia su disco - non è un'opzione. Ho 16 GB di RAM su questa scatola e mi aspetto che diversi GB siano liberi e disponibili per le applicazioni in esecuzione.
JosephK,

@JosephK, lo spostamento di un mouse ha più a che fare con la pianificazione delle priorità e degli algoritmi; se le allocazioni di memoria sono necessarie per spostare un puntatore del mouse, allora c'è qualcosa che non va nel software che stai utilizzando. :)
sarnold,

2
@JosephK In realtà, il kernel impiega meno tempo a riutilizzare la memoria da un uso a un altro piuttosto che a mettere la memoria libera in uso. Uno richiede l'accesso e la modifica dell'elenco gratuito, l'altro no. Sfortunatamente, questa è una domanda XY. Il problema ha a che fare con le prestazioni e potrebbe non essere completamente correlato al consumo di memoria (nonostante l'evidenza che rendere più libera la memoria sia di aiuto, ciò potrebbe essere per ragioni più complesse rispetto ai sospetti di OP) ma invece hanno chiesto di analizzare l'utilizzo della memoria. Ciò ottiene risposte meno utili rispetto alla domanda sul problema reale.
David Schwartz,

321

usa il suggerimento rapido usando il comando top in linux / unix

$ top

e poi premi Shift+ m(cioè scrivi una maiuscola M).

A partire dal man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

In alternativa: premi Shift+ f, quindi scegli il display da ordinare in base all'uso della memoria premendo il tasto, nquindi premi Enter. Vedrai il processo attivo ordinato in base all'utilizzo della memoria


71
Oppure puoi semplicemente premere M( Shift+ m)
Patryk il

8
@risnandar c'è un modo per mostrare la memoria in MB e non in%
codecowboy,

2
ciao codecowboy, forse puoi guardare commandlinefu.com/commands/view/3/… per una memoria più dettagliata usata nel mio server sto usando un'app di terze parti come newrelic.com
risnandar

6
o semplicemente top -o mem -O cpu
skipy,

Su Ubuntu 16 avevo bisogno top -o RESaltrimenti di "nome campo non riconosciuto" mem "
AdamS


28

Per prima cosa dovresti leggere una spiegazione sull'output difree . In conclusione: hai almeno 10,7 GB di memoria facilmente utilizzabile dai processi.

Quindi dovresti definire quale "utilizzo della memoria" è per un processo (non è facile o non ambiguo, fidati di me).

Quindi potremmo essere in grado di aiutare di più :-)


Da dove hai preso 10.7? Da buffer / cache [gratuito]? Grazie per il link, lo leggerò.
user3111525,

3
Sì. Il punto è che la maggior parte della memoria è utilizzata da buffer e cache. Questa memoria può essere "scaricata" immediatamente se un processo ha bisogno di più memoria. Quando sottrai la quantità di memoria utilizzata per i buffer / cache dalla quantità USATA o la aggiungi a quantità GRATUITA, ottieni i numeri sulla seconda riga, il che implica che solo 1,3 gig sono realmente utilizzati o, visti dall'altro angolo, hai 10,7 gig di memoria prontamente disponibile (dal momento che buffer e cache possono essere scaricati su richiesta).
stolsvik,

21

Elenca e ordina i processi in base all'utilizzo della memoria:

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

7
Oppure:ps -e -orss=,args= | sort -nr | head
Kenorb,

17

ps aux --sort '%mem'

dalla ps di procps (impostazione predefinita su Ubuntu 12.04) genera output come:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

Quindi qui Firefox è il consumatore principale con il 16% della mia memoria.

Potresti anche essere interessato a:

ps aux --sort '%cpu'

4

puoi specificare per quale colonna ordinare, con i seguenti passaggi:

passaggi:
* superiore
* MAIUSC + F
* seleziona una colonna dall'elenco
    ad es. n significa ordinare per memoria,
* premere Invio
* ok

1
Duplica della risposta di risnandar sopra.
benjaoming,

3

Puoi vedere l'utilizzo della memoria eseguendo questo codice nel tuo terminale:

$ watch -n2 free -m
$ htop

3

Come sommare la memoria utilizzata per nome processo:

A volte anche guardando i singoli processi più grandi c'è ancora molta memoria usata non considerata. Per verificare se ci sono molti stessi processi più piccoli che usano la memoria puoi usare un comando come il seguente che usa awk per riassumere la memoria totale usata dai processi con lo stesso nome:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

ad es. uscita

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

Questo secondo nel tempo

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

Aggiornamento continuo

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

Ho anche aggiunto alcune chicche qui che potresti apprezzare (o potresti ignorare)

-n 1 guarda e aggiorna ogni secondo

-U $(whoami)Per mostrare solo i tuoi processi. $ (alcuni comandi) valuta ora

| head -n4 Per mostrare solo l'intestazione e 3 processi alla volta bc spesso hai solo bisogno di elementi pubblicitari ad alto utilizzo

${1-4} dice il mio primo argomento $1 che desidero impostare come predefinito 4, a meno che non lo fornisca

Se stai utilizzando un Mac, potrebbe essere necessario installare watch first brew install watch

In alternativa puoi usare una funzione

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

E puoi facilmente ordinare per cpu se cambi -ma-r
jasonleonhard il

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.