とある凡人の生きた軌跡

ただひたすらにありのままに生きる

.NET http送信が遅い時に見直す設定

Nagleアルゴリズムをオフに

https://ja.wikipedia.org/wiki/Nagle%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
https://www.w3.org/People/Frystyk/HTTPSigcomm97.html
https://support.microsoft.com/ja-jp/help/214397

Nagleアルゴリズムとは、昔に提案されたアルゴリズムである

Microsoft TCP スタックでは、小さなデータ パケットによってネットワークが混雑しないように、デフォルトで Nagle アルゴリズムが有効になっています。Nagle アルゴリズムは、複数の送信呼び出しからの小さなデータ バッファを結合し、以前に送信されたデータ パケットに対する ACK がリモート ホストから受信されるまで、結合したデータ バッファの送信を遅延します。

これによりACKが帰ってくるのを待つのに200ms程度ラグを与えてしまうのが
遅延の原因となってしまう

Expect100-Continueをオフに

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3

  1. →clientがhttp送信
  2. ←サーバは100返信
  3. →clientがようやくhttp bodyを送信

とやりとりの回数が増えてしまう
twitterなどはこれに対応してないため、100Continue問題として多少有名らしい
(ググるとけっこうでてくる)

これらを踏襲したWeb.config

<system.net>
  <connectionManagement>
      <!-- Webサーバの場合、リクエストを受け付ける同時接続を増やす -->
      <add address="*" maxconnection="10000"/>
    </connectionManagement>
    <settings>
       <!-- http送信でのheaderの[expect100continue]をやめる、nagleアルゴリズムの使用をやめて遅延を解除する(TCPオーバーヘッドのリスクを許容したうえでオフにする) -->
      <servicePointManager useNagleAlgorithm="false" expect100Continue="false" />
    </settings>
</system.net>