Windows OS에서 netperf를 사용하고 있는데 두 대의 컴퓨터가 크로스 오버 케이블로 연결되어 있습니다. 첫 번째 PC는 Realtek FE 네트워크 컨트롤러를 사용하고 두 번째 PC는 Realtek GBE 컨트롤러를 사용합니다.
첫 번째 PC를 서버로 사용하고 클라이언트를 두 번째로 사용하면 다음과 같은 결과가 나타납니다.
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
8192 65536 65536 10.00 95.11
내가 두 번째 PC 주위에있는 것들을 전환 할 때 서버이며, 첫 번째 클라이언트는 다음과 같은 결과를 얻습니다.
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
65536 8192 8192 10.00 50.11
이 두 가지 경우에서 처리량이 다른 이유는 무엇입니까?
답변
그것은 아마 기계 중 하나가 잘못 튜닝 된 TCP 창을 사용하고 있기 때문입니다 (netperf는 Recv 소켓 크기라고합니다). TCP 연결을 여는 TCP 3 방향 핸드 셰이크 중에 각 호스트는 수신시 처리 할 수있는 크기의 TCP 창을 통신하므로 다른 호스트는 TCP Ack를 기다리기 전에 비행 중에 넣을 데이터 양을 알고 있습니다.
8KiB (8,192 바이트 = 65,536 비트)는 100,000,000bps 네트워크 및 예상 RTT (왕복 시간 == 핑 시간)가 1ms 인 경우 기내에 넣을 수있는 충분한 데이터를 허용하지 않습니다.
사용할 적절한 TCP 창을 계산하려면 “대역폭 * 지연 제품”(BDP)을 계산해야합니다. 한 컴퓨터에서 다른 컴퓨터로 핑 (ping)하고 핑 시간을 기록하십시오. 바쁜 GigE LAN에서 약 1ms 가량 걸립니다. 나는 이것이 GigE에 대해 약간 높은 것으로 생각하지만 링크의 한쪽 끝이 100BASE-TX이기 때문에 함께 가자.
100,000,000 비트 / 초 * 0.001 초 (1ms) RTT = 100,000 비트
10 만 비트 / 바이트 당 8 비트 = 12,500 바이트
12,500 바이트 / 키비 바이트 당 1024 바이트 = 12.2KiB
따라서 느린 머신에서 TCP 수신 윈도우는 적어도 50 % 더 커야합니다 (8 KiB 대신 12.2).
그런 다음 Windows 8.x와 같은 최신 OS를 사용하는 경우 호스트에 자동 TCP 창 튜닝이 있어야하므로 초기에보고 된 값이 신뢰할 수 없으므로이 응답을 적용하지 말아야합니다. Windows XP와 같은 고대 OS를 사용하거나 자동 TCP 창 조정이 사용되지 않거나 어떤 이유로 작동하지 않는 경우이 사항이 적용됩니다.