リビジョン 1: 明らかなクリーンアップ

このバージョンのサンプル プログラムでは、パフォーマンスの向上に最初の進歩を遂げるように、いくつかの明らかな変更が行われています。 このバージョンのコードはパフォーマンスチューニングからは程遠いですが、段階的により優れたアプローチの効果を調べることが可能な優れた増分ステップです。

警告

このアプリケーションの例では、コードの変更で可能なパフォーマンスの向上を示すために、意図的にパフォーマンスが低下します。 アプリケーションでこのコード サンプルを使用しないでください。これは、説明のみを目的としています。

 

#include <windows.h>

BYTE Set(row, col, bAlive)
{
    SOCKET s = socket(...);
    BYTE byRet = 0;
    BYTE tmp[3];
    tmp[0] = (BYTE)row;
    tmp[1] = (BYTE)col;
    tmp[2] = (BYTE)bAlive;
    bind( s, ... );
    connect( s, ... );
    send( s, &tmp, 3 );
    recv( s, &byRet, 1 );
    closesocket( s );
    return byRet;
}

このバージョンの変更点

このバージョンには、次の変更が反映されています。

  • SNDBUF=0 を削除しました。 バッファーなし送信と遅延受信確認による 200 ミリ秒の遅延が削除されます。
  • Send-Send-Receive の動作を削除しました。 この変更により、Nagle と遅延 ACK の相互作用による 200 ミリ秒の遅延が排除されます。
  • リトル エンディアンの仮定を削除しました。 バイトの順序が整いました。

残りの問題

このバージョンでは、次の問題が残ります。

  • アプリケーションは引き続き接続が多い。 600 ミリ秒以上の遅延が削除されるため、アプリケーションは 1 秒あたり 12 回の接続持続レートに達するようになりました。 多くの同時接続が問題になりました。
  • アプリケーションはまだ脂肪です。変更されていないセルは引き続きサーバーに反映されます。
  • このアプリケーションでは、まだストリーミングが不十分です。3 バイトの送信はまだ小さい送信です。
  • アプリケーションは、直接接続されたイーサネットで 4 KB/秒に相当する 2 バイト/RTT を送信するようになりました。 これは高速ではありませんが、TIME-WAIT が最初に問題を引き起こす可能性があります。
  • オーバーヘッドは 99.3% まで低下しますが、それでもオーバーヘッドの割合は十分ではありません。

主要なパフォーマンス メトリック

次の主要なパフォーマンス メトリックは、ラウンド トリップ時間 (RTT)、Goodput、プロトコルオーバーヘッドで表されます。 これらの用語の説明については、 ネットワーク用語 のトピックを参照してください。

このバージョンには、次のパフォーマンス メトリックが反映されています。

  • セル時間 - 2×RTT
  • Goodput - 2 バイト/RTT
  • プロトコルのオーバーヘッド - 99.3%

低速アプリケーションの改善

ネットワーク用語

ベースライン バージョン: パフォーマンスが非常に低いアプリケーション

リビジョン 2: 接続数を減らした場合の再設計

リビジョン 3: 圧縮ブロック送信

今後の機能強化