Apa yang menggunakan memori Linux? Cache rendah, buffer rendah, bukan VM


11

Pertama-tama, ya, saya telah membaca LinuxAteMyRAM , yang tidak menjelaskan situasi saya.

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

Seperti yang ditunjukkan di atas, -/+ buffers/cache:garis menunjukkan bahwa tingkat memori yang digunakan sangat tinggi. Namun, dari output top, saya tidak melihat proses apa pun yang menggunakan lebih dari 100 MB memori.

Jadi, apa yang menggunakan memori?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

Ini adalah mesin x86_64 (bukan server merek umum) yang menjalankan x84_64 Linux, bukan wadah di mesin virtual. Kernel ( uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Isi dari /proc/meminfo:

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dfmelaporkan tidak ada konsumsi besar memori dari tmpfssistem file.


2
Apa output dari ps -eo pid,user,args,pmem --sort pmem?
Braiam

Tautan disisipkan di sini , mencoba beberapa waktu, mendapat hasil yang sama.
Jason

3
Jangan gunakan head! Saya ingin hasil lengkap dari perintah lengkap. Jika saya ingin Anda menggunakan headsaya akan memasukkannya ke dalam perintah saya. Tolong, selalu berikan output lengkap ke perintah yang diminta orang.
Braiam

3
Di telepon, jangan ingat sintaks di bagian atas kepala saya, tetapi periksa sysv shared memory. Perintahnya adalah ipcs, saya pikir.
derobert

5
Apakah Anda pernah menemukan solusi untuk ini? - Saya mengalami masalah serupa di sini: superuser.com/questions/793192/…
Hackeron

Jawaban:


4

Memori di Linux bisa menjadi binatang aneh untuk didiagnosis dan dipahami.

Dalam operasi normal kebanyakan, jika tidak semua, memori Anda akan dialokasikan untuk satu tugas atau lainnya. Beberapa akan dialokasikan untuk proses latar depan yang sedang berjalan. Beberapa akan menyimpan data yang di-cache dari disk. Beberapa akan menyimpan data yang terkait dengan proses yang tidak secara aktif dieksekusi pada saat tertentu dalam waktu tertentu.

Sebuah proses di Linux memiliki ruang alamat virtualnya sendiri (VIRT dalam output of top). Ini berisi semua data yang terkait dengan proses dan dapat dianggap seberapa "besar" prosesnya. Namun jarang untuk semua memori yang secara aktif menjadi bagian dari peta memori "nyata" (RES dalam output dari top). RES, atau memori penduduk, adalah data yang langsung dapat diakses dalam RAM pada titik waktu. Lalu ada juga shared memory (SHR) di atas itu. Itu dapat dibagi antara beberapa contoh dari proses yang sama. Jadi memori yang digunakan oleh suatu proses pada satu titik waktu RES ditambah SHR, tetapi jika ada lebih dari satu contoh proses menggunakan memori bersama penggunaannya adalah RES ditambah RES ditambah RES ... ditambah SHR.

Jadi mengapa perbedaan antara RES dan VIRT? Tentunya jika suatu proses memiliki blok memori yang dialokasikan itu dialokasikan memori, bukan? Tidak. Memori dialokasikan dalam halaman, dan halaman dapat aktif atau tidak aktif. Yang aktif adalah apa yang ada di RES. Tidak aktif adalah "sisanya". Mereka dapat didorong ke satu sisi karena mereka tidak sedang diakses saat ini. Itu berarti mereka dapat ditukar ke disk jika memori menjadi kencang. Tetapi mereka tidak langsung menuju disk. Pertama, mereka duduk di cache. Anda tidak ingin bertukar sepanjang waktu, jadi ada buffer antara aplikasi dan ruang swap. Buffer tersebut terus berubah karena swapper memilih proses yang berbeda untuk dijalankan dan halaman yang berbeda menjadi aktif dan tidak aktif. Dan semua itu terjadi dengan cara berpuasa untuk manusia biasa.

Dan di atas semua itu ada buffer disk. Tidak hanya memori yang tidak aktif masuk ke cache, tetapi ketika cache itu ditukar ke disk, pertama-tama pergi ke buffer disk untuk diantrekan untuk ditulis. Jadi itu adalah lapisan cache kedua. Dan buffer disk tersebut juga digunakan oleh bagian lain dari sistem untuk buffering IO umum. Jadi mereka terus berubah juga.

Jadi apa yang Anda lihat dalam hal-hal seperti topdan freelain-lain adalah snapshot instan dari kondisi mesin saat ini, atau statistik gabungan selama periode waktu tertentu. Pada saat Anda telah membaca data itu sudah ketinggalan zaman.

Setiap satu proses dapat mengakses sejumlah besar memori, tetapi jarang masuk akal untuk melakukannya. Lagipula itu tidak bisa mengakses semua memori sekaligus, jadi memori yang saat ini tidak dilihatnya dipindahkan ke cache kecuali ditandai secara khusus sebagai "terkunci pada inti".

Jadi jumlah memori yang "digunakan" oleh suatu aplikasi dan jumlah memori yang "dimiliki" adalah dua hal yang sangat berbeda. Sebagian besar ruang data aplikasi sebenarnya ada dalam cache, bukan di memori "inti", tetapi karena cache ada dalam RAM sebagian besar waktu itu langsung tersedia dan hanya perlu "mengaktifkan" untuk menjadi memori "inti". Itu kecuali itu telah ditukar ke disk, ketika itu kemudian perlu unswapping (yang mungkin cepat jika ada di buffer).

Karena sifat binatang buas yang berkecepatan tinggi dan fakta bahwa angka-angka selalu berubah, jumlahnya bahkan dapat berubah sebagian dengan menghitung apa mereka, sehingga tidak pernah mungkin untuk secara tepat mengatakan "ini adalah berapa banyak memori yang digunakan" dari perspektif pengguna. Meminfo adalah snapshot dalam waktu yang disediakan oleh kernel, tetapi karena itu kernel yang mengeksekusi maka itu tidak harus menunjukkan keadaan sebenarnya dari setiap proses penggunaan memori, karena tidak ada proses yang aktif dieksekusi pada waktu itu - itu antara proses.

Seperti yang saya katakan, itu semua sangat membingungkan.

Tetapi pada akhirnya itu tidak masalah. Yang penting bukanlah seberapa banyak memori yang Anda miliki "bebas", tetapi berapa banyak ruang swap yang telah Anda gunakan, dan seberapa sering ruang swap itu diakses. Bertukar yang memperlambat sistem, bukan kekurangan memori (meskipun kekurangan memori menyebabkan bertukar berlebihan). Jika Anda memiliki banyak memori yang digunakan, tetapi Anda tidak menggunakan ruang swap apa pun (atau sangat sedikit), maka semuanya normal. Memori bebas pada umumnya tidak diinginkan, dan seringkali murni bersifat transisi, karena digunakan untuk satu tujuan, tetapi belum dialokasikan untuk yang lain - misalnya memori cache, dan telah ditukar ke disk, tetapi belum digunakan untuk hal lain, atau itu adalah buffer disk, buffer telah dibilas ke disk, tetapi belum ada aplikasi yang meminta cache.


6
Ini sangat menarik tetapi tidak menjawab pertanyaan mengapa OP mengamati perbedaan khusus ini.
terdon

Saya pikir satu-satunya perbedaan nyata terletak antara harapan OP dan apa yang disediakan Linux. Yaitu, nilai yang diberikan Linux tidak bertambah, dan itu karena mereka sudah berubah.
Majenko

Karena OP tampaknya tidak benar-benar memahami pertanyaan yang dia tanyakan, saya tidak melihat bagaimana jawaban "benar" dapat dipilih. Kita dapat menjelaskan bagaimana sistem bekerja sampai wajah kita membiru, tetapi jika dia gagal memahami dasar-dasar itu dan menyadari bahwa pertanyaannya sebenarnya tidak ada artinya, kita tidak akan pernah memiliki jawaban yang "benar".
Majenko

Menghargai untuk menulis ini tetapi jujur ​​saya tidak suka nada agnostisisme di belakangnya. Saya setuju dengan teori "snapshot" tetapi jika snapshot terus memberikan nomor yang sama yang mengatakan penggunaan RAM tinggi sementara Anda tidak dapat mengetahui bagaimana hal itu terjadi, tidakkah Anda ingin tahu?
Jason

5
Anda harus memposting ini di blog Anda. Itu bagus, tetapi tidak relevan di sini. Ada sesuatu yang aneh terjadi (dan maksud saya aneh datang dari seseorang yang mengerti apa yang Anda tulis), karena VIRT proses tidak memperhitungkan semua penggunaan RAM, dan sistem tidak bertukar meskipun ada tekanan untuk melakukannya.
Gilles 'SANGAT berhenti menjadi jahat'

0

Ini adalah salah satu bagian dari jawabannya:

Ada perbedaan antara apa yang ditetapkan sebagai memori "Bekas" (dalam perintah "bebas") dan "Memori yang dialokasikan untuk proses (pengguna) aktif" (dalam / proc / meminfo). Oke, jadi sistem Anda memiliki total 48149 MB (sekitar 47Gb)

Jika Anda melihat / proc / meminfo Anda, Anda melihat: Tidak aktif: 17296272 kB = (sekitar 16,5 Gb) - Memori tidak aktif dapat berasal dari proses yang telah diakhiri. Ini juga bisa berupa memori yang sudah lama tidak digunakan oleh proses yang aktif. Memori tidak "dibebaskan" hanya karena prosesnya dihentikan. Mengapa? karena lebih banyak pekerjaan. Halaman memori yang sama mungkin digunakan lagi, jadi kernel linux hanya meninggalkan data yang ada di daftar "tidak aktif" sampai suatu proses membutuhkannya.

Halaman ini menjelaskan beberapa hal. http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization ; Baca bagian pada PFRA (algoritme reklamasi bingkai halaman) yang digunakan oleh kernel Linux: "Halaman yang termasuk dalam cache disk dan memori yang tidak dirujuk oleh proses apa pun harus direklamasi sebelum halaman yang termasuk ruang alamat Mode Pengguna dari proses" "Reklamasi" berarti memindahkannya dari "bekas" (tidak aktif + aktif) ke "bebas".

Ini menjelaskan Manajemen memori secara lebih rinci: Cara kerja daftar aktif dan tidak aktif, dan bagaimana halaman bergerak di antara mereka https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

Saya percaya bahwa ada juga memori yang digunakan oleh kernel untuk struktur data, dan ini muncul sebagai "slab 1049464 kb" (~ 1 GB) Saya percaya, tetapi saya tidak yakin bahwa ini dihitung secara terpisah.


Hanya ingin menambahkan bahwa di masa lalu saya memiliki pengalaman dengan sistem kehabisan memori karena aplikasi yang ditulis dengan buruk yang mengalokasikan segmen memori bersama, tetapi tidak melepaskannya. Segmen memori bersama bertahan bahkan ketika semua proses menggunakannya mati. Ini bukan Linux, tetapi mungkin juga benar di linux. seperti yang disebutkan di atas, lihat ipcs untuk info tentang ini. lihat makelinux.net/alp/035 Dikatakan bahwa Anda perlu secara eksplisit mengalokasikan memori bersama.
ssl

1
Saya tidak mengerti semua tentang jawaban Anda, tetapi "Memori tidak aktif bisa dari proses yang telah dihentikan" jelas salah. Memori Userland hadir dalam dua rasa: dipetakan atau anonim. Memori yang dipetakan selalu dapat direklamasi karena data dapat dimuat ulang dari file. Memori anonim dapat diambil kembali jika itu ditukar. Memori tidak aktif adalah memori yang merupakan kandidat yang baik untuk reklamasi; namun konten harus dalam file atau swap di suatu tempat, karena memori itu masih digunakan. Ketika suatu proses mati, memorinya menjadi bebas, dan tidak lagi diperhitungkan sebagai aktif + tidak aktif.
Gilles 'SANGAT berhenti menjadi jahat'

1
Beberapa referensi: Apa yang dapat menyebabkan peningkatan memori tidak aktif dan bagaimana cara memperolehnya kembali? pada Kesalahan Server; kiat-kiat lama namun sebagian besar masih berlaku dari Red Hat . Dan artikel oleh Bhavin Turakhia yang Anda kutip juga; itu tidak eksplisit tentang masalah ini, tetapi itu menjelaskan tentang halaman anonim dan dipetakan di bagian "Memahami PFRA".
Gilles 'SANGAT berhenti menjadi jahat'

Saya mendapatkan pemikiran tentang halaman tidak aktif yang tidak direferensikan oleh proses dari artikel ini: kernel.org/doc/gorman/html/understand/understand013.html Meskipun saya mengira itu bisa menjadi halaman yang dibebaskan oleh proses yang masih berjalan. bagian "Mengembalikan Halaman dari Daftar LRU"
ssl

Tapi mungkin itu hanya merujuk ke halaman di cache swap?
ssl

-2

Apakah Anda menggunakan NFS sama sekali?
Mungkin layak dijalankan slabtop -odengan cara apa pun, yang nfs_inode_cachebisa lepas kendali.


-4

Angka yang harus Anda lihat adalah swap yang digunakan , dalam output Anda yaitu "0" yang berarti bahwa Anda TIDAK kehabisan RAM. Selama sistem Anda tidak bertukar memori, Anda tidak perlu khawatir tentang angka-angka lain, yang sangat sulit untuk ditafsirkan.

Sunting: Oke, sepertinya jawaban saya dianggap lebih samar daripada ringkas. Jadi izinkan saya menguraikan.

Saya kira masalah utama di sini adalah dalam menafsirkan output top / ps, yang tidak terlalu akurat. Misalnya karena beberapa penggunaan perpustakaan bersama yang sama tidak dihitung seperti yang Anda harapkan, lihat misalnya http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html

Apa, bagaimanapun, mati akurat adalah bahwa jika ukuran swap tepat nol, dari sistem Anda tidak kehabisan memori (belum). Tentu saja, itu pernyataan yang sangat umum, tetapi untuk profiling sistem Anda penggunaan memori yang sebenarnya, atas tidak akan menjadi hal yang benar. (Dan jika Anda melihat di atas, setidaknya mengurutkan output untuk kebajikan atau% mem.)

Lihat juga http://elinux.org/Runtime_Memory_Measurement


1
Anda tidak perlu khawatir jika sistem Anda bertukar juga, itu normal. Anda harus khawatir jika sistem Anda bertukar terlalu sering (yang tidak sama dengan memiliki ruang swap yang besar digunakan). Fakta bahwa swap yang digunakan adalah 0 itu sendiri aneh, dengan sedikit memori fisik gratis.
Gilles 'SO- berhenti menjadi jahat'

baik, outputnya menunjukkan bahwa sistemnya tidak bertukar sama sekali. Itu pasti tingkat pertukaran optimal. Saya tidak mengatakan ukuran swap kecil adalah hal yang baik, tetapi ukuran nol pasti. Dan selama sistem tidak benar-benar kehabisan memori bebas, mengapa harus mulai bertukar?
Echsecutor

Tidak, tidak adanya swapping masih jauh dari optimal. Memori program yang tidak digunakan saat ini harus ditukar untuk memberikan ruang bagi cache disk untuk file yang sering digunakan. Adapun bit yang baru saja Anda tambahkan tentang output free, saya pikir Anda maksud top- tetapi bahkan kemudian jumlahnya hanya bisa lebih dari total (karena memori bersama dihitung beberapa kali), tidak kurang.
Gilles 'SANGAT berhenti menjadi jahat'

apa maksudmu dengan jumlah hanya bisa lebih banyak tidak kurang? atas hanya menunjukkan sebanyak mungkin proses yang sesuai di layar, saya cukup yakin bahwa di atas tidak semua proses yang berjalan, maka mereka tidak diurutkan berdasarkan penggunaan memori, potongan output itu cukup berguna untuk pertanyaan 'apa yang menggunakan memori' .
Echsecutor

oh, dan saya tidak ingin memasuki perdebatan ketika waktu optimal untuk mulai bertukar adalah, tetapi default server linux adalah tidak menukar memori hanya karena itu "tidak digunakan pada saat ini".
Echsecutor
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.