netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Make CUBIC Hystart more robust to RTT variations
@ 2011-03-08  9:32 Lucas Nussbaum
  2011-03-08 10:21 ` WANG Cong
  2011-03-10 23:28 ` Stephen Hemminger
  0 siblings, 2 replies; 27+ messages in thread
From: Lucas Nussbaum @ 2011-03-08  9:32 UTC (permalink / raw)
  To: netdev; +Cc: Sangtae Ha

CUBIC Hystart uses two heuristics to exit slow start earlier, before
losses start to occur. Unfortunately, it tends to exit slow start far too
early, causing poor performance since convergence to the optimal cwnd is
then very slow. This was reported in
http://permalink.gmane.org/gmane.linux.network/188169 and
https://partner-bugzilla.redhat.com/show_bug.cgi?id=616985

I am using an experimental testbed (http://www.grid5000.fr/) with two
machines connected using Gigabit ethernet to a dedicated 10-Gb backbone.
RTT between both machines is 11.3ms. Using TCP CUBIC without Hystart, cwnd
grows to ~2200.  With Hystart enabled, CUBIC exits slow start with cwnd
lower than 100, and often lower than 20, which leads to the poor
performance that I reported.

After instrumenting TCP CUBIC, I found out that the segment-to-ack RTT
tends to vary quite a lot even when the network is not congested, due to
several factors including the fact that TCP sends packet in burst (so the
packets are queued locally before being sent, increasing their RTT), and
delayed ACKs on the destination host.

The patch below increases the thresholds used by the two Hystart
heuristics. First, the length of an ACK train needs to reach 2*minRTT.
Second, the max RTT of a group of packets also needs to reach 2*minRTT.
In my setup, this causes Hystart to exit slow start when cwnd is in the
1900-2000 range using the ACK train heuristics, and sometimes to exit in the
700-900 range using the delay increase heuristic, dramatically improving
performance.

I've left commented out a printk that is useful for debugging the exit
point of Hystart. And I could provide access to my testbed if someone
wants to do further experiments.

Signed-off-by: Lucas Nussbaum <lucas.nussbaum@loria.fr>
-- 
| Lucas Nussbaum             MCF Université Nancy 2 |
| lucas.nussbaum@loria.fr         LORIA / AlGorille |
| http://www.loria.fr/~lnussbau/  +33 3 54 95 86 19 |

diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
index 71d5f2f..a973a49 100644
--- a/net/ipv4/tcp_cubic.c
+++ b/net/ipv4/tcp_cubic.c
@@ -344,7 +344,7 @@ static void hystart_update(struct sock *sk, u32 delay)
                /* first detection parameter - ack-train detection */
                if (curr_jiffies - ca->last_jiffies <= msecs_to_jiffies(2)) {
                        ca->last_jiffies = curr_jiffies;
-                       if (curr_jiffies - ca->round_start >= ca->delay_min>>4)
+                       if (curr_jiffies - ca->round_start >= ca->delay_min>>2)
                                ca->found |= HYSTART_ACK_TRAIN;
                }
 
@@ -355,8 +355,7 @@ static void hystart_update(struct sock *sk, u32 delay)
 
                        ca->sample_cnt++;
                } else {
-                       if (ca->curr_rtt > ca->delay_min +
-                           HYSTART_DELAY_THRESH(ca->delay_min>>4))
+                       if (ca->curr_rtt > ca->delay_min<<1)
                                ca->found |= HYSTART_DELAY;
                }
                /*
@@ -364,7 +363,10 @@ static void hystart_update(struct sock *sk, u32 delay)
                 * we exit from slow start immediately.
                 */
                if (ca->found & hystart_detect)
+               {
+//                     printk("hystart_update: cwnd=%u found=%d delay_min=%u cur_jif=%u round_start=%u curr_rtt=%u\n", tp->snd_cwnd, ca->found, ca
                        tp->snd_ssthresh = tp->snd_cwnd;
+               }
        }
 }

^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2011-03-11  6:02 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-08  9:32 [PATCH] Make CUBIC Hystart more robust to RTT variations Lucas Nussbaum
2011-03-08 10:21 ` WANG Cong
2011-03-08 11:10   ` Lucas Nussbaum
2011-03-08 15:26     ` Injong Rhee
2011-03-08 19:43       ` David Miller
2011-03-08 23:21         ` Stephen Hemminger
2011-03-09  1:30           ` Injong Rhee
2011-03-09  6:53             ` Lucas Nussbaum
2011-03-09 17:56               ` Stephen Hemminger
2011-03-09 18:25                 ` Lucas Nussbaum
2011-03-09 19:56                   ` Stephen Hemminger
2011-03-09 21:28                     ` Lucas Nussbaum
2011-03-09 20:01                   ` Stephen Hemminger
2011-03-09 21:12                     ` Yuchung Cheng
2011-03-09 21:33                       ` Lucas Nussbaum
2011-03-09 21:51                         ` Stephen Hemminger
2011-03-09 22:03                           ` Lucas Nussbaum
2011-03-10  5:24               ` Bill Fink
2011-03-10  6:17                 ` Stephen Hemminger
2011-03-10  7:17                   ` Bill Fink
2011-03-10  8:54                     ` Lucas Nussbaum
2011-03-11  2:25                       ` Bill Fink
2011-03-10 14:37                 ` Injong Rhee
2011-03-09  1:33           ` Sangtae Ha
     [not found]     ` <AANLkTimdpEKHfVKw+bm6OnymcnUrauU+jGOPeLzy3Q0o@mail.gmail.com>
2011-03-08 18:14       ` Lucas Nussbaum
2011-03-10 23:28 ` Stephen Hemminger
2011-03-11  5:59   ` Lucas Nussbaum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).