我在 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% 的吞吐量
- 我关闭了所有发送到标准输出和日志文件的日志消息,这使吞吐量翻了一番。
因此,CPU 似乎是 Interix 的限制因素,但不是 Linux。此外,我在托管在管理程序中的虚拟机上运行。Windows XP 有 2 个内核和 2 GB 内存。
我注意到分析器显示两个核心上的 cpu 平均利用率从未超过 50%。这甚至发生在我运行我的应用程序的两个实例时,它仍然在两个内核上徘徊在 50% 左右。也许我的应用程序是多线程的,具有从 UDP 套接字读取的专用线程和写入 UDP 套接字的专用线程(在任何给定时间只有一个处于活动状态)在 Interix 上没有很好地安排,因此我的数据包是下降?