Как отключить алгоритм Нейгла в ServiceStack?
Мы используем ServiceStack 3.9.71.0, и в настоящее время у нас возникают необъяснимые проблемы с задержкой клиентов через соединение WAN.
Ответ с очень малой полезной нагрузкой (<100 байт) получен через 200 мс +.
Время прохождения туда-обратно (RTT) по ссылке составляет около 40 мс из-за географического расстояния. Это было проверено путем проверки связи с другим хостом и использования простой службы эха для проверки задержки соединения TCP.
Тесты ping и echo показывают задержки, которые соответствуют ожиданиям. Получение ответа от нашего хоста ServiceStack занимает гораздо больше времени, чем ожидалось.
Мы убедились, что:
- Канал WAN работает только на 25% емкости (без перегрузки)
- На канале WAN QOS не используется
- один и тот же хост дает быстрый ответ на один и тот же запрос от другого хоста в локальной сети
- задержка не вызвана обработкой запроса нашим кодом
Теперь мы наткнулись на алгоритм Nagle, и это может означать задержки для небольших запросов в сетях WAN ( http://blogs.msdn.com/b/windowsazurestorage/archive/2010/06/25/nagle-s-algorithm-is-not-friendly-towards-small-requests.aspx).
В.NET это можно отключить, установив TcpClient.NoDelay = true
( https://msdn.microsoft.com/en-us/en-US/library/system.net.sockets.tcpclient.nodelay(v=vs.110).aspx).
Как это можно отключить для обработки TCP ServiceStack?
РЕДАКТИРОВАТЬ: я не думаю, что это дубликат HttpWebRequest медленно с кусками данных. Упомянутый вопрос охватывает HttpWebRequest
который не используется ServiceStack. ServiceStack использует HttpListener
который также находится под контролем упомянутого ServicePointManager
, Мы собираемся провести тест, чтобы увидеть, ServicePointManager.UseNagleAlgorithm = false
решает проблему.
1 ответ
Я думаю, что вы предоставили ответ в своем обновлении UseNagleAlgorithm = false, чтобы решить эту проблему. Но будьте осторожны, потому что ServicePointManager.UseNagleAlgorithm = false;
Это глобальные настройки, которые означают, что он отключит этот алгоритм для всей вашей конечной точки и для всех ваших запросов во всем Домене приложения. Когда вы вызываете более одной конечной точки службы (обычно это так) со смешанным размером запроса, он откусывает назад. Таким образом, вы должны рассмотреть возможность установки этого только для одной конкретной ServicePoint, вы можете приобрести его:
ServicePoint sp = ServicePointManager.FindServicePoint(<uri>);
sp.UseNagleAlgorithm = false;
и не установить его глобально
Вот статья об этом: https://blogs.msdn.microsoft.com/windowsazurestorage/2010/06/25/nagles-algorithm-is-not-friendly-towards-small-requests/