Solusi 1:
Total "cache" juga akan menyertakan beberapa alokasi memori lainnya, seperti sistem file tmpfs apa pun. Untuk melihat efeknya, coba:
mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
dan Anda akan melihat nilai "cache" turun sebesar 100Mb yang Anda salin ke sistem file berbasis ram (dengan asumsi ada cukup RAM kosong, Anda mungkin menemukan beberapa di antaranya berakhir dengan swap jika mesin sudah berkomitmen berlebihan dalam hal penggunaan memori). "sync; echo 3> /proc/sys/vm/drop_caches" sebelum setiap panggilan ke free harus menulis apa pun yang tertunda di semua buffer tulis (sinkronisasi) dan menghapus semua blok disk yang di-cache/buffer dari memori sehingga free hanya akan membaca yang lain alokasi dalam nilai "cache".
RAM yang digunakan oleh mesin virtual (seperti yang berjalan di bawah VMWare) juga dapat dihitung dalam nilai "cache" gratis, seperti halnya RAM yang digunakan oleh file yang dipetakan memori yang sedang terbuka (ini akan bervariasi tergantung pada hypervisor/versi yang Anda gunakan dan mungkin antar versi kernel juga).
Jadi ini tidak sesederhana "buffer menghitung file/penulisan jaringan yang tertunda dan jumlah yang di-cache blok yang baru-baru ini dibaca/ditulis yang disimpan dalam RAM untuk menyimpan pembacaan fisik di masa mendatang", meskipun untuk sebagian besar tujuan, deskripsi yang lebih sederhana ini sudah cukup.
Solusi 2:
Pertanyaan Rumit. Saat Anda menghitung ruang kosong, Anda benar-benar perlu menambahkan buffer dan cache keduanya. Inilah yang dapat saya temukan
Buffer adalah sesuatu yang belum "ditulis" ke disk. Cache adalah sesuatu yang telah "dibaca" dari disk dan disimpan untuk digunakan nanti.
http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135
Solusi 3:
Saya mencari deskripsi yang lebih jelas tentang buffer dan saya temukan di "Professional Linux® Kernel Architecture 2008"
Bab 16:Halaman dan Buffer Cache
Interaksi
Menyiapkan tautan antara halaman dan buffer tidak banyak berguna jika tidak ada manfaat untuk bagian lain dari kernel. Seperti yang telah disebutkan, beberapa operasi transfer ke dan dari perangkat blok mungkin perlu dilakukan dalam unit yang ukurannya bergantung pada ukuran blok perangkat yang mendasarinya, sedangkan banyak bagian kernel lebih suka melakukan operasi I/O dengan perincian halaman karena hal ini membuat segalanya lebih mudah. — terutama dalam hal manajemen memori. Dalam skenario ini, buffer bertindak sebagai perantara antara dua dunia.
Solusi 4:
Dijelaskan oleh RedHat :
Halaman Cache:
Cache adalah bagian dari memori yang menyimpan data secara transparan sehingga permintaan di masa mendatang untuk data tersebut dapat dilayani lebih cepat. Memori ini digunakan oleh kernel untuk meng-cache data disk dan meningkatkan performa i/o.
Kernel Linux dibangun sedemikian rupa sehingga akan menggunakan RAM sebanyak mungkin untuk menyimpan informasi dari sistem file dan disk lokal dan jarak jauh Anda. Seiring berjalannya waktu berbagai pembacaan dan penulisan dilakukan pada sistem, kernel mencoba untuk menyimpan data yang disimpan dalam memori untuk berbagai proses yang berjalan pada sistem atau data dari proses yang relevan yang akan digunakan dalam waktu dekat. Cache tidak diambil kembali pada saat proses berhenti/keluar, namun ketika proses lain membutuhkan lebih banyak memori daripada memori yang tersedia, kernel akan menjalankan heuristik untuk merebut kembali memori dengan menyimpan data cache dan mengalokasikan memori itu ke proses baru.
Ketika segala jenis file/data diminta maka kernel akan mencari salinan dari bagian file yang sedang dikerjakan pengguna, dan, jika tidak ada salinan seperti itu, kernel akan mengalokasikan satu halaman baru dari memori cache dan mengisinya dengan konten yang sesuai dibacakan dari disk.
Data yang disimpan dalam cache mungkin berupa nilai yang telah dihitung sebelumnya atau duplikat dari nilai asli yang disimpan di tempat lain di disk. Saat beberapa data diminta, pertama-tama cache diperiksa untuk melihat apakah berisi data tersebut. Data dapat diambil lebih cepat dari cache daripada dari asal sumbernya.
Segmen memori bersama SysV juga dianggap sebagai cache, meskipun tidak mewakili data apa pun di disk. Seseorang dapat memeriksa ukuran segmen memori bersama menggunakan perintah ipcs -m dan memeriksa kolom byte.
Buffer :
Buffer adalah representasi blok disk dari data yang disimpan di bawah cache halaman. Buffer berisi metadata dari file/data yang berada di bawah cache halaman. Contoh:Ketika ada permintaan data apa pun yang ada di cache halaman, pertama-tama kernel memeriksa data di buffer yang berisi metadata yang mengarah ke file/data aktual yang terkandung dalam cache halaman. Setelah dari metadata, alamat blok sebenarnya dari file tersebut diketahui, diambil oleh kernel untuk diproses.
Solusi 5:
Membebaskan buffer/cache
Peringatan Ini menjelaskan metode kuat yang tidak direkomendasikan di server produksi! Jadi Anda diperingatkan, jangan salahkan saya jika terjadi kesalahan.
Untuk memahami, hal itu, Anda bisa memaksa sistem Anda untuk mendelegasikan memori sebanyak mungkin ke cache
daripada menjatuhkan file yang di-cache:
Sebelum melakukan tes, Anda dapat membuka jendela lain dengan klik:
$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 1 39132 59740 39892 1038820 0 0 1 0 3 3 5 13 81 1
1 0 39132 59140 40076 1038812 0 0 184 0 10566 2157 27 15 48 11
...
untuk mengikuti evolusi swap secara waktu nyata.
Catatan: Anda harus membuang sebanyak mungkin disk kosong di direktori saat ini, Anda memiliki mem+swap
Demo$ free
total used free shared buffers cached
Mem: 2064396 2004320 60076 0 90740 945964
-/+ buffers/cache: 967616 1096780
Swap: 3145720 38812 3106908
$ tot=0
$ while read -a line;do
[[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
done </proc/meminfo
$ echo $tot
10420232
$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s
$ cat >/dev/null veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 2010160 54236 0 41568 1039636
-/+ buffers/cache: 928956 1135440
Swap: 3145720 39132 3106588
$ rm veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 1005104 1059292 0 41840 48124
-/+ buffers/cache: 915140 1149256
Swap: 3145720 39132 3106588
Catatan, host tempat saya melakukan ini sangat sering digunakan. Ini akan menjadi lebih signifikan pada mesin yang sangat sunyi.