4

在 Linux 路由器上,我编写了一个 C 程序,它使用 pcap 来获取 IP 标头和数据包的长度。通过这种方式,我能够收集统计数据并根据 IP 测量带宽。挺整洁的。:-)

现在流量和用户数量都在增长,旧程序开始挣扎。也就是说,路由器难以应对大量的数据包。在“黄金时段”总共每秒超过 50000 个数据包。

该程序本身非常优化。我不想炫耀,但我相信它可以做到最好。它读取 IP 标头和数据包长度。然后它将 IP 转换为索引(只是一个简单的减法),并将数据包的长度存储(累加)在一个数组中。它时不时地(实际上是一个 SIGALRM)将数组存储在 MySQL 数据库中。

我的问题是:有没有其他方法可以利用以太网设备来获得比 pcap 更“便宜”的比特流?

我当然可以修改以太网驱动程序以包含单个 IP 统计信息收集,但这似乎有点过头了。

基本上,我的程序是繁忙的 eth0 上的“tcpdump”,最终会杀死我的路由器。

4

2 回答 2

6

你考虑过PF_RING吗?pcap由于零拷贝机制,它仍然是类似的世界,但在类固醇上:

在此处输入图像描述

如您所见,有一个内核模块提供将低级数据包复制到PF_RING缓冲区中,并且有允许访问此缓冲区的用户区部分。

谁需要PF_RING?

基本上每个必须每秒处理许多数据包的人。术语“许多”会根据您用于流量分析的硬件而有所不同。它的范围从 1.2GHz ARM 上的 80k pkt/sec 到低端 2.5GHz Xeon 上的 14M pkt/sec 及以上。PF_RING 不仅使您能够更快地捕获数据包,它还可以更有效地捕获数据包,从而保留 CPU 周期......

于 2012-04-20T12:51:52.063 回答
0

我强烈推荐你使用 PF_RING ZC。它可以在 /userland/examples_zc 下找到。它是 pf_ring 的一部分。

您可以通过 pf_ring zc 以线速处理和捕获数十 Gbps 的流量。

于 2016-12-29T05:26:04.140 回答