Почему различная пропускная способность при использовании netperf?
Я использую netperf в ОС Windows, с двумя компьютерами, соединенными перекрестным кабелем. Первый ПК использует сетевой контроллер Realtek FE, а второй ПК имеет контроллер Realtek GBE.
С первым компьютером в качестве сервера, а вторым в качестве клиента я получаю следующие результаты:
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
Когда я переключаюсь, второй компьютер - сервер, а первый - клиент, я получаю следующие результаты:
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
Почему разная пропускная способность в этих двух случаях?
1 ответ
Вероятно, это связано с тем, что одна из машин использует плохо настроенное окно TCP (netperf явно называет это размером сокета Recv). Во время трехстороннего рукопожатия TCP, которое открывает TCP-соединение, каждый хост сообщает, какой размер TCP-окна он может обработать при получении, так что другой хост знает, сколько данных нужно поместить в полет, прежде чем ждать подтверждения TCP.
8 КБ (8 192 байта = 65 536 бит) не позволяют вводить в полет достаточное количество данных при скорости сети 100 000 000 бит / с и приблизительном RTT (время прохождения сигнала == время пинга) в 1 мс.
Чтобы рассчитать правильное окно TCP для использования, вам нужно рассчитать ваш "Bandwidth * Delay Product" (BDP). Пингуйте одну машину от другой и запишите время пинга. В моей загруженной сети GigE сейчас около 1 мс. Я думаю, что это немного выше для GigE, но давайте продолжим, так как один конец вашей ссылки - просто 100BASE-TX.
100 000 000 бит в секунду * 0,001 секунды (1 мс) RTT = 100 000 бит
100 000 бит / 8 бит на байт = 12 500 байт
12 500 байт / 1024 байт на КибиБайт = 12,2 КБ
Таким образом, ваше окно приема TCP на медленной машине должно быть как минимум на 50% больше, чем оно есть (12,2 вместо 8 КиБ).
С другой стороны, если вы используете современную ОС, такую как Windows 8.x, этот ответ не должен применяться, потому что ваши хосты должны иметь автоматическую настройку окна TCP, поэтому первоначально сообщаемые значения могут быть ненадежными. Если вы используете древнюю ОС, такую как Windows XP, или если автоматическая настройка окна TCP отключена или по какой-то причине не работает, то это применимо.