SORU
8 Kasım 2011, Salı


Dosya hızlandırma G/Ç: () yüksek vs okumak()

Paralel 150-200 dosyaları (4-10 GB) okur Linux bir uygulama var. Her dosya küçük sırayla, degisken bloklar, 2K daha genellikle daha az büyüklükte her okunur.

Ben şu anda 200 MB/s okuma hızı dosya kümesinden birlikte korumak gerekir. Diskleri gayet iyi başa. S/1 GB anda disk ulaşamayacağı bir yerde olduğu tahmin gereksinimi var.

Her ikisi de posix_advise yoğun kullanımı iki farklı okuma sistemleri uyguladık: ilk veri ve isteğe bağlı olarak okumak tamamını biz göster mmaped okunur. İkinci*/seek() *3 tabanlı bir sistem.

Her ikisi de iyi çalışır ama sadece orta vakalarda, read() yöntem yönetir bizim genel dosya önbelleği çok daha iyi olabilir anlaşma ile 100'ler GB dosyaları, ama kötü oranı sınırlı, mmap da dahil olmak üzere ön-önbellek veri verme sürdürülebilir veri oranı üzerinden 200MB/s bakımı kolay, ancak anlaşma ile büyük toplam veri seti boyutları.

Benim sorum şu geliyor:

Bir: read() tip dosya g/Ç olmak daha da optimize ötesinde posix_advise çağrı Linux veya sahip ayarlı disk zamanlayıcı, FOR ve posix_advise aramaları o kadar iyi miyiz bekliyorsun?

B: yüksek sistematik yöntemler daha çok büyük eşlenen veri ile başa çıkmak için Vardır?

Mmap-vs-reading-blocks çalışıyorum ne benzer bir sorundur ve bu sorun, iyi bir başlangıç noktası, mmap-vs-read tartışmaları ile birlikte verilir.

CEVAP
8 Kasım 2011, Salı


Ne için okur? Bu veriler, nihai hedef nedir?

IO bağlı tamamen öyle görünüyor beri, mmap read hiç bir fark yapmak gerekir. İlginç kısmı alıcının veri almak nasıl olduğunu.

Bir boru için bu veri yerleştirme iseniz, sadece boru içine bütünüyle her dosyanın içeriğini dökümü tavsiye ederim. Bu sıfır-kopya kullanarak yapmak, splice sistem aramayı deneyin. Ayrıca el ile dosya kopyalama veya cat bir örnek, ya da ağır stdin ve stdout boru olarak geçerli dosya ile tampon bazı diğer aracı çatallaşma deneyebilirsiniz.

if (pid = fork()) {
    waitpid(pid, ...);
} else {
    dup2(dest, 1);
    dup2(source, 0);
    execlp("cat", "cat");
}

Update0

Eğer dosya işleme-agnostik, ve rastgele erişim gerektirmez ise, bir boru hattı seçenekleri yukarıda belirtilen kullanarak oluşturmak istiyorum. İşleme adım stdın, ya da bir borudan veri kabul etmelidir.

Daha spesifik sorularınızı yanıtlamak için:

Bir: read() dosya türü G/Ç olmak daha da optimize ötesinde posix_advise aramalar Linux veya sahip ayarlı disk zamanlayıcı, FOR ve posix_advise aramaları o kadar iyi miyiz bekliyorsun?

Bu konuda ile daha iyi bir kullanıcı neler yapılması gerektiği konusunda çekirdek söylüyorum. Gerisi size kalmış: tampon, diş çekme vb. ama tehlikeli ve muhtemelen verimsiz bir tahmin. Sadece bir boru içine dosya ekleme ile gitmek istiyorum.

B: yüksek sistematik yöntemler daha çok büyük eşlenen veri ile başa çıkmak için Vardır?

Evet. following options harika performans avantajları (ve test ile okuma üzerinde yüksek değer kullanılarak, olabilir) verebilir:

  • MAP_HUGETLB Eşleme "büyük sayfa." kullanarak tahsis

    Bu ise gigabyte büyüklüğünde dosya eşleme eğer disk belleği yükü büyük olan çekirdek, içinde azaltacaktır.

  • MAP_NORESERVE Bu eşleştirme için takas alanı ayırmak. Takas alanı ayrılmıştır, bir eşlemeyi değiştirmek mümkündür garantisi vardır. Takas alanı ayrılmıştır zaman, eğer bir hayır fiziksel bellek varsa bir yazma üzerine SIGSEGV alabilirsiniz.

    Bu aslında tüm bu eşleştirme için yeterli fiziksel bellek takas yok eğer doğru değilse uygulamanızda size basit tutarken bellek çalışmasını engeller.**

  • MAP_POPULATE (Prefault) bir eşleme sayfa tabloları doldurmak. Dosya eşleme için, bu neden ileri okuma dosyası. Eşleme sonra erişir sayfa hataları yüzünden kapalı olacak.

    Bu sana yeterli donanım kaynakları ile hız-up verebilir, ve eğer önbelleğe emretti, ve tembel. Bu bayrak, gereksiz olduğunu düşünüyorum, VFS büyük olasılıkla bu varsayılan olarak daha iyi yapar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3DS Max Tutorials

    3DS Max Tuto

    4 AĞUSTOS 2013
  • jagadambarecords

    jagadambarec

    13 AĞUSTOS 2008
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013