Subject: Re: rfc: socketing it to gre
To: None <tech-net@NetBSD.org>
From: David Young <dyoung@pobox.com>
List: tech-net
Date: 10/02/2007 16:04:51
On Tue, Sep 18, 2007 at 12:23:07PM -0700, Bill Stouder-Studenmund wrote:
> On Fri, Sep 14, 2007 at 04:09:08PM -0500, David Young wrote:
> > On Fri, Sep 14, 2007 at 12:14:11PM -0700, Bill Stouder-Studenmund wrote:
> > >
> > > How much of a performance hit do we take for this?
> >
> > I haven't measured. I will.
>
> Thanks!
I have measured the TCP performance with iperf, now. Initial tests
showed a significant slowdown. A 133-MHz Soekris net4521,
cpu0: AMD Am5x86 W/B 133/160 (486-class), id 0x4f4
could sink a TCP stream over fully-socketized gre(4) at 75% the speed
of the gre(4) in -current today. The same box could source a TCP stream
over fully-socketized gre(4) at 90% the speed of gre(4) in -current today.
(The other end in all my tests is a Pentium 4 running -current from
January.)
The net4521 is very slow by today's standards. To get an idea of the
performance on a faster machine, I switched to a net4801,
cpu0: National Semiconductor Geode GX1 (586-class), 266.62 MHz, id 0x540
Performance was better, but dissatisfying. Taking some advice from
Matt Thomas and Andrew Doran, I made many optimizations: I stopped
waking a kernel thread to call sosend() and soreceive(); instead,
I use slimmed-down copies of sosend() and soreceive() that I can run
directly from a software interrupt and from a socket upcall, respectively.
The kernel thread is completely out of the xmit and recv paths, and on the
net4801, the slowdown of socketized gre(4) is IMO acceptable, at about 96%
of -current in both directions. I will test on the net4521 in a while.
Your thoughts?
> > I believe we will see an improvement in performance at the receiver when
> > there are hundreds or thousands of tunnel interfaces, because the socket
> > demux code uses a hash instead of walking a list.
>
> Cool!
I was wrong about this: while UDP sockets do use a hash, raw IP sockets
do not. Nevertheless, raw IP sockets *should* use a hash, and I have
been reading the code to find a way to do it where raw/UDP/TCP sockets
can share the most code.
Dave
--
David Young OJC Technologies
dyoung@ojctech.com Urbana, IL * (217) 278-3933 ext 24