Linux'ta O_DIRECT Kullanımı


23

Bu soru çok programcı odaklı ise, bana bildirin. Acaba Linux 2.6'daki open () sistemi için O_DIRECT bayrağını bilen insanlar var mıdır? Linus kullanımdan ayrılır, ancak yüksek performanslı dosya yazımı onun kullanımını gösteriyor gibi görünmektedir. Gerçek bir dünya deneyimi ve önerileri hakkında bilmek istiyorum.

Daha çok bilgi: Ben kullanıyorum bu uygulama yok kendi önbellek korumak ve bunu yaparken 5x veya daha fazla hız kadar ortalama ulaşır. Dosyaya yazarken, önbellek içeriği gereksiz ve performans açısından endişeli görünen dosya sistemi önbelleğine yazılmalıdır.

Yanıtlar:


17

Tamam, deneyimler istiyorsun, bu soruyu biraz öznel ve tartışmacı, ancak tartışılabilir kılıyor.

Linus, insanların genellikle O_DIRECT'e atfedilen kullanımlara atıfta bulunduğunu ve bu kullanımlar için IMO Linus'un çoğunlukla doğru olduğunu söyledi. Doğrudan G / Ç yapsanız bile, verileri cihazlara doğrudan / doğrudan program deyimlerinize aktaramazsınız, doldurulmuş bir arabellek gerekir (program veya aygıt tarafından) ve bir sistem çağrısı yoluyla diğer uca aktarılır. Ayrıca, verimli hale getirmek için, daha önce okuduğunuz bir şeyi tekrar okumak zorunda kalmayacaksınız. Yani bir çeşit önbelleğe ihtiyacınız var ... ve bu tam da çekirdeğin O_DIRECT, sayfa önbelleği olmadan sağladığı özellik! Neden bunu kullanmıyorsun? Aynı anda daha fazla işlem aynı dosyaya aynı anda erişmek isterse, O_DIRECT ile felaket olur.

Bunu söyledikten sonra, O_DIRECT'in kullanımları vardır: Herhangi bir nedenle doğrudan blok cihazından veri almanız gerekiyorsa. Performansla ilgisi yok.

Performans için O_DIRECT kullanan kişiler genellikle kötü sayfa önbellek algoritmasına sahip sistemlerden veya POSIX öneri mekanizmalarına sahip olmayan sistemlerden ve hatta başkalarının söylediklerini akılsızca tekrarlayan kişilerden gelir. Bu sorunları önlemek için O_DIRECT bir çözümdü. Linux, OTOH, asıl temel sorunu çözmeniz gerektiği felsefesine sahiptir ve altta yatan sorun sayfa önbelleğe alma konusunda kötü bir iş yapan işletim sistemleridir.

Makinemde bir hafıza hatası bulmak için basit bir kedi uygulaması için O_DIRECT kullandım . Bu, O_DIRECT için geçerli bir kullanımdır. Bunun performansla alakası yok.


Bilgi için teşekkürler, takdir edilir. Sorumu, soruyu soran uygulamanın belirli koşullarıyla güncelledik. POSIX’in dosya yazma konusundaki tavsiye mekanizmaları hakkında daha fazla ayrıntıya sahipseniz, bu da memnun olacaktır.
casualunixer

4
o_direct, geliştiricinin uygulama katmanında önbellekleme mekanizması sağlamak istediği bir sistemde de faydalı olabilir (veritabanlarını düşünün).
Jmoney38

Performansla ilgisi yok. Bu, özellikle IO'nun rakip bellek bant genişliğini veya hatta sadece önemli bir bellek bant genişliği yüzdesini oranladığı yüksek hızlı bir cihaza erişmek için doğru değildir. Bu durumda, fazladan kopyayı sayfa önbelleğine / sayfasından atlamak, önemli performans avantajlarına sahip olabilir.
Andrew Henle

13

Aslında, O_DIRECT her ikisinden de kaçınmak için gerekli

  • önbellek kirliliği - bazen önbelleğe almanın genel anlamda bir anlamı olmadığını biliyorsunuzdur, örneğin gerçekten büyük dosyalarla uğraşırken, yalnızca 2 GiB RAM olduğunda 64 GiB diyelim. Bir kullanıcının doğrulamaya karar verdiği 32 GiB'nin Torrent dosyası, önbellekleme için iyi bir aday gibi görünmüyor. Sadece kendi ek yükü ile ekstra bir aktivite. Ve bazı gerçekten yararlı verilerin önbellekten budanmasına neden olabilir.
  • çift ​​önbellekleme - örneğin bazı RDBMS'ler için (bahsetmek istenen MySQL) kendi önbelleğini tanımlamaya izin verir. Veritabanlarının, önbelleklemenin nasıl yapıldığını ve neyin daha iyi olduğunu bildiği, SQL planlama ve benzeri hakkında hiçbir şey bilmeyen çekirdeğin Sanal Belleğinden daha iyi olduğunu biliyoruz.

