Bagaimana cara melihat proses teratas diurutkan berdasarkan penggunaan memori aktual?


240

Saya memiliki server dengan memori 12G. Sebuah fragmen atas ditunjukkan di bawah ini:

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

Ini free -mmenunjukkan sebagai berikut:

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

Jika saya mengerti dengan benar, sistem hanya memiliki 362 MB memori yang tersedia. Pertanyaan saya adalah: Bagaimana saya bisa mengetahui proses mana yang menghabiskan sebagian besar memori?

Sama seperti info latar belakang, sistem sedang berjalan 64bit OpenSuse 12.


Jawaban:


280

Pertama, ulangi mantra ini sebentar: "ingatan yang tidak terpakai adalah ingatan yang sia-sia". Kernel Linux menyimpan sekitar sejumlah besar metadata file dan file yang diminta, sampai sesuatu yang terlihat lebih penting mendorong data itu keluar. Itu sebabnya Anda dapat menjalankan:

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

dan memiliki findinstance kedua berjalan dengan kecepatan konyol.

Linux hanya menyisakan sedikit memori 'gratis' untuk menangani lonjakan penggunaan memori tanpa terlalu banyak usaha.

Kedua, Anda ingin menemukan proses yang memakan semua ingatan Anda; di topgunakan Mperintah untuk mengurutkan berdasarkan penggunaan memori. Jangan ragu untuk mengabaikan VIRTkolom, yang hanya memberi tahu Anda berapa banyak memori virtual yang telah dialokasikan, bukan berapa banyak memori yang digunakan proses. RESlaporan berapa banyak memori penduduk , atau saat di ram (sebagai lawan bertukar ke disk atau pernah benar-benar dialokasikan di tempat pertama, meskipun diminta).

Tapi, karena RESakan menghitung misalnya /lib/libc.so.6memori sekali untuk hampir setiap proses, itu bukan ukuran yang luar biasa dari berapa banyak memori yang digunakan proses. The SHRlaporan kolom berapa banyak memori yang dibagi dengan proses lainnya, tetapi tidak ada jaminan bahwa proses lain sebenarnya berbagi - itu bisa menjadi sharable, hanya ada satu keinginan lain untuk berbagi.

The smemAlat ini dirancang untuk pengukur bantuan pengguna yang lebih baik hanya berapa banyak memori harus benar-benar disalahkan pada setiap proses individu. Itu beberapa pekerjaan pintar untuk mencari tahu apa yang benar-benar unik, apa yang dibagikan, dan secara proporsional menghitung memori bersama dengan proses berbagi itu. smemmungkin membantu Anda memahami ke mana ingatan Anda lebih baik daripada topkehendak, tetapi topmerupakan alat pertama yang bagus.


Jadi jika hanya statistik kolom "bebas" turun, top tidak menunjukkan hal lain yang berbeda, kita dapat menyimpulkan bahwa memori dialokasikan oleh kernel linux untuk menyimpan hal-hal file dan akan memberikan memori ke proses lain ketika diperlukan?
Al2O3

@Rubby, itu mungkin benar; yang /proc/meminfodan /proc/slabinfofile rinci apa kernel menggunakan penyimpanan untuk - slabtopProgram ini sangat banyak seperti top, tapi menunjukkan yang mana dari penyalur slab telah mengalokasikan berapa banyak, apa yang rasio mereka seperti, dll
sarnold

Terima kasih atas tipnya pada 'smem' - Saya ingin Linux "membuang" beberapa RAM sehingga mesin saya dapat berjalan cepat. Jika 'find' membutuhkan waktu lebih lama pada pass kedua, tidak apa-apa. Jendela yang macet dan beku ketika Linux memutuskan RAM mana (yang tidak perlu disimpan), perlu dibersihkan dan dialokasikan kembali ke apa yang saya lakukan SEKARANG - atau bahkan swap ke disk - bukan pilihan. Saya memiliki 16 GB ram di kotak ini, dan saya berharap beberapa GB itu tetap gratis dan tersedia untuk menjalankan aplikasi.
JosephK

@ JosephephK, menggerakkan mouse lebih terkait dengan penjadwalan prioritas dan algoritma; jika alokasi memori diperlukan untuk memindahkan pointer mouse maka ada sesuatu yang salah dengan perangkat lunak yang Anda gunakan. :)
sarnold

2
@JosephK Sebenarnya kernel membutuhkan waktu lebih sedikit untuk menggunakan kembali memori dari satu penggunaan ke penggunaan lain daripada menggunakan memori bebas. Yang satu membutuhkan akses dan modifikasi daftar gratis, yang lain tidak. Sayangnya, ini adalah pertanyaan XY. Masalahnya ada hubungannya dengan kinerja dan mungkin sama sekali tidak terkait dengan konsumsi memori (meskipun ada bukti bahwa membuat lebih banyak memori bebas membantunya, yang mungkin karena alasan yang lebih kompleks daripada yang diduga OP) tetapi mereka bertanya tentang menganalisis penggunaan memori. Itu mendapat jawaban yang kurang berguna daripada bertanya tentang masalah yang sebenarnya.
David Schwartz

