我正在从UDP端口读取单个数据项。这次读取必须尽可能地降低延迟。目前我正在通过boost :: asio库的async_receive_from
方法阅读。有谁知道我到达网卡的数据包与我的用户代码中调用的回调方法之间会遇到的延迟类型?
Boost是一个非常好的库,但非常通用,是否有较低的延迟替代?
非常欢迎所有关于编写低延迟UDP网络程序的意见。
编辑:另一个问题,是否有一种相对可行的方法来估计我在NIC和用户模式之间遇到的延迟?
答案 0 :(得分:17)
您的延迟会有所不同,但它会远远超出您的最佳状态。以下几点可以阻止更好的延迟:
<强> Boost.Asio的强>
mutex
锁定/解锁。总而言之,asio
对于高级应用程序开发人员来说是一个很好的库,但它带有很大的价格标签和大量的CPU周期。另一个替代方案是libevent
,它好多了,但仍然旨在支持许多通知机制并且与平台无关。没有什么可以击败本机机制,即epoll
。
其他事项
我无法告诉您确切的数字,但假设您不会获得大量流量,使用Boost和常规Linux内核,使用常规硬件,您的延迟范围介于~50微秒到100毫秒之间。当你获得更多数据时,它会有所改善,并且在某些点开始下降后,它将始终是测距。我会说,如果你对这些数字没问题,不要打扰优化。
答案 1 :(得分:1)
我认为在“旋转”循环线程中使用recv()并将线程附加到单个CPU核心(Processor Affinity),延迟应该低于使用select(),select()的精度从1变化在我的测试中,旋转循环为1微秒,达到10微秒。