Windows XP で Interix を使用して、C++ Linux アプリケーションをより簡単に Windows XP に移植できるようにしています。私のアプリケーションは、ソケットを介して Linux を実行している近くのマシンとの間でパケットを送受信します。送信時のスループットは約 180 KB/秒で、受信時のスループットは約 525 KB/秒です。Linux で同じコードを実行すると、2,500 KB/秒近くになります。
180 KB/秒を超えるレートで送信しようとすると、パケットがドロップされて、レートがほぼそのレベルに戻ります。
送信時に 180 KB/秒よりも優れたスループットを得ることができると思いますが、ドロップされたパケットの原因を特定する方法がわかりません。
スループットの向上を期待して、この遅さを調査するにはどうすればよいでしょうか?
--その他の歴史--
上記の数値に到達するために、次の手順を実行してスループットを少し改善しました (Linux では違いはありませんでしたが、Interix ではスループットが向上しました)。
- SO_RCVBUF と SO_SNDBUF を 256KB から 25MB に変更したところ、スループットが約 20% 向上しました
- デバッグの代わりに最適化を実行したところ、スループットが約 15% 向上しました
- stdout とログ ファイルに送信されるすべてのログ メッセージをオフにすると、スループットが 2 倍になりました。
そのため、Interix では CPU が制限要因のように見えますが、Linux ではそうではありません。さらに、ハイパーバイザーでホストされている仮想マシンで実行しています。Windows XP には 2 つのコアと 2 GB のメモリが割り当てられます。
プロファイラーは、2 つのコアの CPU が平均して 50% の使用率を決して超えないことを示していることに気付きました。これは、アプリケーションのインスタンスを 2 つ実行している場合でも発生しますが、両方のコアで 50% 前後で推移しています。おそらく、UDP ソケットから読み取る専用スレッドと UDP ソケットに書き込む専用スレッド (常に 1 つだけがアクティブ) を備えたマルチスレッドのアプリケーションは、Interix で適切にスケジュールされていないため、パケットが落ちる?