git: tcp/tso: Add per-device TSO aggregation size limit
sephe at crater.dragonflybsd.org
Tue Jan 22 03:57:08 PST 2013
Author: Sepherosa Ziehau <sephe at dragonflybsd.org>
Date: Wed Jan 16 19:02:36 2013 +0800
tcp/tso: Add per-device TSO aggregation size limit
- Prevent possible TSO large burst, when it is inappropriate (plenty of
>24 segements bursts were observered, even when 32 parallel sending TCP
streams are running on the same GigE NIC).
TSO large burst has following drawbacks on a single TX queue, even on
the devices that are multiple TX queues capable:
o Delay other senders' packet transmission quite a lot.
o Has negative effect on TCP receivers, which sends ACKs.
o Cause buffer bloat in software sending queues, whose upper limit is
based on "packet count".
o Packet scheduler's decision could be less effective.
On the other hand, TSO large burst could improve CPU usage.
- Improve fairness between multiple TX queues on the devices that are
multiple TX queues capable but only fetch data on TSO large packet
boundary instead of TCP segment boundary.
Drivers could supply their own TSO aggregation size limit. If driver
does not set it, the default value is 6000 (4 segments if MTU is 1500).
The default value increases CPU usage a little bit: on i7-2600 w/ HT
enabled, single TCP sending stream, CPU usage increases from 14%~17%
User could configure TSO aggregation size limit by using ifconfig(8):
ifconfig ifaceX tsolen _n_
Summary of changes:
sbin/ifconfig/ifconfig.8 | 13 +++++++++++--
sbin/ifconfig/ifconfig.c | 20 +++++++++++++++++++-
sys/net/if.c | 17 +++++++++++++++++
sys/net/if.h | 2 ++
sys/net/if_ethersubr.c | 16 ++++++++++++++++
sys/net/if_var.h | 2 +-
sys/netinet/tcp_output.c | 10 ++++++++--
sys/sys/sockio.h | 3 +++
8 files changed, 77 insertions(+), 6 deletions(-)
DragonFly BSD source repository
More information about the Commits