Berapa lama sistem file dapat di-cache dengan ext4?

14

Beberapa waktu yang lalu, ada beberapa diskusi tentang ext4 yang berpotensi meninggalkan file kosong setelah unmount yang tidak bersih, disimpulkan dengan cukup baik dalam artikel ini . Pada dasarnya, karena alokasi yang tertunda, menulis dapat disimpan dalam cache tulis untuk waktu yang lebih lama daripada interval komit default jurnal ext (5 detik).

Masalahnya tampaknya telah diperbaiki dalam tambalan yang memaksa alokasi blok dalam situasi tertentu, sehingga memaksa data ke disk setelah paling banyak 5 detik secara default.

Saya bertanya-tanya apa yang terjadi ketika aplikasi menimpa bagian file yang ada, tanpa memotong atau menambahkan file itu sendiri. Apakah itu akan dipaksa untuk disk dalam 5 detik juga?

Sepertinya situasi yang berbeda dari menambahkan ke file: saat menambahkan, ukuran file berubah, yang merupakan perubahan metadata; oleh karena itu, komit jurnal akan diperlukan dalam 5 detik, dan karena data = dipesan, data harus ditulis sebelum itu karena masalah keamanan (jika tidak, bagian dari file yang dihapus dari pengguna lain dapat muncul untuk pemilik yang ditambahkan) mengajukan).

Ketika hanya menimpa data file, tidak ada alasan mengapa penulisan data harus terjadi sebelum jurnal metadata melakukan, karena data lama milik pengguna yang sama dengan yang baru. Jadi, apakah penulisan itu terjadi sebelum komit, atau bisakah ditunda lebih lama dari interval jurnal komit? Jika ya, berapa lama?

Pembaruan: Saya tahu bahwa semua ini tidak relevan ketika melakukan hal yang benar, yaitu menggunakan fsync (). (Ini adalah alasan utama untuk semua diskusi tentang ext4 dan kehilangan data - masalahnya hanya menyangkut aplikasi yang tidak fsync (), atau tidak pada saat yang tepat.) Saya tidak menulis aplikasi sendiri, saya bertanya karena saya tidak tahu apakah semua aplikasi saya melakukan hal yang benar, dan saya ingin tahu perkiraan waktu untuk penulisan "berbahaya" semacam itu. Alasan untuk bertanya adalah driver grafis saya yang menyebabkan panik kernel secara teratur, dan saya ingin tahu apakah saya harus khawatir tentang lebih dari 5 detik terakhir dari data yang ditulis.

lxgr
sumber

Jawaban:

16

Anda dapat mengatur interval komit ke nilai kustom yang, saya percaya, dapat setinggi jumlah integer 32-bit unsigned detik; jadi sekitar 4 miliar detik, atau 136 tahun. Ini tersedia melalui commitopsi mount, yang dapat Anda gunakan sebagai berikut (ini hanyalah sebuah contoh; Anda juga dapat mengatur ini di fstab):

mount /dev/sda1 -t ext4 -o rw,data=writeback,nobh,commit=12345678

Interval komit tidak didasarkan pada jenis kondisi seperti apakah data ditambahkan atau menimpa data yang ada atau apa pun. The commitmount option (yang defaultnya 5 detik jika Anda tidak menyediakan opsi gunung sama sekali) setara dengan melakukan sesuatu seperti ini di shell bash:

#!/bin/bash
while :
do
    echo "Syncing all uncommitted data and journal to disk"
    sync
    sleep 5
done

Jangan bingung data=ordereddan interval sinkronisasi sistem file global ini ("interval komit" mungkin istilah yang kurang bermakna bagi kita yang memahami fungsionalitas program baris perintah sync, dalam hal ini mungkin lebih baik dinamai "interval sinkronisasi"). data=orderedadalah tentang urutan data dan metadata diperbarui (di mana data=writeback"kurang aman / lebih cepat" dan data=journal"lebih aman / lebih lambat"). commit=12345678adalah tentang frekuensi di mana driver filesystem itu sendiri memaksa sinkronisasi FULL SEMUA data kotor / jurnal / metadata / apa pun ke media fisik. Dan Anda pasti dapat mengaturnya ke 136 tahun jika Anda mau, dan mount dengan data=writeback,nobhdan program yang tidak memanggil fsync()atau sync()akan memiliki halaman kotor di RAM untuk ...

