У меня есть сервер с подключением 10GbE к коммутатору и 10 клиентов каждый с подключением 1GbE к одному коммутатору.
Параллельно запуская nuttcp на каждом из клиентов, я могу одновременно передавать 10 потоков данных TCP на сервер со скоростью, близкой к скорости соединения (т. Е. Всего лишь 100 мегабайт в секунду со всех 10 клиентов одновременно).
Однако, когда я меняю направление и отправляю данные с сервера клиентам - т. Е. 10 потоков TCP, по одному на каждого клиента, - происходит повторная передача TCP, и производительность падает до 30, 20 или даже 10 мегабайт в секунду. за клиента. Я хочу получить эти цифры, потому что эта модель трафика представляет определенные приложения, которые меня интересуют.
Я проверил, что мой сервер способен насыщать соединение 10GbE, выполнив тот же эксперимент через соединение 10GbE с аналогичным сервером. Я проверил, что нет ошибок на любом из моих портов.
Наконец, когда я принудительно ограничиваю (ограничиваю) размер окна TCP получателя, я могу получить пропускную способность несколько выше (30-40 мегабайт / сек); и если я зажимаю его крайне низко, я могу вернуть повторные передачи в ноль (с невероятно низкой пропускной способностью).
Таким образом, я достаточно уверен, что переполнил буферы в моем коммутаторе, что привело к потере пакетов из-за перегрузки. Тем не менее, я думал, что TCP контролирует перегрузку, должен был с этим справиться, со временем стабилизировавшись на уровне, превышающем 50% скорости передачи.
Итак, мой первый вопрос очень прост: какой алгоритм управления перегрузкой TCP лучше всего подходит для моей ситуации? Их доступно множество, но в основном они предназначены для сетей с потерями, высокоскоростных сетей с высокой пропускной способностью или беспроводных сетей ... Ничто из этого не относится к моей ситуации.
Второй вопрос: могу ли я попробовать еще что-нибудь?