Klarifikasi pada variabel innodb_flush_method MySQL

21

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.

Derek Downey
sumber
2
Saya tidak tahu apakah Mac OS X mendukung opsi IO langsung yang tepat - saya pikir itu tidak. Anda adalah orang kedua yang saya lihat hari ini menjadi bingung oleh halaman manual itu. Saya punya bug terbuka di sini: bugs.mysql.com/bug.php?id=54306
Morgan Tocker

Jawaban:

16

Berikut ini penjelasan tentang cara fdatasync()kerja vs cara fsync()kerjanya

fdatasync()flush semua buffer data file ke disk (sebelum panggilan sistem kembali). Itu menyerupai fsync()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 memanggil fsync()segera untuk memastikan bahwa data tertulis secara fisik disimpan di harddisk. Sayangnya, fsync()akan selalu memulai dua operasi penulisan

  • satu operasi tulis untuk data yang baru ditulis
  • satu operasi tulis untuk memperbarui waktu modifikasi yang disimpan dalam inode

Jika waktu modifikasi bukan bagian dari konsep transaksi, maka fdatasync()dapat digunakan untuk menghindari operasi penulisan inode disk yang tidak perlu.

Dalam bahasa Inggris, O_DSYNClebih cepat daripada O_DIRECTsejak O_DIRECTpanggilan fsync()dua kali (satu untuk log dan satu untuk data) dan fsync()memverifikasi penulisan data melalui dua operasi penulisan. Menggunakan O_DSYNCpanggilan fdatsync()dan fsync(). Anda dapat fdatasync()melakukan asynchronous fsync()(tidak memverifikasi data).

Melihat angka-angkanya, O_DSYNCapakah empat operasi tulis, dua di antaranya diverifikasi, sementara fsync()empat operasi penulisan, semuanya diverifikasi setelah itu.

KESIMPULAN

  • O_DSYNC
    • lebih cepat dari O_DIRECT
    • Data mungkin / mungkin tidak konsisten karena latensi atau kerusakan total
  • O_DIRECT
    • lebih stabil
    • data konsisten
    • secara alami lebih lambat

Saya harap jawaban ini membantu, dan saya harap saya tidak memperburuk keadaan bagi Anda.

RolandoMySQLDBA
sumber
2
Layak menunjukkan: O_DIRECT hanya digunakan pada file tabel-ruang, bukan pada log. Juga - apakah O_DIRECT akan berguna atau tidak tergantung pada perangkat keras. Saya ditautkan ke bug dokumentasi terbuka sebagai komentar untuk pertanyaan penulis.
Morgan Tocker
Terima kasih telah mengklarifikasi itu, Morgan. Saya akan memperbaikinya.
RolandoMySQLDBA
O_DSYNC adalah menulis sinkron, bagaimana Anda dapat menyimpulkan bahwa lebih cepat asynchronous + fsync?
noonex
@noonex fdatasync () sinkron untuk datanya, bukan metadata-nya. Menurut informit.com/articles/article.aspx?p=23618&seqNum=5 , 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.
RolandoMySQLDBA
@noonex Menurut en.wikipedia.org/wiki/Sync_(Unix) , 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).
RolandoMySQLDBA