Pembaruan: Berdasarkan konteks Anda dalam edit pertanyaan Anda, saya akan mengatakan bahwa Anda harus menjalankan sistem file Anda dengan opsi mount data=journal,commit=1atau bahkan dengan syncopsi mount, hingga Anda dapat menyelesaikan panik kernel driver grafis Anda. Ini akan mempertahankan integritas data maksimum tetapi dengan biaya kinerja. Anda terutama ingin melakukan ini jika Anda sering menulis data ke disk yang Anda tidak mampu kehilangannya, dan itu sangat penting jika Anda tidak "mempercayai" aplikasi yang Anda gunakan untuk dipekerjakan dengan fsync()tepat.

Sumber: di sini dan pengalaman pribadi

allquixotic
sumber
1
Terima kasih, bagian "SEMUA data kotor" adalah persis apa yang saya khawatirkan! Saya khawatir bahwa ada lebih banyak pengecualian selain alokasi yang tertunda (yang dapat menyebabkan data baru tetap berada dalam cache tulis bahkan setelah interval komit).
lxgr
1
Saya cukup yakin bahwa alokasi yang tertunda sama sekali tidak relevan saat memanggil sync(atau, yang setara, ketika timer interval komit dipecat). Pada titik ketika syncselesai, sama sekali tidak ada data kotor, metadata atau halaman jurnal. Setiap perubahan pada sistem file selama transfer data sinkron diblokir sampai selesai.
allquixotic
1
Betulkah? Dalam bugs.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/45 disebutkan secara khusus bahwa halaman yang tidak dialokasikan TIDAK akan ditulis ke disk pada komit (tapi tentu saja pada fsync ()). Patch memperbaiki beberapa kasus umum di mana perilaku itu bermasalah dengan memaksa alokasi; Namun, tidak ada yang dikatakan tentang menimpa data.
lxgr
1
Ah, jadi commit=...dan syncBUKAN setara? Atau apakah tytso menyiratkan bahwa bahkan dengan syncitu tidak melakukan halaman yang tidak terisi? Saya tidak bisa membayangkan hal itu terjadi, karena itu akan melanggar spesifikasi POSIX. Mungkin Anda bisa menggunakan skrip bash yang saya berikan untuk keamanan data yang lebih baik: P
allquixotic
1
Saya cukup yakin maksudnya yang pertama, yang terakhir akan membuat ext4 di Linux sistem file yang cukup berbahaya untuk digunakan;) Skrip ini terlihat seperti solusi yang bagus; Saya akan mencobanya dan mungkin mengevaluasi beberapa aplikasi saya yang paling penting dengan strace - mungkin mereka semua menggunakan fsync (), dan saya terlalu khawatir ...
lxgr
1

Apa pun jawaban untuk pertanyaan Anda, tidak masalah.

The terkena dijamin perilaku filesystem ext4 adalah bahwa "data yang akan di disk setelah sukses sync/ fsyncpanggilan". Jadi, jika Anda memiliki aplikasi yang membuat Anda mengajukan pertanyaan ini, Anda harus memasukkan panggilan sinkronisasi di titik-titik kritis di mana integritas data perlu dipastikan. Jika Anda seorang pengguna khawatir tentang masalah yang sama, Anda dapat menghubungi syncutilitas baris perintah sebelum melakukan perilaku berbahaya apa pun yang dapat menyebabkan shutdown yang tidak bersih.

Borealid
sumber
Saya tahu tentang fsync (); Saya bertanya sebagai pengguna aplikasi yang mungkin atau mungkin tidak menggunakannya. Saya telah memperbarui pertanyaan saya.
lxgr