321

gunakan tip cepat menggunakan perintah top di linux / unix

$ top

dan kemudian tekan Shift+ m(yaitu menulis modal M).

Dari 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

Atau sebagai alternatif: tekan Shift+ f, lalu pilih tampilan untuk dipesan dengan penggunaan memori dengan menekan tombol nlalu tekan Enter. Anda akan melihat proses aktif yang dipesan oleh penggunaan memori


71
Atau Anda cukup menekan M( Shift+ m)
Patryk

8
@risnandar apakah ada cara untuk menunjukkan memori dalam MB dan bukan%
codecowboy

2
hai codecowboy, mungkin Anda dapat melihat commandlinefu.com/commands/view/3/… untuk memori yang lebih terperinci yang digunakan di server saya, saya menggunakan aplikasi pihak ketiga seperti newrelic.com
risnandar

6
atau hanya top -o mem -O cpu
cakap

Di Ubuntu 16 saya membutuhkan top -o RESsebaliknya "nama bidang 'mem' tidak dikenal"
AdamS


28

Pertama, Anda harus membaca penjelasan tentang output darifree . Intinya: Anda memiliki setidaknya 10,7 GB memori yang siap digunakan oleh proses.

Maka Anda harus mendefinisikan apa "penggunaan memori" untuk suatu proses (itu tidak mudah atau tidak ambigu, percayalah).

Maka kita mungkin dapat membantu lebih banyak :-)


Dari mana Anda mendapatkan 10,7? Dari buffer / cache [gratis]? Terima kasih untuk tautannya, saya akan membacanya.
user3111525

3
Iya. Intinya adalah bahwa sebagian besar memori digunakan oleh buffer dan cache. Memori ini dapat "dibuang" segera jika ada proses yang membutuhkan lebih banyak memori. Ketika Anda mengurangi jumlah memori yang digunakan untuk buffer / cache dari jumlah yang DIGUNAKAN, atau menambahkannya ke jumlah GRATIS, Anda mendapatkan angka di baris kedua, yang kemudian berarti bahwa hanya 1,3 pertunjukan benar - benar digunakan, atau, dilihat dari yang lain sudut, Anda memiliki memori 10,7 manggung tersedia (karena buffer dan cache dapat insta-dumped on demand).
stolsvik

21

Daftar dan Urutkan Proses berdasarkan Penggunaan Memori:

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

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

17

ps aux --sort '%mem'

from procps 'ps (default pada Ubuntu 12.04) menghasilkan output seperti:

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

Jadi di sini Firefox adalah konsumen teratas dengan 16% dari memori saya.

Anda mungkin juga tertarik dengan:

ps aux --sort '%cpu'

4

Anda dapat menentukan kolom mana yang akan disortir, dengan langkah-langkah berikut:

Langkah:
* atas
* shift + F
* pilih kolom dari daftar
    misalnya n berarti urutkan berdasarkan memori,
* tekan enter
* baik

1
Gandakan jawaban risnandar di atas.
benjaoming

3

Anda dapat melihat penggunaan memori dengan menjalankan kode ini di terminal Anda:

$ watch -n2 free -m
$ htop

3

Cara menjumlahkan memori yang digunakan berdasarkan nama proses:

Kadang-kadang bahkan melihat proses tunggal terbesar masih ada banyak memori yang digunakan tidak terhitung. Untuk memeriksa apakah ada banyak proses lebih kecil yang sama menggunakan memori, Anda dapat menggunakan perintah seperti berikut ini yang menggunakan awk untuk meringkas total memori yang digunakan oleh proses dengan nama yang sama:

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

misalnya keluaran

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

Ini kedua kalinya

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

Terus memperbarui

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

Saya juga menambahkan beberapa barang di sini yang mungkin Anda hargai (atau Anda mungkin abaikan)

-n 1 tonton dan perbarui setiap detik

-U $(whoami)Untuk hanya menampilkan proses Anda. $ (beberapa perintah) mengevaluasi sekarang

| head -n4 Untuk hanya menampilkan tajuk dan 3 proses pada satu waktu bc sering kali Anda hanya perlu item baris penggunaan tinggi

${1-4}mengatakan argumen pertama saya, $1saya ingin default ke 4, kecuali saya berikan

Jika Anda menggunakan mac, Anda mungkin perlu menginstal arloji terlebih dahulu, instal arloji

Atau Anda dapat menggunakan fungsi

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

Dan Anda dapat dengan mudah mengurutkan berdasarkan cpu jika Anda mengubahnya -mke-r
jasonleonhard

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.