Bagaimana cara kerja cache menulis dengan sistem file yang mencakup disk dengan kecepatan yang berbeda?

9

Pada sistem Linux modern dengan banyak disk dan RAID perangkat lunak yang mencakup drive lambat (HDD) dan cepat (SSD), bagaimana cara menulis ke sistem file yang di-cache?

Untuk md-raid RAID1 array dapat dikonfigurasikan dengan disk sebagai --write-mostlydan --write-behindyang menunjukkan bahwa pembacaan dilakukan dari disk yang lebih cepat, dan yang menulis ke disk yang lebih lambat dapat tertinggal. Tetapi bagaimana itu di-cache pada level kernel? Apakah kernel cache disk menulis sebelum atau setelah lapisan md-raid? Di akhir panggilan tulis () apakah data dijamin akan ditulis ke salah satu not- --write-behinddisk?

Untuk btrfsRAID1 bagaimana situasi yang sama akan terjadi? Tidak ada --write-behindfungsi, jadi apakah halaman kotor dihitung pada tingkat perangkat atau tingkat sistem file? Pada titik manakah sebuah write () kembali?

Bagaimana vm.dirty_*ratiopengaruh tunabel terhadap pengaturan ini?

Steven Davies
sumber

Jawaban:

7

Itu --write-mostly, --write-behindditangani oleh mdpengemudi secara internal. mdmenyimpan metadata, seperti bitmap tulis-maksud (yang wajib untuk fitur tulis-belakang) yang pada dasarnya mencatat data mana yang telah ditulis namun vs. data mana yang masih hilang. Ini diperlukan jika ada peristiwa kehilangan daya, ketika data belum mencapai perangkat yang sebagian besar belum ditulis. Dalam hal ini area data yang terpengaruh akan disinkronkan kembali (dalam kasus Anda baca dari SSD, tulis ke HDD).

Tetapi bagaimana itu di-cache pada level kernel?

Untuk kasus write-behind, driver md pada dasarnya menduplikasi permintaan tulis secara internal. Permintaan master write pergi ke drive utama dan memberi tahu lapisan atas "OK, saya sudah melakukan ini"; permintaan tulis yang disalin kemudian tetap berada di sisi penulisan-kebanyakan-di belakang dari RAID dan mungkin membutuhkan waktu lebih lama untuk diselesaikan, mudah-mudahan tanpa ada yang memperhatikan.

Kemudian layer raid mengambil banyak langkah untuk memastikan tidak ada data yang akan dibaca dari perangkat tulis-sebagian sementara masih ada permintaan tulis-balik dalam antrian. Mengapa data dibaca dari perangkat yang kebanyakan menulis? Yah, SSD mungkin telah gagal sehingga semua ada di sana. Ini rumit, dan menulis-balik memperkenalkan beberapa kasus sudut.

Yang mungkin juga mengapa itu hanya didukung untuk level RAID-1, bukan yang lain. Meskipun secara teori masuk akal untuk memiliki SSD pada dasarnya sebagai RAID-0 dan dua HDD paritas dalam mode tulis-balik, tidak ada dukungan untuk penulisan-di belakang RAID-6 seperti itu. Ini RAID-1 saja dan jarang digunakan bahkan di sana.

Pengaturan cache lainnya tetap tidak terpengaruh oleh ini, pada dasarnya mekanisme caching keseluruhan tidak peduli sama sekali tentang bagaimana mddriver telah mengimplementasikan hal-hal secara internal. Cache melakukan tugasnya dan md melakukan tugasnya. Jadi cache sistem file bekerja sama untuk sistem file di atas md vs sistem file di atas drive kosong. (Kenyataannya sedikit lebih rumit dari itu tetapi Anda bisa memikirkannya dengan cara ini.)

frostschutz
sumber
3

Untuk md-raid RAID1 array dapat dikonfigurasikan dengan disk sebagai --write-mostlydan --write-behindyang menunjukkan bahwa pembacaan dilakukan dari disk yang lebih cepat, dan yang menulis ke disk yang lebih lambat dapat tertinggal. Tetapi bagaimana itu di-cache pada level kernel? Apakah kernel cache disk menulis sebelum atau setelah lapisan md-raid?

Setelah, karena fitur ini khusus untuk md-raid.

Anda harus berpikir tentang fitur md-raid ini sebagai buffering, bukan caching. Itu dibatasi oleh mdadmopsi berikut :

--write-behind =

Tentukan bahwa mode tulis di belakang harus diaktifkan (hanya berlaku untuk RAID1). Jika argumen ditentukan, itu akan mengatur jumlah maksimum tulisan yang beredar diizinkan. Nilai standarnya adalah 256.

Saya hanya bisa berpikir bahwa itu juga dibatasi oleh kernel normal dan buffering perangkat keras (yaitu jika itu lebih kecil). Buffer kernel normal dibatasi oleh nr_requestsdan max_hw_sectors_kb. Lihat /sys/class/block/$write_behind_device/queue/. Dengan buffering perangkat keras, maksud saya cache tulis di drive.

Di akhir panggilan tulis () apakah data dijamin akan ditulis ke salah satu not- --write-behinddisk?

Tentu saja, dengan asumsi Anda maksud write () ada pada file yang dibuka dengan O_SYNC / O_DSYNC, atau Anda sebenarnya bermaksud write () + fsync (). Jika tidak, tidak ada jaminan yang berlaku sama sekali.

sourcejedi
sumber
Terima kasih, tetapi itu menimbulkan pertanyaan lain: jika file dibuka dengan O_SYNC, apakah write () kembali setelah disk pertama telah ditulis atau semua disk telah ditulis dalam kasus ini?
Steven Davies
3
sub-menulis ke disk non-tulis-belakang harus diselesaikan terlebih dahulu
sourcejedi