En iyi işlemleri gerçek bellek kullanımına göre sıralanmış olarak nasıl görebilirim?


240

12G belleğe sahip bir sunucum var. Bir üst parça aşağıda gösterilmiştir:

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

free -mGösterileri şunlardır:

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

Doğru anlarsam, sistemin yalnızca 362 MB kullanılabilir belleği vardır. Sorum şu: Hangi işlemin belleğin çoğunu tükettiğini nasıl öğrenebilirim?

Tıpkı arka plan bilgisi gibi, sistem çalışıyor 64bit OpenSuse 12.


Yanıtlar:


280

İlk olarak, bu mantrayı bir süre daha tekrarlayın: "kullanılmayan bellek boşa harcanır". Linux çekirdeği, daha önemli görünen bir şey bu verileri dışarı çıkarana kadar istenen miktarda büyük miktarda meta meta verisi ve dosya tutar . Bu yüzden koşabilirsiniz:

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

ve ikinci findvakanın saçma bir hızda çalışmasını sağlayın.

Linux, bellek kullanımındaki ani artışları çok fazla çaba harcamadan halletmek için sadece biraz bellek 'boş' bırakır.

İkincisi, tüm hafızanızı yiyen süreçleri bulmak istiyorsunuz; içinde topkullanıma Mkomut hafıza kullanımı ile sıralamak için. VIRTİşlemin ne kadar bellek kullandığını değil, ne kadar sanal bellek tahsis edildiğini bildiren sütunu göz ardı etmekten çekinmeyin . RESkadar bellek nasıl raporları yerleşik (diske takas veya fiilen istenmesine rağmen ilk etapta ayrılan asla aksine) ram içinde veya şu anda.

Ancak, RESörneğin /lib/libc.so.6neredeyse her işlem için bir kez bellek sayacağından , bir işlemin ne kadar bellek kullandığının tam bir ölçüsü değildir. SHRSütun raporları ne kadar bellek olduğunu paylaştı diğer süreçlerle, ancak başka bir süreç aslında paylaşıyor hiçbir garantisi yoktur - bu paylaşılabilir olabilir paylaşımına sadece hiç kimse istediği.

smemAracı kadar bellek gerektiğini ne kadar yardım kullanıcıların daha iyi Gage için tasarlanmıştır gerçekten her süreçte mal edilemez. Neyin gerçekten benzersiz olduğunu, neyin paylaşıldığını bulmak için akıllıca bir iş yapar ve paylaşılan hafızayı paylaşan süreçlerle orantılı olarak hesaplar. smemhafızanızın nerede olduğundan daha iyi gittiğini anlamanıza yardımcı olabilir top, ancak topmükemmel bir ilk araçtır.


Yani sadece "serbest" sütun istatistiği düşerse, üstte başka hiçbir şey göstermezse, hafızanın dosya eşyalarını saklamak için linux çekirdeği tarafından tahsis edildiği ve nessary olduğunda hafızayı diğer işlemlere vereceği sonucuna varabilir miyiz?
Al2O3

@ Tombul, muhtemelen doğru; /proc/meminfove /proc/slabinfo- dosyalar için çekirdek depolama kullanarak hangi detay slabtopprogramı çok benziyor topvb bunların oranları gibi ne ne kadar tahsis etmişlerdir döşeme allocators ki, ama gösterileri,
sarnold

'Smem' üzerindeki ipucu için teşekkürler - Linux'un bazı RAM'leri "harcamasını" istiyorum, böylece makinem hızlı çalışabilir. Eğer 'find' 2. geçişte biraz daha uzun sürerse sorun olmaz. Linux sıkışmış bir fare ve donmuş pencereler, hangi RAM'in (gereksiz yere bağlandığını) kararlaştırırken, ŞİMDİ yaptığım şeye (veya diske takas ettiğim) temizlenmesi ve yeniden tahsis edilmesi gerektiğine karar verir. Bu kutuda 16 GB koç var ve bunun birkaç GB'ının ücretsiz olmasını ve çalışan uygulamalar için kullanılabilir olmasını bekliyorum.
JosephK

JosephK, bir fareyi hareket ettirmek zamanlama öncelikleri ve algoritmaları ile ilgisi vardır; bir fare işaretçisini hareket ettirmek için bellek ayırma işlemleri gerekiyorsa, kullandığınız yazılımda bir sorun var demektir. :)
sarnold

2
@JosephK Aslında, belleği bir kullanımdan diğerine yeniden kullanmak için boş belleği kullanıma açmaktan daha az zaman alır. Biri serbest listeye erişim ve değişiklik gerektirir, diğeri değildir. Ne yazık ki, bu bir XY sorusu. Sorun performansla ilgilidir ve bellek tüketimiyle tamamen ilgisiz olabilir (daha fazla bellek kullanmanın yardımcı olduğuna dair kanıtlara rağmen, bu OP şüphelilerinden daha karmaşık nedenlerle olabilir) ancak bunun yerine bellek kullanımını analiz etmeyi sordular. Bu, gerçek soruyu sormaktan daha az yararlı cevaplar alır.
David Schwartz

