我有两个通过 CX4 电缆连接在两个 10 GbE 卡之间的 debian 盒子。一个将非常快速地生成数据(介于 4Gbits/s 和 16Gbits/s 之间),另一个需要能够获取所有这些数据并将其存储在 RAM 中以供以后解析。我是这种低级编码的新手,并且很乐意接受有关使用哪种广泛方法(我需要 DMA 吗?RDMA?)或可能适用的提示和技巧的任何想法。谢谢!
7 回答
我听说的唯一适用于普通 PC 的 nics 可以处理将饱和的 10GbE 拉到用户空间进行任何类型的后期处理是 Napatech 制造的——你必须使用他们的自定义 API。
你最好把这样的卡放在一个相当成熟的服务器上,用总线管道来支持这种速度(我肯定会避开任何类型的 nvidia 芯片组来购买这样的盒子。)
如果你想每秒持续处理 1 GB 的流量,你需要非常宽的总线和非常快的处理速率,我的经验来自NIDS。您需要专门的硬件来持续执行 NIDS 处理 100MB(1 Gig 以太网)的数据(10 Gb 是另一个领域)。Ram 不会帮助你,因为你可以在 5-10 秒内填满一个 GB,而 1 GB 可以容纳很多请求。
如果您尝试使用 10 gig 进行任何形式的业务或 Web 处理,您可能需要在前端放置一个可以跟上 10GB 流量的负载分配器。
ps,我必须澄清一下,NIDS 是在看到流量的机器上处理的 1:1 流量——即,最坏的情况是您在同一台机器上处理每个字节;而业务/网络处理是 1:many: 许多机器和一个数量级的许多字节要处理。
- 编辑 -
既然您已经提到数据传输之间存在差距(反正没有标准的 10Gb 网卡可以跟上 10Gb),我们需要知道处理的内容是什么,然后才能提出建议。
-- 编辑 2 --
当您使用多个线程时,Berkeley DB(具有简单数据模型的数据库)的行为类似于企业数据库(在事务率方面)。如果您想以高速率写入磁盘,您可能应该探索此解决方案。您可能需要一个 RAID 设置来提高吞吐量——就 IO 吞吐量和保护而言,RAID 0+1 是最好的。
在你计划任何特殊的编程之前,你应该做一些测试,看看你可以用一个 vanilla 系统处理多少。在生产者机器上设置一个模拟数据文件和发送过程,在消费者机器上设置一个简单的接受器/解析器并进行一系列分析 - 你会在哪里遇到数据问题?您可以为其提供更好的硬件,或者您可以调整您的处理速度以加快速度吗?
确保您从一个可以支持您期望的数据速率的硬件平台开始?如果您正在使用英特尔的 82598EB NIC 之类的东西,请确保将其插入 PCIe 2.0 插槽,最好是 x16 插槽,以便从 NIC 到芯片组获得全带宽。
有多种方法可以根据您的数据流调整 NIC 驱动程序的参数,以充分利用您的设置。例如,确保您在链路上使用巨型帧以最小化 TCP 开销。此外,您可以使用驱动程序的中断油门速率来加快低级别处理。
您的数据集的处理是否可并行化?如果您有一个任务将数据转储到内存中,您是否可以设置更多任务来同时处理数据块?这将充分利用多核 CPU。
最后,如果这些都不够,请使用您收集的分析/计时数据来查找可以调整以获得更好性能的系统部分。不要只是假设您知道需要调整的地方:用真实数据备份它 - 您可能会感到惊讶。
嗯,你需要钱。一种方法可能是购买负载共享交换机,将传入数据拆分到两台计算机中,然后将它们后处理到单个数据库中。
因为您有一些简化情况的方面(只有两台机器之间的稳定点对点,没有处理),我实际上会尝试在系统之间使用单个 TCP 流并将数据写入write()
磁盘的简单或明显的方法。然后测量性能和配置文件以确定任何瓶颈所在。
作为起点,请阅读C10K(10000 个同时连接)问题,这是大多数高性能服务器的开发目标。它应该为您提供有关高性能服务器问题的强大背景。当然你不需要担心 select / poll / epoll 来建立新的连接,这是一个重大的简化。
我认为最近的 linux 内核已经支持来自 nic->kernel 的 10Gb 数据包,但我怀疑是否存在将数据复制到用户空间的有效方法,即使使用 i7/XEON 5500 平台也是如此
似乎忘记了什么:如果 NIC 是 10GB 并且您担心接收器,您可以(相对)轻松地休息:即使源能够以这种速度生成数据,将数据传输到10GB 线路,因为接收器已将其从线路获取到 RAM。
如果 NIC 是 10GB,则意味着这些比特以该速率计时,但没有提及单个数据包之间的时间,而且我们还没有谈论协议。
我想这个问题同时对于 OP 来说已经过时了,但是如果你有这样的任务,从一个定期编程的解决方案开始,以便能够判断你的特殊情况需要增加什么速度(你的情况总是特别的;- )