[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <AANLkTikcS-U9yA05dTp_y4EciwtUsjSonjc+bkA=57=4@mail.gmail.com>
Date: Tue, 21 Dec 2010 13:27:00 -0500
From: John Heffner <johnwheffner@...il.com>
To: Nandita Dukkipati <nanditad@...gle.com>
Cc: "David S. Miller" <davem@...emloft.net>, netdev@...r.kernel.org,
Tom Herbert <therbert@...gle.com>,
Laurent Chavey <chavey@...gle.com>,
Yuchung Cheng <ycheng@...gle.com>
Subject: Re: [PATCH 1/1] TCP: increase default initial receive window.
I know this has already been applied, but one thing to think about:
Linux announces a small initial window to prevent overflowing the
receive buffer when receiving segments smaller than the link MTU.
Increasing this even to 10 segments might have some negative
consequences. I recall, for instance, some drivers when configured
with a 9000 byte MTU, have a single pool of receive buffers all 16k
(the next highest power of 2). So each received segment will get 16k
of allocated memory accounted to it, even if the incoming segments are
<=1460 bytes long. The default initial rcvbuf of 87380 bytes is less
than the 160k of memory that the initial window might consume, so
we're going to start hitting the very slow path of coalescing segments
to get back under memory bounds.
Some drivers are smarter about having multiple pools of receive
buffers with different sizes, so it might not be so easy to hit this
condition. I haven't looked at any of them for a while. Is this
still a real concern?
Thanks,
-John
On Fri, Dec 17, 2010 at 10:20 PM, Nandita Dukkipati <nanditad@...gle.com> wrote:
> This patch changes the default initial receive window to 10 mss
> (defined constant). The default window is limited to the maximum
> of 10*1460 and 2*mss (when mss > 1460).
>
> Signed-off-by: Nandita Dukkipati <nanditad@...gle.com>
> ---
> include/net/tcp.h | 3 +++
> net/ipv4/tcp_output.c | 11 ++++++++---
> 2 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/include/net/tcp.h b/include/net/tcp.h
> index 2ab6c9c..6c25ba8 100644
> --- a/include/net/tcp.h
> +++ b/include/net/tcp.h
> @@ -60,6 +60,9 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);
> */
> #define MAX_TCP_WINDOW 32767U
>
> +/* Offer an initial receive window of 10 mss. */
> +#define TCP_DEFAULT_INIT_RCVWND 10
> +
> /* Minimal accepted MSS. It is (60+60+8) - (20+20). */
> #define TCP_MIN_MSS 88U
>
> diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
> index 2d39066..dc7c096 100644
> --- a/net/ipv4/tcp_output.c
> +++ b/net/ipv4/tcp_output.c
> @@ -228,10 +228,15 @@ void tcp_select_initial_window(int __space, __u32 mss,
> }
> }
>
> - /* Set initial window to value enough for senders, following RFC5681. */
> + /* Set initial window to a value enough for senders starting with
> + * initial congestion window of TCP_DEFAULT_INIT_RCVWND. Place
> + * a limit on the initial window when mss is larger than 1460.
> + */
> if (mss > (1 << *rcv_wscale)) {
> - int init_cwnd = rfc3390_bytes_to_packets(mss);
> -
> + int init_cwnd = TCP_DEFAULT_INIT_RCVWND;
> + if (mss > 1460)
> + init_cwnd =
> + max_t(u32, (1460 * TCP_DEFAULT_INIT_RCVWND) / mss, 2);
> /* when initializing use the value from init_rcv_wnd
> * rather than the default from above
> */
> --
> 1.7.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists