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?
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?
Jawaban:
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).
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.
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.
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.