멀티 스레드 다운로드가 단일 스레드보다 빠른 이유는 무엇입니까?


13

서버에 큰 파일이 하나 있습니다. 멀티 스레드 다운로드는 20Mbs를 얻을 수 있지만 단일 스레드는 10Mbps를 얻을 수 있습니다. 누구나 이것을 설명 할 수 있습니까?


동일한 TCP 연결을 제공하는 여러 스레드 또는 각각 별도의 TCP 연결을 가진 여러 스레드? 또한 서버가 다중 스레드이거나 클라이언트가 다중 스레드 또는 둘 다라고 말하고 있습니까?
Spiff

답변:


14

일반적으로 이는 사용자와 다른 서버 사이에 각 HTTP 스트림을 10Mbps로 제한하는 방화벽이 있기 때문입니다. 다중 스레드를 사용하면 2x 10Mb (각 스레드 당 하나씩)가 제공됩니다.


1
나는 FTP를 사용하지 않고 내 서버에이 제한됩니다

@ 왜 : 어쩌면 ISP가 각 연결을 10mbps로 제한하고 있습니까? 속도 테스터보다 더 많은 것을 얻을 수 있습니까?
André Paramés

4

이것은 사용자와 서버 사이의 핑과 다운로드 소프트웨어에서 사용하는 패킷 크기 / tcpip 창 크기 때문입니다.

기본적으로 서버에 100ms 핑을 보내고 100kb의 패킷을 요청하는 경우 인터넷 속도가 무한한 경우에도 1 개의 연결을 사용하여 초당 10 개의 패킷 만 얻을 수 있습니다.


수신자가 적당한 속도로 버퍼를 비우는 한 각 패킷을 ACK 할 필요는 없으며, 발신자는 지속적으로 펌핑 할 수 있어야합니다.
André Paramés

맞습니다. 그러나 256kb 버퍼에서도 핑은 여전히 ​​큰 속도 저하를 일으 킵니다
BarsMonster

3

TCP는 "파이프를 가득 채운 상태"에서 가장 잘 작동합니다. 송신 응용 프로그램이 송신 버퍼를 빠르게 유지하여 발신자 TCP 스택에 지속적으로 데이터를 제공하여 네트워크에서 항상 "비행 중"데이터를 가질 수있을 때 응용 프로그램은 수신기 TCP 창을 채우지 않을 정도로 수신기 TCP 스택에서 빠르게 읽습니다 (따라서 보내는 TCP 스택은 항상 네트워크에서 데이터를 "비행 중"으로 유지할 수 있습니다).

하나의 버퍼를 TCP 스택으로 전달하고 완전히 승인되었음을 듣고 기다린 다음 다른 버퍼를 전달하는 잘못 작성된 단일 스레드 송신자 앱을 상상할 수 있습니다. 즉, 일단 첫 번째 버퍼의 끝이 네트워크에서 "비행 중"이면 전송 TCP 스택에 데이터를 보낼 굶주림을 의미합니다. 이는 파이프가 배수되고 Ack가 돌아오고 전송 앱이 완료 될 때까지 파이프가 다시 채워지지 않음을 의미합니다. 새 버퍼를 전달합니다.

수신 TCP 스택에서 충분히 빨리 읽지 못하여 TCP 스택의 버퍼가 채워지도록 잘못 작성 된 단일 스레드 수신기 응용 프로그램을 상상할 수 있습니다. 이는 TCP 창이 가득 차서 보내는 TCP 스택을 창이 열릴 때까지 전송을 중지하십시오. 수신자의 TCP 창 크기를 늘리면 약간 도움이 될 수 있지만이 방법의 실제 해결책은 데이터를 더 빨리 읽는 것입니다.


따라서 단일 스레드와 관련이 없을 수 있습니까?
Ape-inago

@ Ape-inago Sure, 잘 작성된 단일 스레드 응용 프로그램은 파이프를 가득 채울 수 있습니다.
Spiff

2

아마도 하나의 연결을 통해서만 많은 양의 데이터를 전송할 수 있기 때문일 것입니다. 그러나 다중 스레드 프로그램에서는 두 개의 연결이 동시에 데이터를 수신하고 얻을 수있는 정보의 양을 두 배로 늘릴 수 있습니다. 예를 들어 다운로드하는 서버의 속도와 같은 몇 가지 제한 사항이 있습니다. 멀티 스레드 다운로더를 작성한 두 사람의 모자는 쓰기가 쉽지 않습니다.


1
왜 그렇게 어려운가요? 각 스레드마다 개별 섹션을 할당하고 결과 파일의 해당 섹션에 쓰도록해야합니다. axel 의 근원은 나에게 매우 간단 해 보인다.
André Paramés
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.