Apa perbedaan antara memori cache vs cache di Linux?

179

Bagi saya tidak jelas apa perbedaan antara dua konsep memori Linux: bufferdan cache. Saya telah membaca posting ini dan bagi saya perbedaan antara keduanya adalah kebijakan kedaluwarsa:

  1. kebijakan buffer adalah masuk pertama, keluar pertama
  2. kebijakan cache adalah yang terakhir digunakan.

Apakah saya benar?

Secara khusus, saya melihat dua perintah: freedanvmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859
James.Xu
sumber
Anda harus memberi kami lebih banyak konteks, kedua istilah tersebut digunakan dengan makna yang berbeda. Apakah Anda merujuk ke freeoutput perintah?
leonbloy
3
Anda benar, saya melihat dua perintah: gratis, vmstat. lihat pembaruan saya.
James.Xu
1
Anda juga dapat mengunjungi unix.stackexchange.com
leonbloy

Jawaban:

69

"Buffer" menunjukkan seberapa banyak porsi RAM yang didedikasikan untuk cache disk. "Cached" mirip seperti "Buffer", hanya saja kali ini cache halaman dari pembacaan file.

kutipan dari:

Seth Robertson
sumber
3
Saya telah menguji ini menggunakan program python sederhana yang menulis sejumlah besar blok. Apa yang terjadi adalah bahwa cachediisi seperti yang dilaporkan oleh free -w -h, bukan bufferskolom. Saya pikir cachekolom menghitung menulis disk dan membaca disk dan buffersdigunakan untuk sesuatu yang lain.
CMCDragonkai
@ CMCDragonkai terima kasih atas bukti eksperimentalnya. Pertanyaan yang menarik adalah apakah Anda menulis lebih cepat daripada yang bisa dilakukan disk. (mis. sinkronisasi akan memakan waktu lama) yang akan memberi tahu kami jika blok kotor dihitung berbeda dari yang bersih. Linux pasti akan men-cache kedua jenis (lru seperti yang disebutkan dalam pertanyaan) tetapi satu jauh lebih serius dalam hal tekanan memori.
Seth Robertson
179

Buffer dikaitkan dengan perangkat blok tertentu, dan mencakup caching metadata sistem file serta melacak halaman dalam penerbangan. Cache hanya berisi data file yang diparkir. Yaitu, buffer mengingat apa yang ada di direktori, hak akses file apa, dan melacak dari mana memori ditulis atau dibaca untuk perangkat blok tertentu. Cache hanya berisi konten dari file itu sendiri.

tautan kutipan

xoy
sumber
1
Singkat dan dijelaskan dengan baik. Terima kasih.
curiousguy
84

Jawaban yang dikutip (untuk referensi):

Jawaban singkat: Tembolok adalah ukuran cache halaman. Buffer adalah ukuran blok I / O buffer dalam memori. Masalah dalam cache; Buffer sebagian besar tidak relevan.

Jawaban panjang: Tembolok adalah ukuran cache halaman Linux, minus memori dalam cache swap, yang diwakili oleh SwapCached (dengan demikian ukuran cache halaman total adalah Tembolok + SwapCached). Linux melakukan semua file I / O melalui halaman cache. Menulis diterapkan hanya dengan menandai sebagai kotor halaman yang sesuai dalam cache halaman; utas flusher kemudian secara berkala menulis kembali ke disk setiap halaman yang kotor. Pembacaan diimplementasikan dengan mengembalikan data dari cache halaman; jika data belum ada dalam cache, ini pertama kali diisi. Pada sistem Linux modern, Cached dapat dengan mudah beberapa gigabytes. Ini akan menyusut hanya sebagai respons terhadap tekanan memori. Sistem akan membersihkan cache halaman bersama dengan menukar data ke disk untuk membuat lebih banyak memori yang diperlukan.

Buffer adalah buffer I / O blok memori. Mereka relatif berumur pendek. Sebelum kernel Linux versi 2.4, Linux memiliki cache halaman dan buffer yang terpisah. Sejak 2.4, cache halaman dan buffer disatukan dan Buffer adalah blok disk mentah yang tidak terwakili dalam cache halaman — yaitu, bukan file data. Metrik Buffer karenanya sangat penting. Pada kebanyakan sistem, Buffer seringkali hanya puluhan megabyte.

soketpair
sumber
7
"Buffer sebagian besar tidak relevan" - Tidak. Ada banyak kasus, di mana caching konten file tidak relevan, tetapi menjaga metadata dalam cache mempercepatnya. Server NAS streaming video misalnya.
Gunther Piez
Sistem apa pun yang melakukan banyak I / O akan menggunakan banyak memori untuk buffer. Saya melakukan bulkloading database MySQL / InnoDB 100GB dan buffernya selalu di atas 2GB.
Marcelo Pacheco
21

Ini tidak sesederhana ini, tetapi mungkin membantu memahami:

Buffer adalah untuk menyimpan metadata file (izin, lokasi, dll). Setiap halaman memori disimpan di sini.

Cache adalah untuk menyimpan konten file yang sebenarnya.

n00ber
sumber
5
TKI, Penyangga = Metadata; Cache = Data;
Freedom_Ben
13

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 RAM sebanyak mungkin untuk menyimpan informasi dari sistem file dan disk lokal dan jarak jauh Anda. Ketika waktu melewati 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 di 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 aktual dari file diketahui, itu diambil oleh kernel untuk diproses.

