pengembangan-web-mp.com

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

Ini adalah pertanyaan lama yang pernah saya lihat dari waktu ke waktu. Pemahaman saya tentang ini 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 yang aktif, yaitu data yang menunggu untuk ditulis ke disk

  • Cache

    Apakah hasil dari operasi I/O yang selesai, mis. Buffer yang telah dibilas atau data dibaca dari disk untuk memenuhi permintaan.

Bisakah saya mendapatkan penjelasan yang jelas untuk anak cucu?

73
Avery Payne

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). "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/di-buffer dari memori sehingga gratis hanya akan membaca yang lain alokasi dalam nilai "cache".

The RAM digunakan oleh mesin virtual (seperti yang berjalan di bawah VMWare) juga dapat dihitung dalam nilai "cache" gratis, seperti yang akan RAM digunakan oleh saat ini terbuka file yang dipetakan memori (ini akan bervariasi tergantung pada hypervisor/versi yang Anda gunakan dan mungkin juga antar versi kernel).

Jadi 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 di masa depan", meskipun untuk sebagian besar tujuan deskripsi yang lebih sederhana ini akan melakukan.

41
David Spillett

Pertanyaan rumit. Ketika Anda menghitung ruang kosong Anda sebenarnya perlu menambahkan buffer dan cache keduanya. Ini yang bisa 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

8
Viky

Saya 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.

5
c4f4t0r

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 yang dapat digunakan untuk menyimpan informasi dari sistem file dan disk lokal dan jarak jauh Anda. Seiring berjalannya waktu berbagai macam proses baca dan tulis dilakukan pada sistem, kernel mencoba untuk menyimpan data yang tersimpan dalam memori untuk berbagai proses yang berjalan pada sistem atau data yang dari proses yang relevan yang akan digunakan dalam waktu dekat. Cache tidak direklamasi pada saat proses dapatkan stop/keluar, namun ketika proses lain membutuhkan lebih banyak memori daripada memori yang tersedia kosong, 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 Asal.

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.

3
Ijaz Ahmad Khan

Membebaskan buffer/cache

Peringatan Ini menjelaskan metode yang kuat tidak direkomendasikan di server produksi! Jadi Anda diperingatkan, jangan salahkan saya jika terjadi kesalahan.

Untuk memahami, masalahnya, 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 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.

Nota: Anda harus membuang sebanyak mungkin disk bebas pada direktori saat ini, Anda harus mem + swap

$ 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, Host di mana saya sudah melakukan ini sangat digunakan. Ini akan lebih signifikan pada mesin yang sangat sunyi.

2
F. Hauri