Di Linux, apa perbedaan antara "buffer" dan "cache" yang dilaporkan oleh perintah gratis?

74

Ini adalah pertanyaan lama yang pernah saya lihat dari waktu ke waktu. Pemahaman saya tentang itu agak terbatas (setelah membaca tentang perbedaannya sejak lama, tetapi fakto yang terlibat tidak pernah benar-benar macet).

Seperti yang saya pahami,

  • Buffer

    Digunakan oleh program dengan operasi I / O aktif, yaitu data yang menunggu untuk ditulis ke disk

  • Cache

    Apakah hasil dari operasi I / O selesai, yaitu buffer yang telah memerah atau data membaca dari disk untuk memenuhi permintaan.

Bisakah saya mendapatkan penjelasan yang jelas untuk anak cucu?

Avery Payne
sumber
1
stackoverflow.com/questions/6345020/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Ini lebih seperti metadata yang Anda temukan di buffer, itu tidak terkait dengan buffer io. Beberapa buffer kernel dicatat di pengalokasi slab tetapi tidak termasuk buffer atau memori cache sama sekali.
eckes

Jawaban:

42

Total "cache" juga akan mencakup beberapa alokasi memori lain, seperti semua file tmpfs. Untuk melihat ini berlaku cobalah:

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 penurunan nilai "cache" oleh 100Mb yang Anda salin ke sistem file berbasis ram (dengan asumsi ada cukup RAM gratis, Anda mungkin menemukan beberapa berakhir dengan swap jika mesin sudah terlalu berkomitmen dalam hal penggunaan memori). The "sync; echo 3> / proc / sys / vm / drop_caches" sebelum setiap panggilan untuk bebas harus menulis apa pun yang tertunda di semua buffer tulis (sinkronisasi) dan menghapus semua blok disk yang di-cache / buffered dari memori jadi gratis 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 RAM yang akan digunakan oleh file yang dipetakan memori saat ini terbuka (ini akan bervariasi tergantung pada hypervisor / versi yang Anda gunakan dan mungkin antar versi kernel juga).

Jadi itu tidak sesederhana "buffer menghitung file / jaringan yang tertunda menulis dan menghitung cache baru-baru ini membaca / menulis blok yang disimpan dalam RAM untuk menyimpan pembacaan fisik masa depan", meskipun untuk sebagian besar tujuan deskripsi yang lebih sederhana ini akan dilakukan.

David Spillett
sumber
1
+1 untuk nuansa yang menarik. Ini adalah jenis informasi yang saya cari. Bahkan, saya curiga angka-angka itu sangat berbelit-belit, begitu terlibat dalam banyak kegiatan yang berbeda, sehingga mereka merupakan indikator umum terbaik.
Avery Payne
Saya tidak berpikir RAM yang digunakan oleh mesin virtual dihitung sebagai "cache", setidaknya untuk qemu-kvm. Saya perhatikan bahwa pada host KVM saya, nilai cache tidak hanya terlalu kecil untuk dikoreksi (pada 1,9 Gig), tetapi tidak berubah jika saya menghancurkan / memulai salah satu VM saya. Ini juga tidak berubah jika saya melakukan trik mount tmpfs di salah satu VM. Saya membuat partisi tmpfs 800Meg di sana dan "cache" menunjukkan nilai yang tepat pada VM tetapi tidak berubah pada host VM. Tetapi nilai "bekas" menyusut / tumbuh ketika saya menghancurkan / memulai VM saya.
Mike S
... Saya menjalankan tes pada host Centos 7.2.1511 VM yang menjalankan kernel 3.10.0-327.
Mike S
@ Mike: Bagaimana berbagai solusi virtualisasi menangani memori dapat bervariasi, pada kenyataannya bagaimana kernel mengukur berbagai penggunaan memori dapat berubah di antara versi-versi utama.
David Spillett
@ Mike: Berkenaan dengan "melakukan trik mount tmpfs di salah satu VM" - Saya yang tidak akan mempengaruhi pembacaan host jika mereka tidak menunjukkan mem lain yang digunakan oleh VM. Saya memang melihat efeknya dalam KVM VM itu sendiri: sebelum dd free = 2020, setelah dd free = 1899, setelah drop fs free = 2001 (perbedaan 19Mb akan disebabkan oleh proses lain pada VM, itu tidak menganggur ketika saya berlari ujian). Tuan rumah mungkin tidak melihat perubahan: memori mungkin masih dialokasikan untuk VM meskipun gratis untuk digunakan oleh proses di VM.
David Spillett
5

