Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Apr 2012 21:03:09 +0200
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        net@freebsd.org, current@freebsd.org
Subject:   more network performance info: ether_output()
Message-ID:  <20120420190309.GA5617@onelab2.iet.unipi.it>
In-Reply-To: <20120419133018.GA91364@onelab2.iet.unipi.it>
References:  <20120419133018.GA91364@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help
Continuing my profiling on network performance, another place
were we waste a lot of time is if_ethersubr.c::ether_output()

In particular, from the beginning of ether_output() to the
final call to ether_output_frame() the code takes slightly
more than 210ns on my i7-870 CPU running at 2.93 GHz + TurboBoost.
In particular:

- the route does not have a MAC address (lle) attached, which causes
  arpresolve() to be called all the times. This consumes about 100ns.
  It happens also with locally sourced TCP.
  Using the flowtable cuts this time down to about 30-40ns

- another 100ns is spend to copy the MAC header into the mbuf,
  and then check whether a local copy should be looped back.
  Unfortunately the code here is a bit convoluted so the
  header fields are copied twice, and using memcpy on the
  individual pieces.

Note that all the above happens not just with my udp flooding
tests, but also with regular TCP traffic.

cheers
luigi



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120420190309.GA5617>