Hi again,
as promised, here are some data from a DomU-2-DomU iperf flow,
pushing 0.8Gbits in 0.38sec (~2.1Gbps):
http://www.cl.cam.ac.uk/~dp463/files/mirageNetData.tar.gz
Note that I've used a txqueuelen of 500 for each VIF in dom0.
Also, with TCP debug disabled, speeds reach >= 2.5Gbps.
Everythin seems smoother. Didn't observe any odd TX delay spikes
caused by netif blocking.
Regards,
D.
On 24/09/13 02:36, Dimosthenis Pediaditakis wrote:
Hi David,
sorry for the absence. I attended a Workshop on SDN last week,
and today was quite a busy day.
I had a look in the interrupt branch of your mirage-platform
repo, cloned it and ran a few experiments.
The speeds I got were consistently between 2.45-2.6Gbps on my
machine (i7-3770, dual ch. DDR3 1600), which is a very good
number.
Unfortunatelly, I didn't have the time to further stress test it
and generate any TCP stack plots. This is the top item in my
TODO list.
I also went briefly through the additions/modifications in
hypervisor.c, main.c, activations.ml, netif.ml, main.ml
It seems that SCHEDOP_block + no-op handling + evtchn_poll +
VIRQ_TIMER-bind along with the rewriting of Activations (fix
for the silently dropped events) have done the trick.
A couple of questions:
- In file hypervisor.c, what is the purpose of "
force_evtchn_callback" ? I've seen it only being invoked via
"__sti()" and "__restore_flags()"
- In the updated design, when an event is received, then:
SCHEDOP_block returns,
event_poll is then invoked, and
finally Main.aux() is called.
Activations.run() is invoked in Main.aux() if no threads are
scheduled, and subsequently the domain is blocked again (until a
timer interrupt, or reception of another event). My question is
why don't we re-check right after "Activations.run()" the state
of t ? For example if packets are waiting to be sent, and netif
gets unblocked, why we block the domain directly again?
Also, thanks thanks for the credits in you updates :-)
D.
On 19/09/13 22:41, David Scott wrote:
Hi Dimos,
I've created a new patch set based on a mix of your ideas
and mine:
I've proposed switching to SCHEDOP_block with interrupts
enabled. Unlike in regular Mini-OS I don't think we need to
do anything in the hypervisor_callback, because we already
have code to poll the evtchn pending bits in evtchn_poll--
so we're a bit of a hybrid: interrupts on for wakeups but
the whole OS is still based around a select/poll-style loop.
I've left all event channels unmasked and used the
event_upcall_mask to turn on/off event delivery globally.
I've revamped the OCaml Activations interface to remove one
source of missing events.
So far the code is working ok in my testing. I ran
mirage-iperf and am getting 1642002 KBit/sec on my test
hardware -- I don't know if this is considered good or bad!
I ran your instrumented version (thanks for the exhaustive
instructions btw) and it drew some pretty graphs, but I'm
not enough of a TCP expert to interpret them properly.
Could you give this a go in your test environment and let
me know what you think?
I'm extremely suspicious of the console code -- it
shouldn't be necessary to include a delay in the print loop;
that's definitely worth investigating.
Cheers,
Dave
|