321

linux / unix'te top komutunu kullanarak hızlı ipucu kullanma

$ top

ve sonra Shift+ tuşuna basın m(yani büyük harf yazın M).

itibaren 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

Veya alternatif olarak: Shift+ tuşlarına basın f, ardından tuşa basarak hafızaya göre sipariş verilecek ekranı seçin ve tuşuna nbasın Enter. Bellek kullanımına göre sıralanmış etkin işlemi göreceksiniz


71
Veya sadece M( Shift+ m) tuşuna basabilirsiniz
Patryk

8
@risnandar% MB değil, MB olarak bellek göstermenin bir yolu var
codecowboy

2
merhaba codecowboy, belki de benim sunucuda kullanılan daha ayrıntılı bellek için commandlinefu.com/commands/view/3/… bakabilirsiniz ben newrelic.com
risnandar 13:01 14

6
or just top -o mem -O cpu
skipy

Ubuntu 16'da top -o RESaksi halde "tanınmayan alan adı" mem "e ihtiyacım vardı
AdamS


28

Önce çıktısıyla ilgili bir açıklamafree okumalısınız . Alt satır: İşlemler tarafından kolayca kullanılabilen en az 10,7 GB belleğiniz var.

O zaman bir işlem için "bellek kullanımı" nın ne olduğunu tanımlamalısınız (kolay veya açık değil, güven bana).

O zaman daha fazla yardım edebiliriz :-)


Nereden 10,7 aldın? Tamponlardan / önbellekten [ücretsiz]? Bağlantı için teşekkürler, okuyacağım.
user3111525

3
Evet. Önemli olan, belleğin çoğunun tamponlar ve önbellek tarafından kullanılmasıdır. Herhangi bir işlemin daha fazla belleğe ihtiyacı varsa bu bellek hemen "boşaltılabilir". Arabellekler / önbellek için kullanılan bellek miktarını KULLANILAN miktardan çıkardığınızda veya ÜCRETSİZ tutara eklediğinizde, ikinci satırdaki sayıları alırsınız, bu da yalnızca 1.3 gigin gerçekten kullanıldığını veya diğerinden göründüğünü gösterir açı olarak, 10.7 gig hazır belleğiniz vardır (çünkü arabellekler ve önbellek isteğe bağlı olarak boşaltılabilir).
stolsvik

21

İşlemleri Bellek Kullanımına Göre Listeleme ve Sıralama:

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

7
Veya:ps -e -orss=,args= | sort -nr | head
kenorb

17

ps aux --sort '%mem'

dan PROCPS' ps (Ubuntu 12.04 üzerinde varsayılan) çıkışı gibi oluşturur:

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

İşte Firefox, hafızamın% 16'sına sahip en büyük tüketici.

Ayrıca ilginizi çekebilir:

ps aux --sort '%cpu'

4

hangi sütuna göre sıralanacağını aşağıdaki adımlarla belirtebilirsiniz:

adımlar:
* üst
* üst karakter + F
* listeden bir sütun seçin
    örneğin n, belleğe göre sıralama,
* Enter tuşuna basın
* tamam

1
Yukarıdaki risnandar cevabının kopyası.
benjaoming

3

Terminalinizde bu kodu yürüterek bellek kullanımını görebilirsiniz:

$ watch -n2 free -m
$ htop

3

Kullanılmış belleği işlem adına göre toplama:

Bazen en büyük tek işlemlere bile bakılmadan hala kullanılan birçok bellek vardır. Belleği kullanarak aynı küçük işlemlerin çok fazla olup olmadığını kontrol etmek için, aynı addaki işlemler tarafından kullanılan toplam belleği toplamak için awk kullanan aşağıdaki gibi bir komut kullanabilirsiniz:

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

örneğin çıktı

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

Bu zamanın ikinci saniyesi

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

Sürekli güncelleme

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

Burada takdir edebileceğiniz (veya yok sayabileceğiniz) birkaç güzellik de ekledim

-n 1 her saniye izleyin ve güncelleyin

-U $(whoami)Sadece süreçlerinizi göstermek için. $ (some command) şimdi değerlendiriyor

| head -n4 Bir kerede yalnızca üstbilgi ve 3 işlemi göstermek için sık sık yüksek kullanım satır öğelerine ihtiyacınız vardır

${1-4}ilk argümanımı $1belirtmedikçe varsayılan olarak 4 istiyorum

Mac kullanıyorsanız ilk önce saat takmanız gerekebilir

brew install watch 

Alternatif olarak bir işlev de kullanabilirsiniz

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

Ve kolayca sıralama cpu tarafından değiştirebileceğiniz eğer -miçin-r
jasonleonhard

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.