Hi all,
I'm working on a multi-threaded multi-interface high-throughput packet
generator. The architecture consists of a number of producer threads,
each (nearly) independently creating packets according to a reference
model of packet flows. I've used PF_RING ZC successfully, using the
standard libpcap API, just changing the interface to "zc:ethX". I had no
problem with three producer threads, writing onto a single 10 Gbps
interface. However I'm experiencing throughput limits, when using
multiple interfaces, the sum of two interfaces reachs a maximum of 15-16
Gbps, with three or more of producer threads.
I reached the conclusion that maybe I can get a performance boost, using
the native PF_RING ZC API (probably the burst API). To get familiar with
the ZC API, before changing my own packet generator, I started with
zsend.c, in the zc_examples folder, changed it to work with multiple
threads and interfaces, and removed the unnecessary parts (code link is
at end of message). Unfortunately, the threads start by writing out
some packets, but after about a second, the system hangs in a deadlock
where both threads are stuck in this loop (lines 411-420 in zsend.cpp):
while ((sent_bytes = pfring_zc_send_pkt(zq[d],
&buffers[threadIndex][d][buffer_id[d]], flush_packet)) < 0) {
if (do_shutdown)
break;
if (!active)
usleep(1);
....
}
On each round sent_bytes is negative and the packets don't get sent. I
tried hard to find what has caused this, but I have no clue.
To test this, please download the code file (link at end of message),
and extract it. Then change line 486, appropriately:
devices.push_back(string("zc:eth4"));
And compile the code:
make clean
make
Then run zsend like this:
./zsend -t 2
That makes it create two producer threads, both writing on the interface
specified on line 486.
Any clue?
The code is uploaded here: https://yadi.sk/d/K73fdfGicyBrq
Best Regards,
Igor
_______________________________________________
Ntop-misc mailing list
[email protected]
http://listgateway.unipi.it/mailman/listinfo/ntop-misc