libpcap可捕获10 Gbps网卡

nam*_*ith 25 c++ networking

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

Ioa*_*pas 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/.速度更快,可以通过商用网卡以10Gbps捕获http://www.ntop.org/products/pf_ring/hardware-packet-filtering/.

  • 另一种方法是获得具有板载内存和用于数据包捕获的特定硬件设计的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标志作为缓冲区的大小


Joh*_*ene 11

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

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

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

正如RedHat所发现的那样,67.2纳秒是以10Gbps速率处理一个最小尺寸数据包所需的.对于64字节以太网有效载荷,我断言它接近81.6纳秒,但它们在理论上说是46字节最小.

如果您希望每个数据包保持在81.6 ns以下,那么如果您希望全速率下降0%,则无法执行以下任何操作:

  • 为每个数据包进行SKB呼叫(以最小化该开销,在几百个数据包中分摊)
  • TLB(转换后备缓冲区,为避免这种情况,使用巨大的页面分配)
  • 短延迟(你确实说'捕获',所以延迟在这里无关紧要).它叫做Interrupt Coalesce(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(或发行版)版本.我已经尝试了其中的一些,一旦我理解了基本设计,就会明白我需要什么.因人而异.

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

祝好运.