多数の小さなファイルを 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 オプションがないため、それが違いかどうかはわかりません。