高CPU使用率 - Linux上的简单数据包接收器

时间:2013-01-03 19:13:12

标签: linux networking cpu-usage

我在Linux下编写简单的应用程序,收集来自网络的所有数据包。我通过调用“recvfrom()”函数使用阻塞接收。当我使用hping3(每秒约100k原始帧,每个130字节)生成大网络负载时,“顶部”工具显示我的进程的高CPU使用率 - 大约为37-38%。这对我来说很有价值。当我减少数据包的数量时,使用率会降低 - 例如,top表示每秒4k帧的3% 当它下载~10MB / s时我检查DC ++,它的过程不使用38%的CPU而是5%。在C中是否有任何可编程方式可以降低CPU使用率并仍然可以接收大量帧?

我的CPU: Intel i5-2400 CPU @ 3.10Ghz

我的系统: 带有PREEMPT-RT补丁的Ubuntu 11.04内核3.6.6

这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <arpa/inet.h>

/* Socket descriptor. */
int mainSocket; 

/* Buffer for frame. */
unsigned char* buffer;

int main(int argc, char* argv[])
{
    /** Create socket. **/  
    mainSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if (mainSocket == -1) { 
        printf("Error: cannot create socket!\n");
    }

    /** Create buffer for frame **/
    buffer = malloc(ETH_FRAME_LEN);

    printf("Listing...");

    while(1) {

        // Length of received packet
        int length = recvfrom(mainSocket, buffer, ETH_FRAME_LEN, 0, NULL, NULL);
        if(length > 0) 
        {   
            // ... do something ...
        }
    }

2 个答案:

答案 0 :(得分:2)

我不知道这是否会有所帮助,但在Google上看到我看到了:

DC++是否进行了混杂接收?我不会猜到的。因此,您可以将性能与DC++等实用程序的性能进行比较,而不是将性能与libpcap进行比较。

答案 1 :(得分:0)

可能是因为,在NIC和DC ++上运行的TCP / IP堆栈直接从NIC获取数据流,因此您的处理器没有进行任何TCP / IP工作。但在你的情况下,我认为你是直接尝试从NIC获取数据,因此它不会由NIC处理,而是由处理器处理,并且因为你有无限循环来获取数据,所以你需要进行大量的处理...所以CPU使用率尖刺。