我在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 ...
}
}
答案 0 :(得分:2)
我不知道这是否会有所帮助,但在Google上看到我看到了:
Raw socket, Packet socket and Zero copy networking in Linux以及http://lxr.linux.no/linux+v2.6.36/Documentation/networking/packet_mmap.txt谈论使用PACKET_MMAP
和mmap()
来提高原始套接字的性能
Overview of Packet Reception建议设置您的流程的亲和力,以匹配您bind the NIC using RPS的CPU。
DC++
是否进行了混杂接收?我不会猜到的。因此,您可以将性能与DC++
等实用程序的性能进行比较,而不是将性能与libpcap
进行比较。
答案 1 :(得分:0)
可能是因为,在NIC和DC ++上运行的TCP / IP堆栈直接从NIC获取数据流,因此您的处理器没有进行任何TCP / IP工作。但在你的情况下,我认为你是直接尝试从NIC获取数据,因此它不会由NIC处理,而是由处理器处理,并且因为你有无限循环来获取数据,所以你需要进行大量的处理...所以CPU使用率尖刺。