Mengapa mengunduh multi utas lebih cepat daripada utas tunggal?


13

Ada satu file besar di server saya. Saya menemukan bahwa unduhan banyak utas bisa mendapatkan 20 MB, tetapi utas tunggal bisa mendapatkan 10 Mbps, adakah yang bisa menjelaskan hal ini?


Beberapa utas yang melayani koneksi TCP yang sama, atau beberapa utas masing-masing dengan koneksi TCP yang terpisah? Apakah Anda juga mengatakan server multithreaded, atau klien multithreaded, atau keduanya?
Spiff

Jawaban:


14

Biasanya ini karena di suatu tempat antara Anda dan server lain ada firewall yang membatasi setiap aliran HTTP hingga 10Mbps. Saat Anda menggunakan multi-utas, Anda mendapatkan 2x 10Mb (satu untuk setiap utas).


1
Saya menggunakan FTP dan tidak ada batasan pada server saya
mengapa

@ mengapa: mungkin ISP Anda yang membatasi setiap koneksi ke 10mbps? Bisakah Anda mendapatkan lebih dari itu dalam speed tester?
André Paramés

4

Ini disebabkan oleh ping Anda antara Anda dan server dan ukuran paket / tcpip ukuran jendela yang digunakan oleh perangkat lunak pengunduhan Anda.

Pada dasarnya, jika Anda memiliki ping 100 ms ke server, dan meminta paket 100 kb, Anda hanya bisa mendapatkan 10 paket per detik menggunakan 1 koneksi, bahkan jika kecepatan internet Anda tidak terbatas.


Anda tidak perlu ACK setiap paket, selama penerima mengosongkan buffernya pada tingkat yang masuk akal, pengirim harus dapat memompanya terus-menerus.
André Paramés

Betul. Tetapi bahkan dengan buffer 256kb, ping masih menyebabkan pelambatan besar
BarsMonster

3

TCP bekerja paling baik ketika Anda "menjaga pipa tetap penuh" - ketika aplikasi pengirim terus mengirim buffer dengan cukup cepat untuk menjaga agar tumpukan TCP pengirim terus-menerus disertakan dengan data sehingga selalu dapat memiliki data "dalam penerbangan" di jaringan, dan ketika penerima aplikasi terus membaca dari receiver TCP stack dengan cukup cepat sehingga jendela TCP receiver tidak pernah terisi (sekali lagi, sehingga pengiriman TCP stack selalu dapat menyimpan data "dalam penerbangan" di jaringan).

Saya bisa membayangkan aplikasi pengirim ulir tunggal yang ditulis dengan buruk yang melewati satu buffer ke TCP stack, menunggu untuk mendengar bahwa itu sudah sepenuhnya Acked, dan kemudian melewati buffer lain. Itu berarti bahwa setelah akhir buffer pertama "dalam penerbangan" di jaringan, TCP stack mengirim kelaparan untuk mengirim data, yang berarti pipa saluran air dan tidak diisi ulang sampai setelah Ack kembali dan aplikasi pengiriman memberikannya buffer baru.

Saya juga bisa membayangkan aplikasi penerima ulir tunggal yang ditulis dengan buruk yang tidak membaca dari stack TCP yang diterima dengan cukup cepat dan dengan demikian memungkinkan buffer TCP stack mengisi, yang berarti jendela TCP terisi, yang menyebabkan pengiriman TCP stack ke berhenti mengirim sampai jendela terbuka beberapa. Meningkatkan ukuran jendela TCP penerima mungkin sedikit membantu, tetapi solusi sebenarnya untuk hal ini adalah membaca data lebih cepat.


Jadi, itu mungkin tidak ada hubungannya dengan menjadi satu utas?
Kera-inago

@ Ape-inago Tentu, aplikasi ulir tunggal yang ditulis dengan baik bisa menjaga pipa tetap penuh, ya.
Spiff

2

Yah, itu mungkin karena Anda hanya dapat mentransfer begitu banyak data melalui satu koneksi. Namun dalam program multi-utas Anda dapat memiliki dua koneksi yang menerima data secara bersamaan dan menggandakan jumlah informasi yang dapat Anda peroleh. Ada beberapa batasan untuk ini, misalnya kecepatan server yang Anda unduh dari ... Tutup dua siapa pun yang menulis pengunduh multi-utas, itu tidak mudah untuk ditulis.


1
Mengapa begitu sulit? Anda hanya perlu mengalokasikan satu bagian untuk setiap utas dan membiarkannya menulis di bagian yang sesuai dari file hasil. Sumber axel sepertinya cukup mudah bagi saya.
André Paramés
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.