Update Netperf page for a few years of work -- most tasks are now done.

This commit is contained in:
Robert Watson 2009-06-01 13:58:46 +00:00
parent 04150949ba
commit 1692b9c519
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/www/; revision=34359

View file

@ -1,6 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//FreeBSD//DTD HTML 4.01 Transitional-Based Extension//EN" [
<!ENTITY base CDATA "../..">
<!ENTITY date "$FreeBSD: www/en/projects/netperf/index.sgml,v 1.19 2006/04/23 19:43:02 rwatson Exp $">
<!ENTITY date "$FreeBSD: www/en/projects/netperf/index.sgml,v 1.20 2006/08/19 21:20:43 hrs Exp $">
<!ENTITY title "FreeBSD Network Performance Project (netperf)">
<!ENTITY email 'mux'>
<!ENTITY % navinclude.developers "INCLUDE">
@ -53,11 +53,10 @@
will work toward these goals:</p>
<ul>
<li><p>Complete locking work to make sure all components of the stack
are able to run without the Giant lock. While most of the network
stack, especially mainstream protocols, runs without Giant, some
components require Giant to be placed back over the stack if compiled
into the kernel, reducing parallelism.</p></li>
<li><p>The Netperf project has completed locking work for all components
of the network stack; as of FreeBSD 7.0 we have removed non-MPSAFE
protocol shims, and as of FreeBSD 8.0 we have removed non-MPSAFE
device driver shims.</p></li>
<li><p>Optimize locking strategies to find better balances between
locking granularity and locking overhead. In the first cut at locking
@ -126,7 +125,8 @@
increasing effective CPU utilization and hence throughput. For
example, introducing additional netisr threads capable of running on
more than one CPU at a time can increase input parallelism, subject
to maintaining desirable packet ordering.</p></li>
to maintaining desirable packet ordering (present in FreeBSD
8.0).</p></li>
</ul>
<a name="tasks"></a>
@ -204,13 +204,12 @@
<tr>
<td> Employ queued dispatch across netisr dispatch API </td>
<td> &a.rwatson; </td>
<td> 20041124 </td>
<td> &status.prototyped; </td>
<td> Pull all of the mbufs in the netisr ifqueue out of the ifqueue
into a thread-local mbuf queue to avoid repeated lock operations
to access the queue. Also use lock-free operations to test for
queue contents being present. This has been prototyped in the
rwatson_netperf branch. </td>
<td> 20090601 </td>
<td> &status.done </td>
<td> Pull all of the mbufs in the netisr queue into a thread-local
mbuf queue to avoid repeated lock operations to access the queue.
This work was completed as part of the netisr2 project, and will
ship with 8.0-RELEASE. </td>
</tr>
<tr>
@ -247,8 +246,8 @@
critical sections to synchronize access instead of a mutex. While
malloc(9) is less frequently used in the network stack than uma(9),
it is used for socket address data, so is on performance critical
paths for datagram operations. This has been committed and will
appear in 6.0-RELEASE. </td>
paths for datagram operations. This has been committed and appeared
6.0-RELEASE. </td>
</tr>
<tr>
@ -266,11 +265,11 @@
cost of critical sections in the common case by avoiding expensive
microcode operations on the CPU. By restoring this model, or a
variation on it, critical sections can be made substantially
cheaper to enter. In particular, this change will lower the cost
cheaper to enter. In particular, this change lowers the cost
of critical sections on UP such that it is approximately the same
cost as a mutex, meaning that optimizations on SMP to use critical
sections instead of mutexes will not harm UP performance. This
change has now been committed, and will appear in 6.0-RELEASE. </td>
change has now been committed, and appeared in 6.0-RELEASE. </td>
</tr>
<tr>
@ -296,26 +295,41 @@
<tr>
<td> Add true inpcb reference count support </td>
<td> &a.mohans;, &a.rwatson;, &a.peter; </td>
<td> 20060412 </td>
<td> &status.new; </td>
<td> Currently, the in-bound TCP and UDP socket paths rely on the
<td> 20081208 </td>
<td> &status.done; </td>
<td> Historically, the in-bound TCP and UDP socket paths relied on
global pcbinfo info locks to prevent PCBs being delivered to from
being garbage collected by another thread while in use. This set
of changes introduces a true reference model for PCBs so that the
global lock can be released during in-bound process.</td>
global lock can be released during in-bound process, and appear
in 8.0-RELEASE./td>
</tr>
<tr>
<td> Fine-grained locking for UNIX domain sockets </td>
<td> &a.rwatson; </td>
<td> 20060416 </td>
<td> &status.prototyped; </td>
<td> Currently, UNIX domain sockets in FreeBSD 5.x and 6.x use a
single global subsystem lock. This is sufficient to allow it to
run without Giant, but results in contention with large numbers
of processors simultaneously operating on UNIX domain sockets.
This task introduces per-protocol control block locks in order
to reduce contention on a larger subsystem lock. </td>
<td> 20070226 </td>
<td> &status.done; </td>
<td> UNIX domain sockets in FreeBSD 5.x and 6.x use a single global
subsystem lock. This is sufficient to allow it to run without
Giant, but results in contention with large numbers of processors
simultaneously operating on UNIX domain sockets. This task
introduced per-protocol control block locks in order to reduce
contention on a larger subsystem lock, and the results appeared in
7.0-RELEASE. </td>
</tr>
<tr>
<td> Multiple netisr threads </td>
<td> &a.rwatson; </td>
<td> 20090601 </td>
<td> &status.done; </td>
<td> Historically, the BSD network stack has used a single network
software interrupt context, for deferred network processing. With
the introduction of multi-processing, this became a single
software interrupt thread. In FreeBSD 8.0, multiple netisr
threads are now supported, up to the number of CPUs present in the
system.</td>
</tr>
</table>