我想从 10Gbps 网卡抓包,丢包率为 0。 我正在为 100Mbps NIC 使用 lipcap,它工作正常。 libpcap 能否处理 10Gbps 的 NIC 流量? 如果不是,还有什么其他替代方法可以实现这一目标?
最佳答案
libpcap 是否能以 0 丢包处理 10Gbps 取决于您使用的机器和 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/ .它速度更快,并且可以使用商用 NIC 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) 网络接口(interface)或其驱动程序丢弃的数据包数。
Libpcap 1.0.0 有一个 API,允许应用程序在可以设置缓冲区大小的平台上设置缓冲区大小。 b) 如果您觉得很难设置缓冲区,您可以使用 Libpcap 1.1.0 或更高版本,其中默认捕获缓冲区大小已从 32K 增加到 512K。 c) 如果您只是使用 tcpdump,请使用 4.0.0 或更高版本并使用 -B 标志作为缓冲区大小
关于c++ - 用于捕获 10 Gbps NIC 的 libpcap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7763321/