Çoklu iş parçacığı neden tek iş parçacığından daha hızlı indiriliyor?


13

Sunucumda büyük bir dosya var. Çoklu iş parçacığı indirme işleminin 20Mbs alabileceğini, ancak tek iş parçacığının 10Mbps alabildiğini biliyorum, bunu herkes açıklayabilir mi?


Aynı TCP bağlantısına hizmet veren birden fazla iş parçacığı mı, yoksa her biri ayrı TCP bağlantısı olan birden fazla iş parçacığı? Ayrıca sunucunun çok iş parçacığı veya istemci çok iş parçacığı olduğunu mu söylüyorsunuz?
Spiff

Yanıtlar:


14

Genelde bunun nedeni, sizinle diğer sunucu arasında bir yerde, her HTTP akışını 10 Mbps ile sınırlayan bir güvenlik duvarı olmasıdır. Çoklu iş parçacığı kullandığınızda, 2x 10 Mb (her iş parçacığı için bir tane) alırsınız.


1
FTP kullanıyorum ve sunucumda sınırlama yok
neden

@why: belki her bağlantıyı 10mbps ile sınırlayan ISS'niz olabilir? Bir hız test cihazında bundan daha fazlasını alabilir misiniz?
André Paramés

4

Bunun nedeni siz ve sunucu arasındaki ping ve indirme yazılımınız tarafından kullanılan paket boyutu / tcpip pencere boyutu.

Temel olarak, sunucuya 100ms pinginiz varsa ve 100kb'lık paket talep ediyorsanız, internet hızınız sınırsız olsa bile, yalnızca 1 bağlantı kullanarak saniyede 10 paket alabilirsiniz.


Alıcının tamponunu makul bir oranda boşalttığı sürece, göndericinin sürekli olarak pompalayabilmesi için her paketi ACK yapmanız gerekmez.
André Paramés

Doğru. Ancak
256kb

3

TCP, "boruyu dolu tuttuğunuzda" en iyi şekilde çalışır - gönderen uygulama, gönderen TCP yığınını sürekli olarak veri ile birlikte tutacak kadar hızlı bir şekilde arabellek göndermeye devam ettiğinde, böylece ağda "uçuş sırasında" her zaman verilerini alabilmesi için Uygulama, alıcı TCP yığınının, alıcı TCP penceresinin asla dolmayacağı kadar hızlı bir şekilde okumaya devam eder (yine, gönderen TCP yığınının her zaman ağdaki "uçuş halindeki" verilerini saklayabilmesi).

Bir yığınını TCP yığınına geçiren, tamamen Acked olduğunu duymayı bekleyen ve ardından başka bir arabellekten geçen kötü yazılmış bir tek iş parçalı gönderen uygulaması hayal edebiliyorum. Bu, ilk tamponun sonu bir kez ağda "uçuşta" olduğunda, gönderen TCP yığının verilerin gönderilmesi için aç bırakıldığı anlamına gelir; bu, borunun boşaldığı ve Ack geri dönene ve gönderen uygulamanın sonuna kadar doldurulmadığı anlamına gelir. yeni bir arabellek geçer.

Yeterince hızlı bir şekilde alıcı TCP yığından okumayan ve bu nedenle TCP yığınının tamponlarını doldurmasına olanak tanıyan kötü yazılmış bir tek iş parçacıklı alıcı uygulaması hayal edebiliyorum, bu da TCP penceresinin dolmasına neden oluyor, bu da gönderen TCP yığınının bazı pencereler açılıncaya kadar göndermeyi durdurun. Alıcının TCP pencere boyutunu artırmak biraz yardımcı olabilir, ancak bu uçtaki asıl çözüm verileri daha hızlı okumaktır.


Öyleyse, tek dişli olmakla ilgisi yok mu?
Ape-inago

@ Ape-inago Elbette, iyi yazılmış, tek iş parçacıklı bir uygulama boruyu tam olarak tutabilir, evet.
Spiff

2

Muhtemelen bunun nedeni, bir bağlantı üzerinden sadece çok fazla veri aktarabilmenizdir. Ancak çok iş parçacıklı bir programda aynı anda veri alan iki bağlantıya sahip olabilir ve elde edebileceğiniz bilgi miktarını iki katına çıkarabilirsiniz. Bunun için bazı sınırlamalar vardır, örneğin indirdiğiniz sunucunun hızı ... Çok parçalı indiriciyi her kim yazdıysa, bunları yazmak kolay değildir.


1
Neden bu kadar zor? Her bir konu için ayrı bir bölüm ayırmanız ve sonuç dosyasının uygun bölümüne yazmasına izin vermeniz yeterlidir. Akselin kaynağı benim için oldukça basit görünüyor.
André Paramés
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.