Мы используем ServiceStack 3.9.71.0, и в настоящее время мы испытываем необъяснимые проблемы с задержкой с клиентами по WAN-соединению.Как отключить алгоритм Нагле в ServiceStack?
Ответ с очень небольшой полезной нагрузкой (< 100 байт) получен после 200 мс +.
Время кругового путешествия (RTT) по линии связи составляет около 40 мс из-за географического расстояния. Это было проверено путем проверки другого хоста и использования простой службы эхо-тестирования для проверки задержки TCP-соединения.
Оба теста ping и echo показывают задержки, которые соответствуют ожиданиям. Получение ответа от нашего узла ServiceStack занимает гораздо больше времени, чем ожидалось.
Мы проверили, что:
- WAN ссылка работает только на 25% мощности (без перегрузки)
- Нет QOS используется по ссылке WAN
- же хозяин дает быстрый ответ тот же запрос с другого хоста в локальной сети задержки
- не вызванное нашим кодом обработки запроса
сейчас мы ул и он может означать задержки для небольших запросов в сетях 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?
EDIT: Я не думаю, что это дубликат HttpWebRequest is slow with chunked data. Указанный вопрос касается HttpWebRequest
, который не используется ServiceStack. ServiceStack использует HttpListener
, который также контролируется/управляется упомянутым ServicePointManager
. Мы собираемся провести тест, чтобы выяснить, разрешает ли проблема ServicePointManager.UseNagleAlgorithm = false
.
Incase вы не нашли какой-либо таким образом, чтобы отключить alogrithm nagle, тогда я предлагаю загрузить исходный код ServiceStack и искать Socket во всех файлах, добавить параметр ко всем таким функциям, которые создают сокеты, чтобы разрешить параметр TCP_NODELAY. добавьте код в источник, чтобы установить TCP_NODELAY с помощью функции setsocketopt. https://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx. После того, как вы можете также зафиксировать изменения в репозитории с открытым исходным кодом. В этом конкретном примере объясняется, почему API высокого уровня препятствует настройке низкого уровня. –
Привет Викрам, спасибо за ваше предложение.У ServiceStack есть исходный код для v3, публично размещенный на Github: https://github.com/ServiceStack/ServiceStack/tree/v3. Я сделал быстрый поиск, но я не думаю, что они напрямую используют «Socket». Похоже, что они используют 'HttpListener' - любая идея, если TCP_NODELAY можно установить для' HttpListener'? –
привет, Timo, я в настоящее время работаю над linux, но я искал репо и узнал, что API, в который нужно добавить изменения, находится в /src/ServiceStack.Server/Messaging/Rcon/Client.cs &/src/ServiceStack. Сервер/Сообщения/Rcon/Server.cs. сокеты создаются в функциях connect (Client.cs) и start (Server.cs). Удачи, при необходимости внесет изменения, когда у меня будет время. –