GNU/Linux >> Belajar Linux >  >> Linux

30% dari RAM adalah buffer. Apa itu?

  1. Apa perbedaan antara "buffer" dan jenis cache lainnya?
  2. Mengapa perbedaan ini begitu menonjol? Mengapa sebagian orang mengatakan "buffer cache" saat membicarakan konten file yang di-cache?
  3. Apa itu Buffers digunakan untuk?
  4. Mengapa kita mengharapkan Buffers khususnya menjadi lebih besar atau lebih kecil?

1. Apa perbedaan antara "buffer" dan jenis cache lainnya?

Buffers menunjukkan jumlah cache halaman yang digunakan untuk memblokir perangkat. "Blokir perangkat" adalah jenis perangkat penyimpanan data yang paling umum.

Kernel harus dengan sengaja mengurangi jumlah ini dari sisa cache halaman ketika melaporkan Cached . Lihat meminfo_proc_show():

cached = global_node_page_state(NR_FILE_PAGES) -
         total_swapcache_pages() - i.bufferram;
...

show_val_kb(m, "MemTotal:       ", i.totalram);
show_val_kb(m, "MemFree:        ", i.freeram);
show_val_kb(m, "MemAvailable:   ", available);
show_val_kb(m, "Buffers:        ", i.bufferram);
show_val_kb(m, "Cached:         ", cached);

2. Mengapa perbedaan ini dibuat begitu menonjol? Mengapa sebagian orang mengatakan "buffer cache" saat membicarakan konten file yang di-cache?

Cache halaman berfungsi dalam satuan ukuran halaman MMU, biasanya minimal 4096 byte. Ini penting untuk mmap() , yaitu akses file yang dipetakan memori.[1][2] Ini dirancang untuk berbagi halaman kode program / perpustakaan yang dimuat di antara proses terpisah, dan memungkinkan memuat halaman individual sesuai permintaan. (Juga untuk membongkar halaman saat ada hal lain yang membutuhkan ruang, dan belum digunakan akhir-akhir ini).

[1] I/O yang dipetakan memori - Manual Perpustakaan GNU C.
[2] mmap - Wikipedia.

UNIX awal memiliki "buffer cache" dari blok disk, dan tidak memiliki mmap(). Rupanya ketika mmap() pertama kali ditambahkan, mereka menambahkan cache halaman sebagai layer baru di atas. Ini sama berantakannya dengan kedengarannya. Akhirnya, OS berbasis UNIX membuang cache buffer yang terpisah. Jadi sekarang semua cache file dalam satuan halaman. Halaman dicari berdasarkan (file, offset), bukan berdasarkan lokasi pada disk. Ini disebut "cache buffer terpadu", mungkin karena orang lebih akrab dengan "cache buffer".[3]

[3] UBC:Subsistem Caching Memori dan I/O Terpadu yang Efisien untuk NetBSD

("Satu perubahan menarik yang ditambahkan Linux adalah bahwa nomor blok perangkat tempat halaman disimpan di disk di-cache dengan halaman dalam bentuk daftar buffer_head struktur. Saat halaman yang dimodifikasi akan ditulis kembali ke disk, permintaan I/O dapat langsung dikirim ke driver perangkat, tanpa perlu membaca blok tidak langsung apa pun untuk menentukan di mana data halaman harus ditulis."[3])

Di Linux 2.2 ada "buffer cache" terpisah yang digunakan untuk menulis, tetapi tidak untuk membaca. "Cache halaman menggunakan cache buffer untuk menulis kembali datanya, memerlukan salinan data tambahan, dan menggandakan persyaratan memori untuk beberapa beban tulis"..[4] Jangan terlalu khawatir tentang detailnya, tetapi riwayat ini akan menjadi salah satu alasan mengapa Linux melaporkan Buffers penggunaan secara terpisah.

[4] Penggantian halaman dalam manajemen memori Linux 2.4, Rik van Riel.

Sebaliknya, di Linux 2.4 dan yang lebih baru, salinan tambahan tidak ada. "Sistem melakukan disk IO langsung ke dan dari halaman cache halaman."[4] Linux 2.4 dirilis pada tahun 2001.

3. Apa itu Buffers digunakan untuk?

Perangkat blok diperlakukan sebagai file, dan begitu juga dengan cache halaman. Ini digunakan "untuk metadata sistem file dan caching perangkat blok mentah".[4] Namun dalam versi Linux saat ini, sistem file tidak menyalin konten file melaluinya, sehingga tidak ada "caching ganda".

Saya memikirkan Buffers bagian dari cache halaman sebagai cache buffer Linux. Beberapa sumber mungkin tidak setuju dengan terminologi ini.

