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?
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?
Yanıtlar:
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.
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.
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.
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.