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