我正在 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 ...
}
}