- ki göründüğü kadar iyi değil. Ve O_DIRECTdaha hızlı olmak demek değildir, çoğu zaman değildir .


10
posix_fadviseÖnbellek kirliliği sorununu halledebilir.
psusi

Sanal Hafızanın bununla bir ilgisi olduğunu sanmıyorum, sadece hafıza adresini gösteriyor. Tampon Önbellek / Sayfa Önbelleği ne demek istiyorsun.
ArekBulski

Önbellek / önbellekleme, UNIX'teki VM alt sisteminin bir parçasıdır, söyleyebileceğim kadarıyla, bu yüzden bu terimi kullandım. Düzenleme için teşekkürler. :)
poige

6

O_DIRECTYeni dosya sistemlerinde yeni çekirdeklerde kullanımın başarısız olabileceğini unutmayın . Örneğin bu hata raporuna bakın . Bu nedenle, yalnızca kullanım çoğu zaman şüpheli olmakla kalmaz, gelecek nesil Linux dağıtımlarında da hiç çalışmayacaktır. Bu yüzden, bunun bir faydası olduğunu kanıtlayabilseniz bile, kodumun performansı üzerine bahse girmem.


1
Hata raporu aslında dosya sistemlerinin kullanımını journal = data seçeneğindeki on ile tartışıyor. Bu seçenek doğrudan O_DIRECT bayrağının tam karşısındadır. Çoğu ext3 ve ext4 dosya sistemi bu bayrak kümesine sahip değildir ve eğer öyleyse, onu kapatmak, dosyanın O_DIRECT ile açılmasına izin verir.
casualunixer

3

Performansla ilgili çok şey var.

İlginç bir örnek mmap motorunu kullanarak mongodb'da. O_DIRECT, diğerlerinin de belirttiği gibi, verilerin bir süredir okunamayacağı durumlarda en iyi şekilde kullanılır. Mongodb'da, veritabanı günlüğü O_DIRECT kullanılarak yazılırken, veri ve indeksler sayfa önbellek mekanizması (pdflush) tarafından işlenirken, O_DIRECT daha az bant genişliği sunsa da, daha az gecikme anlamına gelir ve dolayısıyla veri kaybını azaltır. beklenmeyen kesinti (çekirdek panik, disk veya elektrik kesintisi). Bir O_DIRECT yazma işlemi geçici olmayan depolama işlemine karar vermeden önce hala tamponlama olduğunu unutmayın, bu sadece veri kaybını azaltır.

O_DIRECT'in bir diğer önemli özelliği, yazı dizisi üzerinde daha fazla kontrol sağlamasıdır . Yine, yazma sırasını garanti etmiyor (geçici olmayan bir önbellekleme disk denetleyiciniz olmadıkça ve beşinci zamanlayıcı kullanıyorsanız, ancak bunların kendi komplikasyonları yoktur). Bu nedenle, mysql veri / indekslerinin yanı sıra dergicilik için de O_DIRECT'i kullanmasına rağmen, ikincisinin genellikle ilk önce taahhüt edilmesini bekleyebilir.

Ancak, O_DIRECT'in kaynak tahsisindeki adaleti bozduğunu hatırlamak önemlidir. Başvurunuzun hızlandırılmasının sebeplerinden biri, diğer şeyleri yavaşlatmasıdır.


Performansla ilgisi olduğunu söylediniz, ancak gecikmeyi azaltmak veya yazı yazmak için kullanıldığı bir örnek veriyorsunuz. Ancak performansı etkilediğine katılıyorum. Adalet hakkında adil nokta.
ArekBulski,

Haksız olduğunu açıklayan daha fazla referans verebilir misiniz?
ACyclic

3

@Juliano'nun söylediği şeyle ilgili.

Ödeme posix_fadviseasıl sorun aksaklığı dosya sisteminin önbellek algoritması altında yatan ait ise, nasıl dosya sistemini kullanacağız, bunu tavsiyelerde deneyebilirsiniz. Güzelce uygulanan fs için performans artışı sağlamalıdır. (Benzer düşüncelere dokunarak başka bir konuya bağlantı verilmiştir. Https://stackoverflow.com/a/3755818/544721 )


1
Posix_fadvise, çekirdek tarafından kullanılan okuma hızı algoritmalarını değiştiriyor gibi gözüküyor. Söz konusu kodda kritik faktör yazma performansıdır. Sorun şu ki, arabellek yazmanın ilk önce Linux önbelleklerini doldurması, çekirdeğin bellek yetersiz kaldığında boşaltması gerekir. Bu bir çaba kaybıdır, bu durumda çıktının diske giderken en az miktarda tamponlanması gerekir.
casualunixer
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.