]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Retire the system-wide, per-reassembly queue segment limit. The mechanism is far
authorlstewart <lstewart@FreeBSD.org>
Sat, 16 Oct 2010 07:12:39 +0000 (07:12 +0000)
committerlstewart <lstewart@FreeBSD.org>
Sat, 16 Oct 2010 07:12:39 +0000 (07:12 +0000)
commit91a790ee6eb79ee70716805678dce2cca93a990b
treed94319f99714864b36efa859a45e46f057caf4d7
parentab26135efcc4fcf05ac5f88fde6ca4a8275a4b75
Retire the system-wide, per-reassembly queue segment limit. The mechanism is far
too coarse grained to be useful and the default value significantly degrades TCP
performance on moderate to high bandwidth-delay product paths with non-zero loss
(e.g. 5+Mbps connections across the public Internet often suffer).

Replace the outgoing mechanism with an individual per-queue limit based on the
number of MSS segments that fit into the socket's receive buffer. This should
strike a good balance between performance and the potential for resource
exhaustion when FreeBSD is acting as a TCP receiver. With socket buffer
autotuning (which is enabled by default), the reassembly queue tracks the
socket buffer and benefits too.

As the XXX comment suggests, my testing uncovered some unexpected behaviour
which requires further investigation. By using so->so_rcv.sb_hiwat
instead of sbspace(&so->so_rcv), we allow more segments to be held across both
the socket receive buffer and reassembly queue than we probably should. The
tradeoff is better performance in at least one common scenario, versus a devious
sender's ability to consume more resources on a FreeBSD receiver.

Sponsored by: FreeBSD Foundation
Reviewed by: andre, gnn, rpaulo
MFC after: 2 weeks
sys/netinet/tcp_reass.c