Jak zobaczyć najlepsze procesy posortowane według faktycznego zużycia pamięci?

240

Mam serwer z 12G pamięci. Fragment góry pokazano poniżej:

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

Do free -mzawiera następujące informacje:

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

Jeśli dobrze rozumiem, system ma tylko 362 MB dostępnej pamięci. Moje pytanie brzmi: jak mogę dowiedzieć się, który proces pochłania większość pamięci?

Podobnie jak w tle, system działa 64bit OpenSuse 12.

użytkownik3111525
źródło

Odpowiedzi:

280

Najpierw powtórz tę mantrę przez chwilę: „niewykorzystana pamięć to zmarnowana pamięć”. Jądro Linux przechowuje ogromne ilości metadanych i żądanych plików, dopóki coś, co wydaje się ważniejsze, nie wypchnie tych danych. Dlatego możesz uruchomić:

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

a druga findinstancja będzie działać z absurdalną prędkością.

Linux pozostawia tylko trochę wolnej pamięci, aby bez większego wysiłku poradzić sobie ze skokami zużycia pamięci.

Po drugie, chcesz znaleźć procesy, które pochłaniają całą twoją pamięć; w topużyciu Mpolecenia do sortowania według użycia pamięci. Możesz zignorować VIRTkolumnę, która po prostu mówi, ile pamięci wirtualnej zostało przydzielone, a nie ile pamięci zajmuje proces. RESinformuje o tym, ile pamięci jest rezydentne lub aktualnie znajduje się w pamięci RAM (w przeciwieństwie do zamiany na dysk lub nigdy tak naprawdę nie przydzielone, pomimo prośby).

Ale ponieważ RESbędzie liczyć np /lib/libc.so.6pamięć raz dla prawie każdego procesu, to nie jest dokładnie to niesamowite miarą ile pamięci proces jest używany. Te SHRraporty kolumn, ile pamięci jest dzielona z innymi procesami, ale nie ma gwarancji, że inny proces jest faktycznie dzielenie - może to być udostępnianych, tylko nikt inny nie chce się dzielić.

smemNarzędzie jest przeznaczone dla użytkowników pomagają lepiej Gage właśnie ile pamięci powinien naprawdę być obwiniać każdego procesu. Wykonuje sprytną pracę, aby dowiedzieć się, co jest naprawdę wyjątkowe, co jest udostępniane, i proporcjonalnie dostosowuje pamięć dzieloną do procesów, które ją współużytkują. smemmoże pomóc ci zrozumieć, gdzie twoja pamięć idzie lepiej niż topbędzie, ale topjest doskonałym pierwszym narzędziem.

Sarnold
źródło
Więc jeśli spadnie tylko „wolna” statystyka kolumn, u góry nie ma nic innego, możemy stwierdzić, że jądro Linuksa przydziela pamięć do przechowywania plików i przekaże pamięć innym procesom, gdy będzie to konieczne?
Al2O3,
@ Rubby, to prawdopodobnie prawda; /proc/meminfoi /proc/slabinfopliki szczegół co jądro używa przechowywanie - w slabtopprogramie jest bardzo podobny top, ale pokazuje, które z podzielników płyt przeznaczyły ile, jakie są ich stosunki są podobne, itd.
sarnold
Dzięki za wskazówkę dotyczącą „smem” - chcę, aby Linux „zmarnował” trochę pamięci RAM, aby moja maszyna mogła działać szybko. Jeśli „znalezienie” zajmuje trochę dłużej przy drugim przejściu, jest w porządku. Zablokowana mysz i zamrożone okna, podczas gdy Linux decyduje, która pamięć RAM (którą niepotrzebnie zablokował), musi zostać wyczyszczona i ponownie przydzielona do tego, co robię TERAZ - a nawet zamiany na dysk - nie jest opcją. Mam 16 GB pamięci RAM w tym pudełku i spodziewam się, że kilka GB będzie wolnych i dostępnych dla działających aplikacji.
JosephK
@JosephK, poruszanie myszą ma więcej wspólnego z priorytetami i algorytmami planowania; jeśli do przesunięcia wskaźnika myszy konieczne są przydziały pamięci, oznacza to, że coś jest nie tak z używanym oprogramowaniem. :)
sarnold
2
@JosephK W rzeczywistości jądro potrzebuje mniej czasu na zmianę przeznaczenia pamięci z jednego użycia na drugi, niż na wykorzystanie wolnej pamięci. Jeden wymaga dostępu i modyfikacji darmowej listy, drugi nie. Niestety jest to pytanie XY. Problem dotyczy wydajności i może być całkowicie niezwiązany ze zużyciem pamięci (pomimo dowodów, że zwolnienie większej ilości pamięci pomaga, to może być z bardziej złożonych powodów niż podejrzewa OP), ale zamiast tego poprosili o analizę wykorzystania pamięci. To daje mniej przydatne odpowiedzi niż pytanie o rzeczywisty problem.
David Schwartz
321

użyj szybkiej porady za pomocą polecenia top w systemie Linux / UNIX

