Сброс сокета путем временного включения NoDelay

Предпосылки

У меня есть реализация HTTP-сервера на C #. Используя ab , я обнаружил странную проблему с производительностью. Каждый запрос занимал 5 мс при выключенном Keep-Alive, но 40 мс при включенном Keep-Alive!

Тестовая страница генерируется в виде одного байта [], который отправляется в качестве ответа с помощью одного вызова socket.Send.

Причина насколько я могу судить, алгоритм Нэгла используется в стеке TCP.

TCP Flush?

Пока что я использую свойство NoDelay в конце каждого обслуживаемого HTTP-запроса.

socket.NoDelay = true;
socket.NoDelay = false;

Что на данный момент решает проблему. Но у меня нет документации для резервного копирования моего открытия.

Это было протестировано в системе linux / mono.

Есть ли стандартный способ очистки TCP-соединения?

По теме

Этот ответ является обращаясь к той же проблеме. Разница здесь в том, что я хочу только временно отключить алгоритм.

5
задан Community 23 May 2017 в 12:04
поделиться