2015-04-28 1 views
4

Мы используем 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.

+0

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 высокого уровня препятствует настройке низкого уровня. –

+0

Привет Викрам, спасибо за ваше предложение.У ServiceStack есть исходный код для v3, публично размещенный на Github: https://github.com/ServiceStack/ServiceStack/tree/v3. Я сделал быстрый поиск, но я не думаю, что они напрямую используют «Socket». Похоже, что они используют 'HttpListener' - любая идея, если TCP_NODELAY можно установить для' HttpListener'? –

+0

привет, Timo, я в настоящее время работаю над linux, но я искал репо и узнал, что API, в который нужно добавить изменения, находится в /src/ServiceStack.Server/Messaging/Rcon/Client.cs &/src/ServiceStack. Сервер/Сообщения/Rcon/Server.cs. сокеты создаются в функциях connect (Client.cs) и start (Server.cs). Удачи, при необходимости внесет изменения, когда у меня будет время. –

ответ

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/

Смежные вопросы