Speeding up networking, worth a read.
Matthew Dillon
dillon at apollo.backplane.com
Wed Mar 8 16:16:23 PST 2006
:Simon 'corecode' Schubert wrote:
:
:> ...we don't feel comfortable with a tcp stack in userland...
:
:Could you explain in basic bonehead terms why not? I've long
:been a fan of the microkernel which runs *everything* in
:userland.
:
:But (as my wife would quickly tell you) I'm an idiot :o)
:Is your objection based on performance, or security, or --
:what?
Well, what they are talking about is different from microkernel type
architectures. They are talking about moving all the protocol code
into the same context as the user program that is making the
connection. The entire performance benefit comes from not having
to context switch into the kernel and back out again. There is some
argument for cache locality of reference, but personally speaking
I think there are plenty of other ways to localize data accesses
that do not require running everything in one context (such as what
we've done with our threaded TCP protocol implementation).
In otherwords, you lose the protection between functional subsystems.
Now, its true that everything running in the kernel is also running in
a single context (the kernel context), but I would argue that the
danger here is that you are suddenly asking application programmers to
debug the TCP stack, and kernel/protocol programmers to debug a
massive user application when things go wrong.
It would be disaster. It would become extremely difficult to track down
bugs. And because of that I think its an ultra bad idea. It is not
worth the ~1 uS savings per system call. It just isn't.
In a traditional microkernel architecture things like the TCP stack would
run in their own processes and, indeed, this WOULD improve stability
simply by exposing bugs more quickly due to the protection space
separation that each subsystem enjoys. I think this is a fine idea *IF*
your sole goal is to have an ultra reliable system rather then an
ultra fast system. Most people need a mix of the two, with emphasis
on performance, which is why microkernel architectures don't fare so
well in the real world.
There are also issues with distributability. On a UP system or a 2-way
SMP system, or in situations where you have many forked processes running,
you might get some performance gains from localizing the TCP protocol
stack to the application making the connection. But who is to say that
that situation is going to persist as we continue to move forwards? If
SUN has their way, we'll be running on 256-way machines in the household
20 years from now and all of that serialized protocol code will destroy
performance rather then improve it.
-Matt
Matthew Dillon
<dillon at xxxxxxxxxxxxx>
More information about the Users
mailing list