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
df
melaporkan tidak ada konsumsi besar memori dari tmpfs
sistem file.
ps -eo pid,user,args,pmem --sort pmem
?head
! Saya ingin hasil lengkap dari perintah lengkap. Jika saya ingin Anda menggunakanhead
saya akan memasukkannya ke dalam perintah saya. Tolong, selalu berikan output lengkap ke perintah yang diminta orang.Jawaban:
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 daritop
). 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
top
danfree
lain-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.
sumber
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.
sumber
Apakah Anda menggunakan NFS sama sekali?
Mungkin layak dijalankan
slabtop -o
dengan cara apa pun, yangnfs_inode_cache
bisa lepas kendali.sumber
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
sumber
free
, saya pikir Anda maksudtop
- tetapi bahkan kemudian jumlahnya hanya bisa lebih dari total (karena memori bersama dihitung beberapa kali), tidak kurang.