Berapa banyak cache buffer yang digunakan sistem file, jika ada, tergantung pada jenis sistem file. Sistem dalam pertanyaan menggunakan ext4. ext3/ext4 menggunakan cache buffer Linux untuk jurnal, untuk konten direktori, dan beberapa metadata lainnya.

Sistem file tertentu, termasuk ext3, ext4, dan ocfs2, menggunakan lapisan jbd orjbd2 untuk menangani penjurnalan blok fisiknya, dan lapisan ini pada dasarnya menggunakan cache buffer.

-- Artikel email oleh Ted Tso, 2013

Sebelum kernel Linux versi 2.4, Linux memiliki cache halaman dan buffer terpisah. Sejak 2.4, cache halaman dan buffer disatukan dan Buffers adalah blok disk mentah yang tidak terwakili dalam cache halaman—yaitu, bukan data file.

...

Namun, cache buffer tetap ada, karena kernel masih perlu melakukan blok I/O dalam hal blok, bukan halaman. Karena sebagian besar blok mewakili data file, sebagian besar buffer cache diwakili oleh cache halaman. Tetapi sejumlah kecil data blok tidak didukung oleh file—metadata dan I/O blok mentah misalnya—dan dengan demikian hanya diwakili oleh cache buffer.

-- Sepasang jawaban Quora oleh Robert Love, terakhir diperbarui 2013.

Kedua penulis adalah pengembang Linux yang telah bekerja dengan manajemen memori kernel Linux. Sumber pertama lebih spesifik tentang detail teknis. Sumber kedua adalah ringkasan yang lebih umum, yang mungkin bertentangan dan ketinggalan zaman dalam beberapa hal spesifik.

Memang benar bahwa sistem file dapat melakukan penulisan metadata sebagian halaman, meskipun cache diindeks di halaman. Bahkan proses pengguna dapat melakukan penulisan sebagian halaman saat mereka menggunakan write() (berlawanan dengan mmap() ), setidaknya langsung ke perangkat blok. Ini hanya berlaku untuk menulis, bukan membaca. Saat Anda membaca cache halaman, cache halaman selalu membaca halaman penuh.

Linus suka mengoceh bahwa cache buffer tidak diperlukan untuk melakukan penulisan ukuran blok, dan bahwa sistem file dapat melakukan penulisan metadata sebagian halaman bahkan dengan cache halaman yang dilampirkan ke file mereka sendiri alih-alih perangkat blok. Saya yakin dia benar mengatakan bahwa ext2 melakukan ini. ext3/ext4 dengan sistem penjurnalannya tidak. Kurang jelas masalah apa yang menyebabkan desain ini. Orang-orang yang dimarahinya sudah bosan menjelaskan.

ext4_readdir() belum diubah untuk memuaskan kata-kata kasar Linus. Saya juga tidak melihat pendekatan yang diinginkannya digunakan dalam readdir() dari sistem file lain. Saya pikir XFS juga menggunakan buffer cache untuk direktori. bcachefs sama sekali tidak menggunakan cache halaman untuk readdir(); ia menggunakan cache sendiri untuk btrees. Saya tidak yakin tentang btrf.

4. Mengapa kita mengharapkan Buffers khususnya menjadi lebih besar atau lebih kecil?

Dalam hal ini ternyata ukuran jurnal ext4 untuk sistem file saya adalah 128M. Jadi ini menjelaskan mengapa 1) cache buffer saya dapat stabil sedikit di atas 128M; 2) buffer cache tidak diskalakan secara proporsional dengan jumlah RAM yang lebih besar di laptop saya.

Untuk beberapa kemungkinan penyebab lainnya, lihat Apa kolom buffer di output dari free? Perhatikan bahwa "buffer" dilaporkan oleh free sebenarnya adalah kombinasi dari Buffers dan memori kernel slab yang dapat diklaim ulang.

Untuk memverifikasi bahwa penulisan jurnal menggunakan cache buffer, saya menyimulasikan sistem file dalam RAM cepat yang bagus (tmpfs), dan membandingkan penggunaan buffer maksimum untuk ukuran jurnal yang berbeda.

# dd if=/dev/zero of=/tmp/t bs=1M count=1000
...
# mkfs.ext4 /tmp/t -J size=256
...
# LANG=C dumpe2fs /tmp/t | grep '^Journal size'
dumpe2fs 1.43.5 (04-Aug-2017)
Journal size:             256M
# mount /tmp/t /mnt
# cd /mnt
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2521        4321         285          66         947        5105
Swap:          7995           0        7995