Saya sedang mencari deskripsi yang lebih jelas tentang buffer dan saya temukan di "Professional Linux® Kernel Architecture 2008"

Bab 16: Cache Halaman dan Buffer

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 tergantung pada ukuran blok perangkat yang mendasarinya, sedangkan banyak bagian dari kernel lebih memilih untuk melakukan operasi I / O dengan rincian halaman karena ini membuat segalanya lebih mudah - terutama dalam hal manajemen memori. Dalam skenario ini, penyangga bertindak sebagai perantara antara dua dunia.

c4f4t0r
sumber
3

Dijelaskan oleh RedHat :

Halaman Cache:

Cache adalah bagian dari memori yang secara transparan menyimpan data sehingga permintaan di masa mendatang untuk data tersebut dapat dilayani lebih cepat. Memori ini digunakan oleh kernel untuk menyimpan data disk dan meningkatkan kinerja i / o.

Kernel Linux dibangun sedemikian rupa sehingga akan menggunakan sebanyak mungkin RAM 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 tersimpan dalam memori untuk berbagai proses yang berjalan pada sistem atau data dari proses yang relevan yang akan digunakan dalam waktu dekat. Cache tidak direklamasi pada saat proses berhenti / keluar, namun ketika proses lain membutuhkan lebih banyak memori daripada memori yang tersedia, kernel akan menjalankan heuristik untuk mendapatkan kembali memori dengan menyimpan data cache dan mengalokasikan memori itu ke proses baru.

Ketika segala jenis file / data diminta maka kernel akan mencari salinan bagian dari file yang digunakan oleh pengguna, dan, jika tidak ada salinan seperti itu, itu akan mengalokasikan satu halaman baru dari memori cache dan mengisinya dengan isi yang sesuai dibacakan dari disk.

Data yang disimpan dalam cache mungkin nilai yang telah dihitung sebelumnya atau duplikat dari nilai asli yang disimpan di tempat lain dalam disk. Ketika beberapa data diminta, cache pertama kali diperiksa untuk melihat apakah itu berisi data itu. Data dapat diambil lebih cepat dari cache daripada dari sumbernya.

Segmen memori bersama SysV juga dicatat sebagai cache, meskipun mereka tidak mewakili data apa pun pada disk. Satu 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 halaman cache, pertama kernel memeriksa data dalam buffer yang berisi metadata yang menunjuk ke file / data aktual yang terkandung dalam cache halaman. Setelah dari metadata alamat blok sebenarnya dari file diketahui, itu diambil oleh kernel untuk diproses.

Ijaz Ahmad Khan
sumber
2

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, masalahnya, Anda bisa memaksa sistem Anda untuk mendelegasikan sebanyak mungkin memori cachedaripada menjatuhkan file yang di-cache:

Pembukaan

Sebelum melakukan tes, Anda dapat membuka jendela lain 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 real time.

Catatan: Anda harus membuang sebanyak mungkin disk bebas pada direktori saat ini, Anda harus 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

Nota, tuan rumah di mana saya sudah melakukan ini sangat digunakan. Ini akan lebih signifikan pada mesin yang sangat sunyi.

F. Hauri
sumber
1
-1 jika saya bisa. Ini (A) tidak relevan dengan pertanyaan yang diajukan dan (B) cara yang sangat tumpul untuk memicu pembersihan cache. Ada cara langsung untuk melakukan yang terakhir, jadi tidak bisa dibohongi untuk mengelabui sistem agar mematuhi dengan mengirim spam ke data hingga hilang sebagai efek samping
underscore_d
Ya ampun! Tolong jangan pernah melakukan itu di server nyata!
tamerlaha
@Tamerlaha saya setuju, tapi tolong baca kembali paragraf 1: Anda diperingatkan, jangan salahkan saya ! Tujuannya adalah untuk menunjukkan implikasi buffer / cache.
F. Hauri