ネットワークからすべてのパケットを収集する単純なアプリケーションを Linux で作成しています。「recvfrom()」関数を呼び出して受信をブロックしています。hping3 で大きなネットワーク負荷 (1 秒あたり最大 100k の生フレーム、それぞれ 130 バイト) を生成すると、「トップ」ツールはプロセスの CPU 使用率が高いことを示します - 約 37-38% です。それは私にとって大きな価値です。パケット数を減らすと、使用率が低くなります。たとえば、1 秒あたり 4k フレームの場合、top は 3% を示します。
DC++ が 10MB/s までダウンロードし、そのプロセスが CPU の 38% ではなく 5% を使用している場合に、DC++ をチェックしました。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 ...
}
}