MySQL ile ilgili açıklama innodb_flush_method değişkeni


21

Sabit disklerin iç çalışmalarını çok cahil olduğumu kabul ederek başlayayım. Bu yüzden innodb_flush_method değişkeni için el kitabını okuduğumda , kafam karıştı. Layman'ın O_DSYNC ve O_DIRECT'teki farklılıklar ve bir veritabanı sunucusundaki performans sorunu olup olmadığını nasıl anlatacağım hakkında bir açıklama alabilir miyim.

Kurulumumdaki bazı istatistikler: MySQL 5.1.49-64bit çalıştıran Mac OSX 10.6 (32-bit çekirdek, çünkü mimarisi güncel değil) (hafızayı kullanmama izin vereceğini umuyorum). 8GB RAM, ~ 6GB innodb veri / dizinler.


2
Mac OS X'in doğrudan bir doğru IO seçeneğini destekleyip desteklemediğini bilmiyorum - Ben öyle olduğunu düşünmedim. Bugün gördüğüm ikinci insansın , bu kılavuz sayfasının kafası karışıyor. Burada açık bir hatam
Morgan Tocker 21:11

Yanıtlar:


16

İşte nasıl fdatasync()çalıştığını vs nasıl fsync()çalıştığını bir açıklama

fdatasync()Bir dosyanın tüm veri tamponlarını diske temizler (sistem çağrısı geri gelmeden önce). Benzer fsync()fakat erişim süresi gibi meta verileri güncellemeniz gerekmiyor. Veritabanlarına veya günlük dosyalarına erişen uygulamalar genellikle küçük bir veri parçası yazar (örneğin, bir günlük dosyasındaki bir satır) ve ardından fsync()yazılı verilerin fiziksel olarak sabit diskte depolandığından emin olmak için derhal arar . Ne yazık ki, fsync()her zaman iki yazma işlemi başlatacak

  • yeni yazılmış veriler için bir yazma işlemi
  • inode'da depolanan değişiklik zamanını güncellemek için bir yazma işlemi

Değişiklik süresi işlem konseptinin bir parçası değilse, fdatasync()gereksiz inode disk yazma işlemlerini önlemek için kullanılabilir.

İngilizcede O_DSYNCdaha hızlı olduğunu O_DIRECTçünkü O_DIRECTaramalar fsync()iki kez (veri için günlükleri için) diğeri ve fsync()iki yazma işlemleri yoluyla doğrular veri yazma. O_DSYNCÇağrıları kullanma fdatsync()ve fsync(). fdatasync()Bir eşzamansız yaptığınızı düşünebilirsiniz fsync()(veriyi vermemek).

Rakamlara bakıldığında O_DSYNC, ikisi onaylanmış olan fsync()dört yazma işlemi gerçekleştirilir, ardından dört yazma işlemi yapılır;

SONUÇ

  • O_DSYNC
    • daha hızlı O_DIRECT
    • Veri, gecikme veya düpedüz çarpışma nedeniyle tutarlı olabilir / olmayabilir
  • O_DIRECT
    • daha kararlı
    • veri tutarlı
    • doğal olarak daha yavaş

Umarım bu cevap yardımcı olur ve umarım sizin için işleri daha da kötüleştirmedim.


2
Kayda değer: O_DIRECT, günlüklerde değil, yalnızca tablo alanı dosyalarında kullanılır. Ayrıca - O_DIRECT'in faydalı olup olmayacağı donanıma bağlıdır. Açık bir dokümantasyon hatasını, yazarın sorusuna yorum olarak bağladım.
Morgan Tocker

Bunu açıkladığın için teşekkürler, Morgan. Bunu düzelteceğim.
RolandoMySQLDBA 21:11

O_DSYNC eşzamanlı yazmadır, eşzamansız + fsync hızının daha hızlı olduğu sonucuna nasıl varabilirsiniz?
öğlen

@ noonex fdatasync () meta verileri için değil verileriyle eşzamanlıdır. Göre 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.ben 3,5 yıl önce benim yazı yazdım zamanda, özellikle Linux eski sürümleri ile, doğruydu.
RolandoMySQLDBA

@ noonex en.wikipedia.org/wiki/Sync_(Unix ' e göre ) , 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.(Bu Wiki en son 28 Temmuz 2014 tarihinde güncellenmiştir).
RolandoMySQLDBA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.