1

我正在 Linux 下编写简单的应用程序,用于收集来自网络的所有数据包。我通过调用“recvfrom()”函数来使用阻塞接收。当我使用 hping3(每秒约 100k 原始帧,每个 130 字节)生成大网络负载时,“top”工具显示我的进程的 CPU 使用率很高 - 大约为 37-38%。这对我来说很有价值。当我减少数据包数量时,使用率会降低 - 例如,对于每秒 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 ...
        }
    }
4

2 回答 2

2

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

DC++乱收吗?我不会这么猜的。因此,与其比较你的性能DC++,也许你应该将你的性能与类似libpcap.

于 2013-01-03T19:52:32.933 回答
0

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

于 2013-01-03T19:27:56.540 回答