Ijaz Ahmad Khan
sumber
12

buffer dan cache.

Buffer adalah sesuatu yang belum "ditulis" ke disk.

Cache adalah sesuatu yang telah "dibaca" dari disk dan disimpan untuk digunakan nanti.

ChaiZhi
sumber
2
tip pengguna baru: buat jawaban Anda sejelas mungkin dengan pertanyaan itu. Jika saya jadi Anda, saya akan menambahkan ke jawaban Anda bagian yang dimulai dengan "Jadi, dengan contoh Anda ..." dan uraikan sedikit tentang itu.
Piotr Wadas
25
Saya tidak berpikir jawaban ini benar dalam konteks yang sama dengan pertanyaan (yaitu, apa arti kernel Linux dengan "buffer" dan "cache"
Freedom_Ben
8

Saya pikir halaman ini akan membantu memahami perbedaan antara buffer dan cache secara mendalam. http://www.tldp.org/LDP/sag/html/buffer-cache.html

Membaca dari disk sangat lambat dibandingkan dengan mengakses memori (nyata). Selain itu, biasanya membaca bagian disk yang sama beberapa kali selama periode waktu yang relatif singkat. Misalnya, seseorang mungkin pertama-tama membaca pesan email, kemudian membaca surat itu menjadi editor ketika membalasnya, kemudian membuat program surat membacanya lagi ketika menyalinnya ke folder. Atau, pertimbangkan seberapa sering perintah lsdapat dijalankan pada sistem dengan banyak pengguna. Dengan membaca informasi dari disk hanya sekali dan kemudian menyimpannya dalam memori sampai tidak lagi diperlukan, orang dapat mempercepat semua kecuali membaca pertama. Ini disebut buffering disk, dan memori yang digunakan untuk tujuan tersebut disebut buffer cache.

Karena memori, sayangnya, sumber daya terbatas, tidak, langka, cache buffer biasanya tidak cukup besar (tidak dapat menampung semua data yang ingin digunakan). Ketika cache terisi, data yang telah lama tidak digunakan dibuang dan memori yang dibebaskan digunakan untuk data baru.

Disk buffering juga berfungsi untuk menulis. Di satu sisi, data yang ditulis sering segera dibaca lagi (misalnya, file kode sumber disimpan ke file, kemudian dibaca oleh kompiler), jadi menempatkan data yang ditulis dalam cache adalah ide yang bagus. Di sisi lain, dengan hanya memasukkan data ke dalam cache, tidak menulisnya ke disk sekaligus, program yang menulis berjalan lebih cepat. Penulisan kemudian dapat dilakukan di latar belakang, tanpa memperlambat program lain.

Eric
sumber
Ini menjelaskan apa itu buffer cache, tetapi bukan apa perbedaannya antara buffer dan cache dalam output dari perintah vmstat dan free.
Roel Schroeven
4

Seth Robertson Link 2 mengatakan, "Untuk memahami istilah-istilah tersebut, lihat buku kernel Linux seperti Linux Kernel Development oleh Robert M. Love."

Saya menemukan beberapa konten tentang 'buffer' di buku edisi ke-2.

Meskipun perangkat fisik itu sendiri dapat dialamatkan di tingkat sektor, kernel melakukan semua operasi disk dalam hal blok.

Ketika sebuah blok disimpan dalam memori (katakanlah, setelah membaca atau menunggu penulisan), blok disimpan dalam 'buffer'. Setiap 'buffer' dikaitkan dengan tepat satu blok. 'Buffer' berfungsi sebagai objek yang mewakili blok disk dalam memori.

'Buffer' adalah representasi dalam memori dari satu blok disk fisik.

Blok I / O operasi memanipulasi blok disk tunggal pada suatu waktu. Blok umum operasi I / O adalah membaca dan menulis inode. Kernel menyediakan fungsi bread () untuk melakukan pembacaan tingkat rendah dari satu blok dari disk. Melalui 'buffer', blok disk dipetakan ke halaman dalam memori yang terkait. "

Chao Yin
sumber
2

Buffer berisi metadata yang membantu meningkatkan kinerja penulisan

Cache berisi konten file itu sendiri (kadang-kadang belum menulis ke disk) yang meningkatkan kinerja membaca

karthik
sumber
1

Kutipan dari buku: Pengantar Pengambilan Informasi

Cache

Kami ingin menyimpan data sebanyak mungkin dalam memori, terutama data yang perlu sering kami akses. Kami menyebut teknik menyimpan data disk yang sering digunakan dalam cache memori utama.

Penyangga

Sistem operasi umumnya membaca dan menulis seluruh blok. Dengan demikian, membaca satu byte dari disk dapat memakan waktu sebanyak membaca seluruh blok. Ukuran blok 8, 16, 32, dan 64 kilobyte (KB) adalah umum. Kami menyebut bagian dari memori utama tempat blok yang sedang dibaca atau ditulis disimpan sebagai buffer.

yantaq
sumber
0

Buffer adalah wilayah memori yang digunakan untuk menyimpan sementara data saat sedang dipindahkan dari satu tempat ke tempat lain di dalam komputer. Sementara cache adalah area penyimpanan sementara tempat data yang sering diakses dapat disimpan untuk akses cepat. Setelah data disimpan dalam cache, penggunaan di masa mendatang dapat dilakukan dengan mengakses salinan yang di-cache daripada mengambil kembali data asli, sehingga waktu akses rata-rata lebih pendek.

Abigail
sumber