【问题标题】:High CPU usage - simple packet receiver on Linux高 CPU 使用率 - Linux 上的简单数据包接收器
【发布时间】:2013-01-03 19:13:12
【问题描述】:

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

【问题讨论】:

    标签: linux networking cpu-usage


    【解决方案1】:

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

    DC++ 是否进行混杂接收?我不会这么猜的。因此,与其将您的性能与DC++ 进行比较,不如将您的性能与libpcap 等实用程序的性能进行比较。

    【讨论】:

    • 是的,它应该很有用,尤其是 mmap() func。我会检查它,我会尽快提供有关结果的信息。
    • 最后,我已经实现了 mmap(),主循环现在正在处理简单的 poll() 函数(我使用了这个例子 scaramanga.co.uk/code-fu/lincap.c),当我' m 每秒接收 100k 帧。我的应用程序取决于 NIC 生成的中断数。我还在考虑如何改进我的代码..
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2021-06-04
      • 2021-07-22
      • 1970-01-01
      相关资源
      最近更新 更多