Linux: cari tahu proses apa yang menggunakan semua RAM?

127

Sebelum benar-benar bertanya, hanya untuk menjadi jelas: ya, saya tahu tentang cache disk, dan tidak, ini bukan kasus saya :) Maaf, untuk pembukaan ini :)

Saya menggunakan CentOS 5. Setiap aplikasi dalam sistem bertukar berat, dan sistem ini sangat lambat. Ketika saya melakukannya free -m, inilah yang saya dapat:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Jadi, saya sebenarnya hanya memiliki 42 Mb untuk digunakan! Sejauh yang saya mengerti, -/+ buffers/cachesebenarnya tidak menghitung cache disk, jadi saya memang hanya memiliki 42 Mb, kan? Saya pikir, saya mungkin salah, jadi saya mencoba mematikan caching disk dan itu tidak berpengaruh - gambarnya tetap sama.

Jadi, saya memutuskan untuk mencari tahu siapa yang menggunakan semua RAM saya, dan saya menggunakannya topuntuk itu. Tapi, ternyata, ini melaporkan bahwa tidak ada proses yang menggunakan RAM saya. Satu-satunya proses di atas saya adalah MySQL, tetapi menggunakan 0,1% dari RAM dan 400Mb swap. Gambar yang sama ketika saya mencoba menjalankan layanan atau aplikasi lain - semuanya masuk swap, topmenunjukkan bahwa MEM tidak digunakan (maksimum 0,1% untuk proses apa pun).

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

Restart tidak membantu, dan, dengan cara mereka sangat lambat, yang biasanya tidak saya harapkan pada mesin ini (4 core, 4Gb RAM, RAID1).

Jadi, dengan itu - saya cukup yakin bahwa ini bukan cache disk, yang menggunakan RAM, karena biasanya itu harus dikurangi dan membiarkan proses lain untuk menggunakan RAM, daripada beralih ke swap.

Jadi, akhirnya, pertanyaannya adalah - jika seseorang memiliki ide bagaimana mengetahui proses apa yang sebenarnya menggunakan memori begitu banyak?

Timur
sumber
1
Apakah Anda pernah menemukan jawabannya?
Hackeron
@ Hackon: OP menerima jawaban ini . Saya tahu jawaban itu tidak menjawab pertanyaan Anda . Saya dapat mereproduksi masalah Anda di salah satu server saya, dan saat ini saya sedang meneliti jika ada cara untuk memecahkan masalah itu.
Deltik
@Deltik Ah, ok. Terima kasih :) - Saya punya 2 server di sini yang membocorkan semua memori yang tersedia dalam waktu sekitar 12 jam, beri tahu saya jika ada yang bisa saya lakukan untuk membantu mendiagnosis ini. Saya dapat dihubungi sebagai nama panggilan "hackeron" di IRC (irc.freenode.org).
Hackeron
@ Hackon: Saya tidak dapat menemukan Anda sebagai "hackeron" di irc.freenode.org. Saya memang membuat ruang obrolan untuk diskusi panjang di sini .
Deltik
Perlu dicatat bahwa cache ARC dalam memori ZFS (dan / atau L2ARC) tidak muncul free -m, tetapi ukurannya dapat ditanyakan dengan Linux dengan cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Jawaban:

112

Di Linux dalam topproses Anda dapat menekan <tombol untuk menggeser jenis tampilan keluaran ke kiri. Secara default itu diurutkan oleh %CPUjadi jika Anda menekan tombol 4 kali Anda akan mengurutkannya dengan VIRTyang mana adalah ukuran memori virtual yang memberikan jawaban Anda.

Cara lain untuk melakukan ini adalah:

ps -e -o pid,vsz,comm= | sort -n -k 2

harus memberi Anda dan output diurutkan berdasarkan proses ukuran virtual.

Ini versi panjangnya:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
Karlson
sumber
Itu memberi saya Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmldi server Ubuntu 11.10.
Der Hochstapler
1
@OliverSalzburg Masalahnya adalah -oopsi. RHEL4 ini berfungsi. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2bekerja. Saya akan mencoba 11,10 nanti malam tetapi jika Anda menemukan opsi pengurutan yang tepat sebelum beri tahu saya. ps -e -o pid,vsz,comm | sort -n -k 2mungkin berfungsi tetapi saya tidak memiliki tempat untuk memverifikasi saat ini.
Karlson
2
Saya tidak begitu terbiasa dengan -efpilihan itu. Tetapi ini tampaknya menghasilkan keluaran yang masuk akal:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler
1
Ty, saya suka saran teratas dari <saya tidak tahu itu mungkin, fedora
SSH
2
Versi yang sedikit dimodifikasi untuk mendapatkan proses yang menempati RAM dan menunjukkan perintah lengkap:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs
71