# for i in $(seq 40000); do dd if=/dev/zero of=t bs=1k count=1 conv=sync status=none; sync t; sync -f t; done
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2523        3872         551         237        1223        4835
Swap:          7995           0        7995
# dd if=/dev/zero of=/tmp/t bs=1M count=1000
...
# mkfs.ext4 /tmp/t -J size=16
...
# LANG=C dumpe2fs /tmp/t | grep '^Journal size'
dumpe2fs 1.43.5 (04-Aug-2017)
Journal size:             16M
# mount /tmp/t /mnt
# cd /mnt
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2507        4337         285          66         943        5118
Swap:          7995           0        7995

# for i in $(seq 40000); do dd if=/dev/zero of=t bs=1k count=1 conv=sync status=none; sync t; sync -f t; done
# free -w -m
              total        used        free      shared     buffers       cache   available
Mem:           7855        2509        4290         315          77         977        5086
Swap:          7995           0        7995

Riwayat jawaban ini:Bagaimana saya bisa melihat jurnal

Saya telah menemukan email Ted Tso terlebih dahulu, dan tertarik karena email itu menekankan tulis caching. Saya akan terkejut jika "kotor", tidak tertulis data dapat mencapai 30% dari RAM di sistem saya. sudo atop menunjukkan bahwa selama interval 10 detik, sistem yang dimaksud secara konsisten menulis hanya 1MB. Sistem file yang bersangkutan akan dapat mengikuti kecepatan ini lebih dari 100 kali lipat. (Ada di hard disk drive USB2, throughput maksimum ~20MB/dtk).

Menggunakan blktrace (btrace -w 10 /dev/sda ) mengonfirmasi bahwa IO yang sedang di-cache harus ditulis, karena hampir tidak ada data yang sedang dibaca. Juga mysqld itu adalah satu-satunya ruang pengguna proses melakukan IO.

Saya menghentikan layanan yang bertanggung jawab atas penulisan (penulisan icinga2 ke mysql) dan memeriksa ulang. Saya melihat "buffer" turun hingga di bawah 20 juta - saya tidak punya penjelasan untuk itu - dan tetap di sana. Memulai ulang penulis lagi menunjukkan "buffer" meningkat ~0,1 juta untuk setiap interval 10 detik. Saya mengamatinya mempertahankan tingkat ini secara konsisten, naik kembali ke 70 juta ke atas.

Menjalankan echo 3 | sudo tee /proc/sys/vm/drop_caches sudah cukup untuk menurunkan "buffer" lagi, menjadi 4,5 juta. Ini membuktikan bahwa akumulasi buffer saya adalah cache "bersih", yang dapat langsung dihapus oleh Linux saat diperlukan. Sistem ini tidak terakumulasi tidak tertulis data. (drop_caches tidak melakukan writeback apa pun dan karenanya tidak dapat membuang halaman kotor. Jika Anda ingin menjalankan tes yang membersihkan cache terlebih dahulu, Anda akan menggunakan sync perintah).

Seluruh direktori mysql hanya 150 juta. Buffer yang terakumulasi harus mewakili blok metadata dari penulisan mysql, tetapi saya terkejut karena berpikir akan ada begitu banyak blok metadata untuk data ini.


Versi free Anda memiliki ide yang tepat. Secara default menggabungkan buffer dan cache dalam laporannya. Ini karena mereka pada dasarnya adalah hal yang sama. Keduanya adalah komputer yang mengingat dalam RAM (Lebih cepat dari penyimpanan sekunder:Disk dan SSD), apa yang telah dilihatnya saat membaca Disk dan SSD.

Jika sistem operasi merasa bahwa memori lebih baik digunakan oleh sesuatu yang lain maka dapat membebaskannya. Oleh karena itu jangan khawatir tentang buffer dan cache.

Namun menonton DVD dapat menyebabkan buffer naik, dan menghapus konten buffer/cache lainnya. Oleh karena itu Anda dapat menggunakan nocache untuk menjalankan pemutar DVD (jika menyebabkan masalah ).


Linux
  1. Apa Arti Angka Dalam Halaman Man?

  2. Ny Cara Mengetahui Ukuran Cache L1, L2, L3 Dan Ram Di Linux?

  3. Linux – Bagaimana Memberi Ram ke Cache Sistem File?

  1. Apa perbedaan antara buffer dan memori cache di Linux?

  2. Apa arti acara perf cache?

  3. Apa itu halaman yang dipetakan memori dan halaman anonim?

  1. Apa yang dilakukan .cache? Ini menghabiskan ruang disk yang besar

  2. Apa board berkemampuan Linux paling sederhana yang bisa saya buat di rumah?

  3. Apa kolom buffer di output dari gratis?