4

我需要编写一个 C++ 程序以高速接收来自 2 个不同 NIC 的 udp 数据包 - 每个套接字大约 45MB/s(同一台计算机上的每个 NIC 一个套接字)。

我首先创建了一个基于事件的套接字(使用 WSAEventSelect),但我想知道:这种类型的套接字模型(基于事件)是否意味着一些性能损失?(因为事件将以高速率触发,因此操作系统可能会导致一些延迟)如果我选择阻塞套接字,我会减少延迟吗?是否可以说在高吞吐量下阻塞套接字可能优于非阻塞套接字?

注意:可伸缩性不是问题,因为我们处理的套接字不超过两个。

谢谢,

交流电

4

1 回答 1

3

如果您只有两个套接字,为什么使用阻塞调用?它们的开销比任何异步套接字 API 都要少一些,并且具有更简单的编程模型。阻塞套接字在幕后使用异步 IO,但它们在 Windows 内核中阻塞事件。

您可能应该CpuCount/2为每个套接字启动读取器线程。尽管如果能够处理负载(取决于您的应用程序),更少的线程会表现得更好。更少的线程意味着拥有更小的缓存占用空间和更少的上下文切换。

如果您非常关心跨套接字负载平衡,您可能应该使用 IO 完成端口,这是 Windows 上执行异步 IO 的标准且性能最佳的方式。

延迟呢?在您的情况下,阻塞调用与“基于事件的”套接字具有几乎相同的延迟,因为每个套接字有多个线程排队等待事件以接受 NIC 接收的下一个数据包。使用基于回调的异步 IO 方法,延迟会略有增加。我希望差异非常小。内核不会引入任何延迟。例如,它不会等待时钟中断来解锁线程。解锁立即发生。

于 2013-10-08T11:09:52.290 回答