Tampilkan memori proses dalam megabyte dan jalur proses.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n
notnull
sumber
8
Selamat datang di Pengguna Super. Bisakah Anda memperluas jawaban untuk menjelaskan apa yang dilakukan kode ini dan bagaimana mengatasi masalah? Kode yang tidak dapat dijelaskan tidak disarankan , karena tidak mengajarkan solusinya. Terima kasih.
fixer1234
9
Saya terkejut jawaban ini diturunkan dan memiliki komentar yang meminta untuk menjelaskannya .. cukup singkat sehingga harus jelas apa yang dilakukannya (pipa ps aux ke awk dan kemudian sortir), dan dalam konteks pertanyaan, ini menunjukkan proses mana yang paling banyak menggunakan RAM. Saya pikir itu jawaban yang bagus.
John
14

Hanya catatan di server yang menunjukkan gejala yang sama tetapi masih menunjukkan kehabisan memori. Yang akhirnya menemukan adalah sysctl.conf dari sebuah kotak dengan 32 GB RAM dan pengaturan untuk DB dengan halaman besar yang dikonfigurasikan ke 12000. Kotak ini hanya memiliki 2 GB RAM sehingga ia menetapkan semua RAM gratis ke halaman besar (hanya 960 dari mereka). Mengatur halaman besar menjadi 10, karena tidak ada yang digunakan, membebaskan semua memori.

Pemeriksaan cepat / proc / meminfo untuk mencari pengaturan HugePages_ bisa menjadi awal yang baik untuk memecahkan masalah setidaknya satu hog memori yang tidak terduga.

Death Rider
sumber
2
Saya baru-baru ini memiliki server lain di mana ini masalahnya. Jika organisasi Anda memiliki mantan karyawan Oracle di dalamnya, pengaturan ini mungkin menjadi penyebab Anda.
bidang
5

Dalam kasus saya masalahnya adalah bahwa server adalah server virtual VMware dengan vmw_balloonmodul diaktifkan:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Berlari:

$ vmware-toolbox-cmd stat balloon
5189 MB

Jadi sekitar 5 GB memori sebenarnya direklamasi oleh tuan rumah. Jadi meskipun memiliki 8 GB untuk VM saya "secara resmi", dalam praktiknya itu jauh lebih sedikit:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816
Mitar
sumber
2

Anda juga dapat menggunakan perintah ps untuk mendapatkan informasi lebih lanjut tentang proses.

ps aux | less
Atul
sumber
Karena penasaran, apa cara yang benar untuk melarikan diri dari perintah ini? Ini menunjukkan AKHIR ocne saya mencapai baris terakhir, itu tidak membunuh proses ketika saya Ctrl + C itu.
KingsInnerSoul
1
@KingsInnerSoul tekan 'q'
enobayram
2

Saya mereferensikan ini dan Total memori yang digunakan oleh proses Python? - Stack Overflow , itu jawaban saya. Saya mendapatkan alat hitung proses (python) tertentu, sekarang.

# 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

Lampirkan daftar proses saya.

$ 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

Referensi

Chu-Saing Lai
sumber
1

Buat skrip bernama show-memory-usage.shdengan konten:

#!/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") }
 '
Felipe
sumber
6
Mengapa? Apa fungsinya? Bagaimana cara kerjanya? Jangan bilang orang untuk menjalankan kode acak; jelaskan tujuannya dan cara kerjanya.
CVn
2
Gambar Saya akan menjelaskan kode untuk mereka yang tidak mengerti karena tampaknya aman untuk dijalankan, tetapi downvote dapat menangkal mereka akan berguna. Ini menjalankan perintah yang sama dengan jawaban di atas , tetapi menambahkan pemformatan dengan AWK. Saya pribadi tidak menjalankan skrip karena saya tidak menggunakannya, tetapi menjelaskannya membantu mereka yang membutuhkan pemformatan.
Dooley_labs
1
Saya sudah membaca kode dan menjalankannya. Ini menyelaraskan bidang seperti tabel, dan format memakan memori penduduk dengan awalan (seperti 1,12 GB, 582,79 MB).
Stéphane Gourichon
0

Ini juga mengambil id proses, mengurutkan berdasarkan MB yang digunakan, dan menguraikan perintah (yang menciptakan proses):

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

prosti
sumber
0

Server ubuntu saya DISTRIB RELEASE = 18,04 di Hyper-V menggunakan sebagian besar memori, tetapi semua proses baik-baik saja. (Diakui saya telah menghapus paket snapd dan unattended-upgrade, tetapi 95% memori masih digunakan.)

Jawabannya adalah Hyper-V memiliki memori dinamis, jadi butuh memori untuk penggunaan sistem utama dan ubuntu menandainya seperti yang digunakan.

Semoga ini bisa membantu seseorang.

Vodyanikov Andrew Anatolevich
sumber