Mari saya mulai dengan mengakui bahwa saya sangat tidak tahu cara kerja hard disk. Jadi ketika saya membaca manual untuk variabel innodb_flush_method , itu membingungkan saya. Dapatkah saya mendapatkan penjelasan dalam istilah awam tentang perbedaan dalam O_DSYNC dan O_DIRECT, dan bagaimana cara mengetahui apakah ini masalah kinerja pada server database.
Beberapa statistik pada pengaturan saya: Mac OSX 10.6 (kernel 32-bit, karena arsitektur sudah ketinggalan zaman) menjalankan MySQL 5.1.49-64bit (berharap itu akan memungkinkan saya untuk menggunakan memori). RAM 8GB, ~ 6GB data / indeks innodb.
Jawaban:
Berikut ini penjelasan tentang cara
fdatasync()
kerja vs carafsync()
kerjanyafdatasync()
flush semua buffer data file ke disk (sebelum panggilan sistem kembali). Itu menyerupaifsync()
tetapi tidak diperlukan untuk memperbarui metadata, seperti waktu akses. Aplikasi yang mengakses database atau file log sering menulis fragmen data kecil (misalnya, satu baris dalam file log) dan kemudian memanggilfsync()
segera untuk memastikan bahwa data tertulis secara fisik disimpan di harddisk. Sayangnya,fsync()
akan selalu memulai dua operasi penulisanJika waktu modifikasi bukan bagian dari konsep transaksi, maka
fdatasync()
dapat digunakan untuk menghindari operasi penulisan inode disk yang tidak perlu.Dalam bahasa Inggris,
O_DSYNC
lebih cepat daripadaO_DIRECT
sejakO_DIRECT
panggilanfsync()
dua kali (satu untuk log dan satu untuk data) danfsync()
memverifikasi penulisan data melalui dua operasi penulisan. MenggunakanO_DSYNC
panggilanfdatsync()
danfsync()
. Anda dapatfdatasync()
melakukan asynchronousfsync()
(tidak memverifikasi data).Melihat angka-angkanya,
O_DSYNC
apakah empat operasi tulis, dua di antaranya diverifikasi, sementarafsync()
empat operasi penulisan, semuanya diverifikasi setelah itu.KESIMPULAN
O_DSYNC
O_DIRECT
O_DIRECT
Saya harap jawaban ini membantu, dan saya harap saya tidak memperburuk keadaan bagi Anda.
sumber
This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.
Pada saat saya menulis posting saya 3,5 tahun yang lalu, itu benar, terutama dengan versi Linux yang lebih lama.The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.
(Wiki itu terakhir diperbarui 28 Juli 2014).