GNU/Linux >> Belajar Linux >  >> Linux

Apakah rename() tanpa fsync() aman?

Jika Anda hanya peduli tentang ext4 dan bukan ext3 maka saya sarankan menggunakan fsync pada file baru sebelum melakukan penggantian nama. Performa fsync di ext4 tampaknya jauh lebih baik daripada di ext3 tanpa penundaan yang sangat lama. Atau mungkin fakta bahwa writeback adalah mode default (setidaknya di sistem Linux saya).

Jika Anda hanya peduli bahwa file tersebut lengkap dan bukan file mana yang disebutkan dalam direktori, maka Anda hanya perlu melakukan fsync file baru. Tidak perlu melakukan fsync direktori juga karena ini akan mengarah ke file baru dengan data lengkapnya, atau file lama.


Tidak.

Lihatlah libeatmydata, dan presentasi ini:

Eat My Data:Bagaimana Setiap Orang Mendapat File IO yang Salah

http://www.oscon.com/oscon2008/public/schedule/detail/3172

oleh Stewart Smith dari MySql.

Jika offline/tidak lagi tersedia, saya menyimpan salinannya:

  • Videonya di sini
  • Slide presentasi (slide versi online)

Dari dokumentasi ext4:

When mounting an ext4 filesystem, the following option are accepted:
(*) == default

auto_da_alloc(*)    Many broken applications don't use fsync() when 
noauto_da_alloc     replacing existing files via patterns such as
                    fd = open("foo.new")/write(fd,..)/close(fd)/
                    rename("foo.new", "foo"), or worse yet,
                    fd = open("foo", O_TRUNC)/write(fd,..)/close(fd).
                    If auto_da_alloc is enabled, ext4 will detect
                    the replace-via-rename and replace-via-truncate
                    patterns and force that any delayed allocation
                    blocks are allocated such that at the next
                    journal commit, in the default data=ordered
                    mode, the data blocks of the new file are forced
                    to disk before the rename() operation is
                    committed.  This provides roughly the same level
                    of guarantees as ext3, and avoids the
                    "zero-length" problem that can happen when a
                    system crashes before the delayed allocation
                    blocks are forced to disk.

Dilihat dari kata-kata "aplikasi rusak", ini pasti dianggap sebagai praktik buruk oleh pengembang ext4, tetapi dalam praktiknya pendekatan ini digunakan secara luas sehingga ditambal di ext4 itu sendiri.

Jadi, jika penggunaan Anda sesuai dengan polanya, Anda harus aman.

Jika tidak, saya sarankan Anda untuk menyelidiki lebih lanjut daripada memasukkan fsync sana-sini hanya untuk aman. Itu mungkin bukan ide yang bagus sejak fsync bisa menjadi hit kinerja utama di ext3 (baca).

Di sisi lain, pembilasan sebelum mengganti nama adalah cara yang benar untuk melakukan penggantian pada sistem file non-penjurnalan. Mungkin itu sebabnya ext4 pada awalnya mengharapkan perilaku ini dari program, auto_da_alloc opsi ditambahkan kemudian sebagai perbaikan. Tambalan ext3 untuk mode writeback (non-jurnal) ini juga mencoba membantu program yang ceroboh dengan membilas secara asinkron saat mengganti nama untuk menurunkan kemungkinan kehilangan data.

Anda dapat membaca lebih lanjut tentang masalah ext4 di sini.


Linux
  1. Memindahkan file di Linux ke C

  2. grep tanpa menunjukkan path/file:line

  3. Hapus file tanpa diminta

  1. Ganti nama file di terminal Linux

  2. Memindahkan file di Linux tanpa mv

  3. Kelahiran Kosong Di Ext4?

  1. Apakah Mv Atomic Di Fs?

  2. Ganti Nama Mass File Bash Dengan Penghitung?

  3. Mv Menimpa File Hanya-Baca Tanpa Diminta?