在linux上使用libpcap最有效的方法

时间:2012-08-07 16:50:01

标签: linux libpcap

我有一个在Linux(2.6.38.8)上运行的应用程序,使用libpcap(> 1.0)来捕获通过以太网传输的数据包。我的应用程序使用接近100%的CPU,我不确定我是否尽可能高效地使用libpcap。

我正在努力寻找pcap可调参数和性能之间的任何关联。

这是我的简化代码(省略错误检查等):

// init libpcap
pcap_t *p = pcap_create("eth0", my_errbuf);
pcap_set_snaplen(p, 65535);
pcap_set_promisc(p, 0);
pcap_set_timeout(p, 1000);
pcap_set_buffer_size(p, 16<<20); // 16MB
pcap_activate(p);

// filter
struct bpf_program filter;
pcap_compile(p, &filter, "ether dst 00:11:22:33:44:55", 0, 0);
pcap_setfilter(p, &filter);

// do work
while (1) {
    int ret = pcap_dispatch(p, -1, my_callback, (unsigned char *) my_args);
    if (ret <= 0) {
        if (ret == -1) {
            printf("pcap_dispatch error: %s\n", pcap_geterr(p));
        } else if (ret == -2) {
            printf("pcap_dispatch broken loop\n");
        } else if (ret == 0) {
            printf("pcap_dispatch zero packets read\n");
        } else {
            printf("pcap_dispatch returned unexpectedly");
        }
    } else if (ret > 1) {
        printf("processed %d packets\n", ret);
    }
}

使用1000毫秒的超时,缓冲区大小为2M,4M和16M的结果在高数据速率下相同(~200 1kB包/秒):pcap_dispatch始终返回2.根据pcap_dispatch手册页,我希望pcap_dispatch在缓冲区已满或超时到期时返回。但是返回值为2时,这两个条件都不应该满足,因为只读取了2kB的数据,并且仅过了2/200秒。

如果我减慢数据速率(~100 lkB数据包/秒),pcap_dispatch将返回2到7之间,因此数据速率减半会影响每个pcap_dispatch处理的数据包数量。 (我认为数据包越多越好,因为这意味着操作系统和用户空间之间的上下文切换更少 - 这是真的吗?)

超时值似乎没有任何区别。

在所有情况下,我的CPU使用率接近100%。

我开始怀疑我是否应该尝试使用PF_RING版本的libpcap,但是从我在SO和libpcap邮件列表中读到的内容,libpcap&gt; 1.0无论如何都会做零拷贝的东西,所以也许没有意义。

任何想法,指针都非常感谢! ģ

0 个答案:

没有答案