GNU/Linux >> Belajar Linux >  >> Linux

O_DIRECT vs. O_SYNC di Linux/FreeBSD

Dengan harddisk saat ini, tidak ada jaminan bahwa file benar-benar ditulis ke disk bahkan jika disk melaporkan penulisan selesai ke OS! Ini karena cache bawaan di drive.

Di freeBSD Anda dapat menonaktifkan ini dengan menyetel kern.cam.ada.write_cache sysctl ke 0. Ini akan menurunkan kinerja tulis secara signifikan . Terakhir kali saya mengukurnya (harddisk WDC WD5001ABYS-01YNA0 pada chipset ICH-7, FreeBSD 8.1 AMD64), kinerja tulis berkelanjutan (diukur dengan dd if=/dev/zero of=/tmp/foo bs=10M count=1000 ) turun dari 75.000.000 byte/dtk menjadi 12.900.000 byte/dtk.

Jika Anda ingin benar-benar yakin bahwa file Anda ditulis;

  • Nonaktifkan cache tulis dengan sysctl kern.cam.ada.write_cache=0 diikuti oleh camcontrol reset <bus>:<target>:<lun> .
  • Buka file dengan O_SYNC opsi.

Catatan:

  • Kinerja tulis Anda (pada HDD) sekarang akan benar-benar payah.
  • Jangan memasang partisi dengan sync pilihan; yang akan menyebabkan semua I/O (termasuk pembacaan) dilakukan secara sinkron.
  • Jangan gunakan O_DIRECT . Ini akan mencoba mem-bypass cache sama sekali. Itu mungkin juga akan memengaruhi pembacaan.

O_DIRECT pada dasarnya hanya ada untuk Oracle untuk melewati lapisan cache buffer kernel dan melakukan caching sendiri. Ini memiliki semantik yang tidak jelas, batasan sewenang-wenang pada ukuran dan penyelarasan bacaan yang dapat Anda lakukan, dan umumnya tidak boleh digunakan. O_SYNC seharusnya memberi Anda efek yang Anda inginkan, tetapi tanpa sistem file dasar yang kuat terhadap kegagalan daya atau kerusakan, itu mungkin masih belum cukup untuk kebutuhan Anda.


Linux
  1. Cara Menggunakan Perintah Grep di Linux atau FreeBSD

  2. Izin File di Linux – Baca/Tulis/Jalankan

  3. papan klip linux baca/tulis dalam C

  1. Cara Menulis Teks Pada Gambar menggunakan Perintah Linux

  2. menguji ruang disk di linux

  3. Cara membersihkan cache penyelesai DNS di Linux (dan FreeBSD)

  1. Cara Menghapus Cache Memori di Linux

  2. Linux – Penggunaan O_direct Di Linux?

  3. Periksa koneksi terbuka atau tertutup? (dalam C di Linux)