libpcap可捕获10 Gbps网卡

时间:2011-10-14 05:12:07

标签: c++ networking

我想从丢失0的数据包中捕获10Gbps网卡的数据包。 我正在使用lipcap用于100Mbps网卡,它工作正常。 libpcap能否处理10Gbps网卡流量? 如果没有,还有什么其他替代方法可以实现这个目标?

4 个答案:

答案 0 :(得分:36)

libpcap是否能够处理10Gbps并丢失0包是你正在使用的机器和libpcap版本的问题。如果机器,CPU和HDD I / O足够快,则可能会丢失0个数据包。否则,您可能需要执行以下操作:

  • 将您的libpcap更新为最新版本。 Libpcap 1.0.0或更高版本,支持零拷贝(内存映射)机制。这意味着内核的地址空间和应用程序的地址空间都有一个缓冲区,因此不需要复制数据 从内核模式缓冲区到用户模式缓冲区。数据包仍然从skbuff(Linux)复制到共享缓冲区,因此它更像是“一个副本”,但仍然只有一个副本,因此可以减少接收捕获数据包所需的CPU时间。此外,每个应用程序唤醒调用可以从缓冲区中获取更多数据包。

  • 如果您发现CPU利用率很高,则可能是您的CPU无法处理数据包到达率。您可以使用xosview(系统负载可视化工具)在捕获期间检查系统资源。

  • 如果CPU丢弃数据包,则可以使用PF_RING。 PF_RING是libpcap的扩展,带有循环缓冲区:http://www.ntop.org/products/pf_ring/。速度更快,可以使用商用网卡http://www.ntop.org/products/pf_ring/hardware-packet-filtering/以10Gbps进行捕获。

  • 另一种方法是获取具有板载内存和特定硬件设计的NIC以进行数据包捕获,请参阅http://en.wikipedia.org/wiki/DAG_Technology

  • 如果CPU不再是您的问题,则需要测试磁盘数据传输速度。 hdparm是Linux上最简单的工具。一些发行版带有GUI,否则: $ sudo hdparm -tT /dev/hda

如果您正在开发基于libpcap的应用程序:

  • 使用pcap_stats来识别(a)丢弃的数据包数量,因为当它们到达时操作系统的缓冲区中没有空间,因为数据包的读取速度不够快; (b)网络接口或其驱动程序丢弃的数据包数量。

  • Libpcap 1.0.0有一个API,允许应用程序在可以设置缓冲区大小的平台上设置缓冲区大小。 b)如果发现设置缓冲区很困难,可以使用Libpcap 1.1.0或更高版本,其中默认捕获缓冲区大小已从32K增加到512K。 c)如果您只是使用tcpdump,请使用4.0.0或更高版本并使用-B标志作为缓冲区的大小

答案 1 :(得分:11)

您不会说出哪个操作系统或CPU。无论您是否选择libpcap都没关系,底层网络性能仍然受到操作系统内存管理及其网络驱动程序的负担。 libpcap已经跟上了步伐,可以处理10Gbps,但还有更多。

如果你想要最好的CPU以便你可以进行数字运算,运行虚拟机以及捕获数据包,那么请使用AMD Opteron CPU,它仍然优于Intel Xeon Quadcore 5540 2.53GHz(尽管Intel的XIO / DDIO介绍和主要是因为英特尔双核共享相同的L2缓存)。对于最好的现成操作系统,请使用最新的FreeBSD(使用基本硬件仍然优于Linux 3.10网络。)否则,只要你急于推出,英特尔和Linux就可以正常用于基本的无丢包10Gbps捕获你的袖子。

如果您在进行类似金融或随机或大型矩阵预测计算运算(或其他)时一直在寻求极快的速度,那么请继续阅读...

由于RedHat具有discovered,因此以10Gbps速率处理一个最小尺寸的数据包需要67.2纳秒。我认为它对于64字节以太网有效载荷来说接近81.6纳秒,但他们说的是理论上最小的46字节。

为了缩短它,如果你希望每个数据包保持在81.6 ns以下的全速率下降0%,你就可以使用或使用以下任何一个:

  • 为每个数据包进行SKB呼叫(以最大限度地减少开销,并将其分摊到几百个数据包中)
  • TLB(转换后备缓冲区,为避免这种情况,请使用巨大的页面分配)
  • 短延迟(你说过'捕获',所以延迟与此无关)。它被称为中断合并 (ethtool -C rx-frames 1024+)。
  • 跨多CPU的浮动进程(必须锁定它们,每个网络接口中断一个)
  • libc malloc()(必须用更快的版本替换它,最好是基于HUGE的版本)

因此,Linux比FreeBSD更具优势,能够以0%的丢弃率捕获10Gbps速率并运行多个虚拟机(以及其他开销)。只是它需要某种特定网络设备的某种新内存管理(MM),而不一定需要整个操作系统。大多数新的超高性能网络驱动程序现在正在使设备使用在用户空间分配的HUGE内存,然后使用驱动程序调用一次传递一包数据包。

许多具有重新调整用途的MM的新网络驱动程序已经完成(没有特别的顺序):

  • NETMAP
  • PF-RING
  • PF-RING + NETMAP
  • OpenOnload
  • DPDK
  • PacketShader

每个代码的成熟度级别高度依赖于您选择的Linux(或发行版)版本。我已经尝试了其中的一些,一旦我理解了基本设计,就会明白我需要什么。 YMMV。

更新:关于高速数据包架构的白皮书:https://arxiv.org/pdf/1901.10664.pdf

祝你好运。

答案 2 :(得分:2)

PF_RING是一个很好的解决方案,替代方案可以是netsniff-ng(http://netsniff-ng.org/)。 对于这两个项目,零复制机制都可以获得性能提升。显然,瓶颈可能是HD,它的数据传输速率。

答案 3 :(得分:1)

如果您有时间,请转到英特尔DPDK。它允许对NIC的硬件寄存器进行零拷贝访问。我能够在10Gbps时实现0%的下降,在单核上实现1.5Mpps。 从长远来看,你会变得更好