7

多数の小さなファイルを Xbox 360 devkit (Winsock を使用) にダウンロードする FTP のようなプログラムを開発し、それを Playstation3 (これも devkit で、Linux AFAIK を使用) に移植しています。このプログラムは、BSD スタイルのソケット (TCP) を使用します。どちらのプログラムも同じサーバーと通信し、同じデータをダウンロードします。プログラムは、次のようにループ内のすべてのファイルを反復処理します。

ファイルごとに
    send(コマンド取得)
    送信(ファイル名)
    受信(応答)
    テスト応答
    受け取り(サイズ)
    受信(データ)

Xbox 360 の実装では、ダウンロード全体に 1:27 かかり、最後の送信から最初の受信までの時間は約 14 秒です。これは私にはかなり理にかなっているように思えます。

Playstation3 の実装では、同じデータに対して 4:01 かかります。ボトルネックは、最後の送信と最初の受信の間にあるようで、その時間の 3:43 を占めています。ネットワーク時間とディスク時間は、どちらも Xbox 360 より大幅に短縮されています。

これらの devkit は両方とも、ファイル サービスを行う PC と同じスイッチ上にあり、そのスイッチには他のトラフィックはありません。

フラグを設定してみましたが、状況はTCP_NODELAY大幅に変わりませんでした。SO_SNDBUF/を 625KB に設定してみましたがSO_RCVBUF、これも時間に大きな影響はありませんでした。

Winsock と Linux の TCP/IP スタックの実装に違いがあると思います。Linux の実装を Winsock のように動作させるために設定できるソケット オプションはありますか? 私が説明していないものは他にありますか?

唯一の解決策は、すべてのファイル要求をまとめて送信し、すべてを受信するように書き直すことです。

残念ながら、Sony の実装には TCP_CORK オプションがないため、それが違いかどうかはわかりません。

4

2 に答える 2

2

あなたがしたいTCP_CORK。部分的なフレームが送信されてスループットが増加するのを防ぎます (レイテンシーを犠牲にして) - winsock と同様です。

int v,vlen;
v=1; vlen=sizeof(v);
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen);

v=0受信前にフレームをフラッシュするように設定します。

int v,vlen;
v=0; vlen=sizeof(v);
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen);

writev()ほとんどの UNIX では、またはsendfile()...を使用してスループットをさらに向上させることができます。

于 2008-11-26T01:59:52.043 に答える
1

Wireshark はあなたの友人です。ワイヤーを嗅ぎます。パケットを見て、それぞれがどのようにシーケンスされているかを確認し、違いや問題を特定できないかどうかを確認してください。

待ち時間の長いリンクでは、各 TCP パケットを最大限に活用しながら、できる限り多くのバッファを確保する必要があります。

合体を送信することは、通常は良い考えです。送信側で複数の未確認フレームがキューに入れられている場合にのみトリガーされます。通常、この機能を無効にする必要があるのは、自分が何をしているかを知っていて、システムが包括的なバッファリングを提供している場合のみです。それ以外の場合、無効にすると、遅延の大きいネットワークでシステム パフォーマンスに悪影響を与えることが確実です。

最高のスループットを得るには、バッファ demarc をパス MTU の正確な係数にする必要があります。

于 2008-11-26T03:49:22.883 に答える