Hangi noktada asenkron disk G / Ç okuması senkrondan daha verimlidir?


22

Birden fazla tüketici için dosyaları okuyan bir kod parçası olduğunu ve dosyaların herhangi bir rasgele boyutta olduğunu varsayalım: Dosyayı ne zaman uyumsuz olarak okumak daha verimli hale gelir? Veya başka bir deyişle, bir dosyayı eşzamanlı olarak okumak için daha hızlı olması için ne kadar küçük olması gerekir?

Çok küçük dosyaları okurken, eşzamanlı olarak (özellikle .NET ile) zaman uyumsuz olarak okumak daha uzun sürdüğünü fark ettim (ve belki de hatalıyım). Bunun, G / Ç Tamamlama Bağlantı Noktaları, iş parçacıkları, vb. İşlemler için ayar süresiyle ilgili olduğunu farz ediyorum.

Burada yardımcı olmak için herhangi bir kural var mı? Yoksa sisteme ve çevreye mi bağlı?


Karşılaştırma için kullandığınız kodu verebilir misiniz? Bunun yalnızca dosya boyutunun akış okuyucunun iç tampon boyutundan daha küçük olması durumunda gerçekleşebileceğini düşünüyorum. Ama eğer birçok küçük dosyayı okumak zorundaysanız, muhtemelen disk g / ç ile ilgili diğer problemlere
varacaksınız

Kodum kullanışlı değil, korkarım. Bir süre önce karşılaştığım bir şeydi ve o zamandan beri aklımdaydı. Kod .NET olduğunu ve bir döngü için de FileStream.BeginRead () vs) (esasen düz bir File.ReadAllBytes oldu
blesh

Verimliliğini temsil eden eğriler ve eşzamansız IO, eşzamanlı IO eğrisinden daha yüksek bir değerde çaprazdan çıkar.
Thomas Eding 12:12

Yanıtlar:


14

Ne yazık ki, cevabı "bağlıdır." Asenkron ve senkronize okumaların zamanlarını deneysel olarak belirlemek için küçük bir program yazmanız kolay olacaktır.

Bir çok faktöre bağlı olacaktır. Dönen disklerde, SSD'de veya bir ağ sürücüsünde depolanıyorlar mı? Ne tür bir CPU kullanıyorsunuz? Kaç soket / çekirdek? Bir VM'de mi yoksa çıplak metalde mi çalışıyorsunuz? Eski bir işletim sistemi mi yoksa modern bir işletim sistemi mi kullanıyorsunuz?


1
Evet, ben de öyle düşündüm. Sanırım bir rehber ya da kural olarak kullanacak bir çalışma olduğunu umuyordum.
12:12

9

Async'in 3 ana avantajı vardır:

  1. CPU kullanımını düşürür. Ayrıca, okuduğunuz verilerle CPU-yoğun işlemler yapıyorsanız da yararlı olabilir.
  2. Bir tür zaman uyumsuz altyapı kullanmak, kodları paralel hale getirmeyi kolaylaştırır. Özellikle de çok fazla dosya okuyorsanız.
  3. OS'ye birden fazla okuma-yazma isteği göndererek, OS ve HW bu işlemlerin daha hızlı tamamlanmasını tekrar sipariş edebilir. SATA2 böyle bir özelliğe sahiptir.

Eşzamansız okumanın asıl avantajının, çok fazla dosyayla çalıştığınızda veya çok fazla CPU gücüne ihtiyacınız olduğuna inanıyorum.


Eğer G / Ç işlemi tıkanıklıksa, 2. maddenin hiçbir şeyi optimize edemeyeceğini not edin. Paralel olarak, RAID veya ağ üzerinden farklı disklerde bulunan dosyalara erişiyorsanız işler farklıdır.
Arseni Mourzenko 12:12

5
Hmm, # 1 ile ne demek istediğinizi anlamada sorun yaşıyorum. Pratikte bunun diğer yolu olduğunu söyleyebilirim. Çünkü eşzamansız durumla, iş parçacığınızı şimdi blocked waiting for I/O(% 0 CPU) 'dan continue normal processing(>% 0 CPU)' ya değiştiriyorsunuz.
Isak Savo

3

değişir

Akılda tutulması gereken bir şey süreçleri arasında bir bağlam geçişi ne kadar pahalı olmasıdır. Node.JS, bir bağlam anahtarı yapmanın çok pahalı olduğunu varsaydığı için tasarlandı, aksi halde bilgisayarı aşağı indirecek olan IE'de bekleyen birçok işleminiz olacak.

Öte yandan, Erlang bir işlem bağlamı anahtarını çok ucuz kılar, böylece her şey senkronize olur ve Erlang çalışma süresi her şeyi takip eder.

Yani dikkate alınması gereken faktörler:

  • Bir içerik değiştirme işleminin maliyeti
  • arama işlemleri için diskin hızı
  • okuma işlemleri için diskin hızı
  • önbellekteki dosyalar

Ve bir düzine faktörü bıraktığımdan eminim


2

Belirli bir "nokta" olduğundan emin değilim, ancak çok fazla iş parçacığı olduğunda en mantıklı olanıdır, çünkü I / O'nuzu diğer işlerle üst üste binmenize izin verir. Boşta kalan boş iş parçacıklarınız varsa, zaman uyumsuz olarak okumak size bir avantaj sağlamaz. Sadece iş kuyruğunuzu doldurduğunuzda ve iş parçacığınız, zaman zaman asenkron dosya erişiminin herhangi bir avantaj sağladığı G / Ç için beklemek yerine başka işler yapıyor olabilir.


evet, okuyucunun bütün mesele bu!
Vlad

1

Bence buradaki problem gecikme olduğu gibi okuma hızlarının fazla olmadığı.

Bir ağ sürücüsünden veya uzun kuyrukları olan yavaş bir mekanik sabit disk sürücüsünden okuyorsanız, performans okumak için bir adım atar. Uygulamanız GUI iş parçacığında okuma da yapıyorsa, bu durumda bu çok kötü bir uygulama, kullanıcı için korkunç olacaktır.

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.