ServiceStack 3.9.71.0 を使用していますが、現在、WAN 接続を介したクライアントで原因不明の遅延の問題が発生しています。
非常に小さいペイロード (<100 バイト) の応答が 200ms 以上後に受信されます。
地理的な距離のため、リンクの往復時間 (RTT) は約 40 ミリ秒です。これは、他のホストに ping を実行し、単純なエコー サービスを使用して TCP 接続の遅延をテストすることで確認されています。
ping テストとエコー テストの両方で、期待どおりのレイテンシが示されています。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 )。
ServiceStack の TCP 処理でこれを無効にするにはどうすればよいですか?
編集:これはHttpWebRequest is slow with chunked dataの複製だとは思いません。上記の質問はHttpWebRequest
、ServiceStack で使用されていないものをカバーしています。ServiceStack はHttpListener
、前述の によって制御/管理されているものも使用しServicePointManager
ます。ServicePointManager.UseNagleAlgorithm = false
設定によって問題が解決するかどうかをテストします。