$ top

a następnie naciśnij Shift+ m(tj. napisz kapitał M).

Z 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

Lub alternatywnie: naciśnij Shift+ f, następnie wybierz wyświetlacz do uporządkowania według zużycia pamięci, naciskając klawisz, na następnie naciśnij Enter. Zobaczysz aktywny proces uporządkowany według zużycia pamięci

risnandar
źródło
71
Lub możesz po prostu nacisnąć M( Shift+ m)
Patryk
8
@risnandar to sposób na pokazanie pamięci w MB, a nie%
codecowboy
2
hi codecowboy, być może można spojrzeć na commandlinefu.com/commands/view/3/... dla bardziej szczegółowej pamięci używanej w moim serwerze używam aplikacji firm trzecich jak newrelic.com
risnandar
6
lub po prostu top -o mem -O cpu
skipy
W systemie Ubuntu 16 potrzebowałem top -o RESinaczej „nierozpoznanej nazwy pola„ mem ””
AdamS
37
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(Dodanie -n flagi numerycznej do polecenia sortowania.)

Angelinux
źródło
3
Rozważ także, ps aux --sort '%mem'jak wyjaśniono w mojej odpowiedzi
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
28

Najpierw powinieneś przeczytać wyjaśnienie na wyjściufree . Podsumowując: masz co najmniej 10,7 GB pamięci, z której mogą łatwo korzystać procesy.

Następnie powinieneś zdefiniować, jakie jest „użycie pamięci” dla procesu (nie jest to łatwe ani jednoznaczne, zaufaj mi).

Wtedy moglibyśmy pomóc więcej :-)

thkala
źródło
Skąd masz 10,7? Z buforów / pamięci podręcznej [bezpłatnie]? Dzięki za link, przeczytam go.
user3111525 26.01.11
3
Tak. Chodzi o to, że większość pamięci jest wykorzystywana przez bufory i pamięć podręczną. Tę pamięć można natychmiast „zrzucić”, jeśli jakikolwiek proces potrzebuje więcej pamięci. Gdy odejmiesz ilość pamięci używanej do buforowania / pamięci podręcznej od ilości UŻYWANEJ lub dodasz ją do DARMOWEJ liczby, otrzymasz liczby w drugim wierszu, co oznacza, że tak naprawdę używany jest tylko gigabajt 1.3 , lub widziany z drugiej kąt, masz 10,7 gig łatwo dostępnej pamięci (ponieważ bufory i pamięć podręczna mogą być na żądanie zrzucane na bieżąco).
Stolsvik
21

Lista i sortowanie procesów według zużycia pamięci:

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
Tomir Schmite Jr.
źródło
7
Lub:ps -e -orss=,args= | sort -nr | head
kenorb
17

ps aux --sort '%mem'

z ps procps (domyślnie w Ubuntu 12.04) generuje dane wyjściowe takie jak:

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

Więc tutaj Firefox jest największym konsumentem z 16% mojej pamięci.

Możesz być zainteresowanym także tym:

ps aux --sort '%cpu'
Ciro Santilli
źródło
4

możesz określić, według której kolumny chcesz posortować, wykonując następujące czynności:

kroki:
* Top
* Shift + F.
* wybierz kolumnę z listy
    np. n oznacza sortowanie według pamięci,
* naciśnij enter
* dobrze
Eric Wang
źródło
1
Duplikat powyższej odpowiedzi risnandara.
benjaoming
3

Możesz zobaczyć użycie pamięci, wykonując ten kod w swoim terminalu:

$ watch -n2 free -m
$ htop
Cubiczx
źródło
3

Jak zsumować wykorzystaną pamięć według nazwy procesu:

Czasami nawet patrząc na największe pojedyncze procesy, wciąż jest wiele niewykorzystanej pamięci. Aby sprawdzić, czy istnieje wiele takich samych mniejszych procesów korzystających z pamięci, możesz użyć polecenia takiego jak poniżej, które używa awk do zsumowania całkowitej pamięci używanej przez procesy o tej samej nazwie:

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

np. wyjście

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
gaoithe
źródło
0

To bardzo drugi raz

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

Ciągłe aktualizowanie

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

Dodałem także kilka gadżetów, które możesz docenić (lub możesz zignorować)

-n 1 oglądaj i aktualizuj co sekundę

-U $(whoami)Aby pokazać tylko swoje procesy. $ (niektóre polecenia) ocenia teraz

| head -n4 Aby wyświetlać tylko nagłówek i 3 procesy jednocześnie, często potrzebujesz tylko elementów zamówienia o wysokim zużyciu

${1-4}mówi mój pierwszy argument $1Chcę ustawić domyślnie na 4, chyba że go podam

Jeśli używasz komputera Mac, może być konieczne najpierw zainstalowanie zegarka

brew install watch 

Alternatywnie możesz użyć funkcji

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}
jasonleonhard
źródło
I możesz łatwo sortować według procesora, jeśli zmienisz -mna-r
jasonleonhard
-1

Masz to proste polecenie:

$ free -h
Christian IC
źródło