gpt4 book ai didi

c++ - 使用ASIO抓取大量UDP包

转载 作者:行者123 更新时间:2023-11-30 02:26:36 24 4
gpt4 key购买 nike

我正在使用 asio(非 boost 版本)库通过 10GB 以太网适配器捕获传入的 UDP 数据包。每秒 15 万个数据包很好,但是当我达到更高的速率(例如 30 万个数据包/秒)时,我开始丢失数据包。

我很确定瓶颈在于从网卡到主机系统的 DMA'ing 300k 单独传输。传输量不大,每次传输只有 1400 字节,所以不是带宽问题。

理想情况下,我希望有一种机制可以将来自多个数据包的数据合并为一个 DMA 传输到主机。目前我正在使用 asio::receive 进行同步传输,它比 async_receive 提供更好的性能。

我曾尝试使用具有更大缓冲区的接收命令,或使用多个缓冲区的数组,但我似乎总是获得 1400 字节的单次读取。

有什么办法解决这个问题吗?

理想情况下,我希望一次读取 1400 字节的一些倍数,只要不会花费太长时间来填充总数。IE。最多等待 4 毫秒,然后返回 4 x 1400 字节,或者只是在 4 毫秒后返回,无论有多少字节可用...

我不控制整个网络,所以我不能强制使用巨型帧:(

干杯,

最佳答案

我会删除 asio 层并直接转到金属。

如果你在 Linux 上,你应该使用 recvmmsg(2)而不是 recvmsg()recvfrom(),因为它至少允许在内核中一次传输多条消息,而其他方法则不允许。

如果您做不到这两件事中的任何一件,您至少需要降低您的期望。 recvfrom()recvmsg() 以及 asio 中覆盖它们的任何内容都不会一次传送超过一个 UDP 数据报。你需要:

  • 尽可能加快接收循环,消除所有可能的开销,尤其是动态内存分配和到其他套接字或文件的 I/O。
  • 通过 setsockopt()/SO_RCVBUFSIZ 确保套接字接收器缓冲区尽可能大,至少 1 兆字节,并且不要假设你设置的就是你得到的:得到它通过 getsockopt() 返回,看看平台是否以某种方式限制了你。

关于c++ - 使用ASIO抓取大量UDP包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42522662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com