如何快速读取通过10GbE NIC传输的数据?

如何快速读取通过10GbE NIC传输的数据?,c,networking,ethernet,C,Networking,Ethernet,我有两个debian盒,通过CX4电缆连接在两个10 GbE卡之间。一个将非常快速地生成数据(在4Gbit/s和16Gbits/s之间),另一个需要能够获取所有这些数据并将其存储在RAM中以供以后解析。我是这种低级编码的新手,我很乐意接受关于使用哪种广泛方法的任何想法(我需要DMA吗?RDMA?),或者可能适用的技巧和技巧。谢谢 我听说,普通PC上唯一可以处理将饱和10GbE拉到用户空间进行任何后处理的NIC是Napatech制造的,您必须使用他们的定制API 你最好把这样一张卡放在一个有总线管

我有两个debian盒,通过CX4电缆连接在两个10 GbE卡之间。一个将非常快速地生成数据(在4Gbit/s和16Gbits/s之间),另一个需要能够获取所有这些数据并将其存储在RAM中以供以后解析。我是这种低级编码的新手,我很乐意接受关于使用哪种广泛方法的任何想法(我需要DMA吗?RDMA?),或者可能适用的技巧和技巧。谢谢

我听说,普通PC上唯一可以处理将饱和10GbE拉到用户空间进行任何后处理的NIC是Napatech制造的,您必须使用他们的定制API


你最好把这样一张卡放在一个有总线管道的成熟服务器上,以支持这种速度(对于这样一个盒子,我肯定会避开任何一种nvidia芯片组。)

如果你想每秒持续处理1GB的流量,你需要非常宽的总线和非常快的处理速度,我的经验来自。您需要专门的硬件来始终如一地执行NIDS处理100MB(1G以太网)的数据(10GB是另一个世界)。Ram对您没有帮助,因为您可以在5-10秒内填充一个GB,而1GB可以容纳大量请求

如果您试图使用10G的数据进行任何形式的业务或web处理,那么您可能需要在前端安装一个能够跟上10GB流量的负载分配器

p、 我必须澄清,NIDS是在看到流量的机器上处理的1:1流量——也就是说,在同一台机器上处理每个字节的最坏情况;而业务/web处理是1:many:many机器,需要处理的字节数量级

--编辑--

既然您已经提到数据传输之间存在差距(无论如何,没有标准的10Gb nic能够跟上10Gb),我们需要知道处理的内容,然后才能提出建议

--编辑2--


当您使用多个线程时,Berkeley DB(具有简单数据模型的数据库)的行为类似于企业数据库(在事务速率方面)。如果您想以高速率写入磁盘,您可能应该探索这个解决方案。您可能需要raid设置来提高吞吐量——raid 0+1在IO吞吐量和保护方面是最好的

嗯,你需要钱。一种方法可能是购买负载共享交换机,将传入的数据拆分为两台计算机,并将其后处理为单个数据库。

因为您有一些方面可以简化这种情况(仅在两台计算机之间稳定点对点,无需处理)实际上,我会尝试在系统之间使用一个简单或明显的TCP流,并使用
write()
将数据写入磁盘。然后测量性能和配置文件,以确定瓶颈所在


作为起点,请阅读(10000个同时连接)问题,这是大多数高性能服务器开发的目的。它应该为您提供高性能服务器问题的强大背景。当然,您不需要为建立新连接而担心select/poll/epoll,这是一个主要的简化

在您计划任何特殊编程之前,您应该做一些测试,看看您可以用普通系统处理多少。在生产者机器上设置一个模拟数据文件和发送过程,在消费者机器上设置一个简单的接受者/解析器,并进行一系列分析——您将在哪里遇到数据问题?你能用更好的硬件吗,或者你能调整你的处理速度更快吗

确保您从能够支持预期数据速率的硬件平台开始?如果您使用的是类似Intel的82598EB NIC,请确保已将其插入PCIe 2.0插槽,最好插入x16插槽,以获得从NIC到芯片组的全部带宽

有多种方法可以将NIC驱动程序的参数调整到数据流中,以充分利用您的设置。例如,确保在链路上使用巨型帧以最小化TCP开销。此外,您还可以使用驾驶员的中断油门速率来加速低水平操控

数据集的处理是否可并行化?如果您有一个任务将数据转储到内存中,您是否可以设置多个任务来同时处理数据块?这将很好地利用多核CPU


最后,如果这些都不够,请使用您收集的分析/计时数据来查找可以调整以获得更好性能的系统部分。不要只是假设您知道需要调整的地方:使用真实数据备份它-您可能会感到惊讶。

我认为最近的linux内核支持来自nic->kernel的10Gb数据包
但我怀疑是否有有效的方法将数据复制到用户空间,即使使用i7/XEON 5500平台也不例外。似乎忘记了什么:如果NIC是10GB,并且您担心接收器,您可以(相对)轻松地休息:即使源能够以这种速度生成数据,当接收器将数据从10GB线路传输到RAM时,它将遇到同样的问题

如果NIC是10GB,这意味着比特以该速率计时,但没有提到单个数据包之间的时间,我们还没有讨论协议


我想这个问题对于OP来说已经过时了,但是如果你有这样的任务,那么就从一个定期编程的解决方案开始,以便能够判断你的特殊情况下需要增加多少速度(你的情况总是特殊的;-)

是的,这些东西要花一只手臂和一个tst**ckle:DI应该更清楚一点。数据只会以这种速率传入5-10秒,所以对于一堆RAM(我有),捕获它然后