我正在使用 asio(非 boost 版本)库通过 10GB 以太网适配器捕获传入的 UDP 数据包。每秒 150k 个数据包很好,但是当我达到更高的速率(例如 300k 个数据包/秒)时,我开始丢弃数据包。
我很确定瓶颈在于 DMA 从网卡到主机系统的 300k 单独传输。传输并不大,每次传输只有 1400 字节,所以不是带宽问题。
理想情况下,我想要一种机制来将来自多个数据包的数据合并到一个到主机的单个 DMA 传输中。目前我正在使用 asio::receive 进行同步传输,它提供比 async_receive 更好的性能。
我曾尝试使用带有更大缓冲区的接收命令,或使用多个缓冲区的数组,但我似乎总是获得 1400 字节的单次读取。
有没有办法解决?
理想情况下,我想一次读取 1400 个字节的多个字节,只要填充总数不需要太长时间。IE。等待最多 4 毫秒,然后返回 4 x 1400 字节,或者只是在 4 毫秒后返回,但有多少字节可用......
我不控制整个网络,所以我不能强制使用巨型帧:(
干杯,