tcp: Reduce minimum retransmit timeout to 190ms.
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 22 Jun 2017 22:06:31 +0000 (06:06 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 22 Jun 2017 22:06:31 +0000 (06:06 +0800)
Increase retransmit timeout slop to ~160ms and reduce TCPTV_MIN
to ~30ms.  Bring in dillon's comment about TCPTV_MIN reduction
and retransmit timeout slop from FreeBSD.  And make sure that
tcp_rexmit_min is valid for a low kern.hz setting.

sys/netinet/tcp_subr.c
sys/netinet/tcp_timer.h

index fab80d8..3b4d195 100644 (file)
@@ -376,6 +376,8 @@ tcp_init(void)
        tcp_maxpersistidle = TCPTV_KEEP_IDLE;
        tcp_msl = TCPTV_MSL;
        tcp_rexmit_min = TCPTV_MIN;
+       if (tcp_rexmit_min < 1) /* if kern.hz is too low */
+               tcp_rexmit_min = 1;
        tcp_rexmit_slop = TCPTV_CPU_VAR;
 
        TUNABLE_INT_FETCH("net.inet.tcp.tcbhashsize", &hashsize);
index 0713efe..bbe3e20 100644 (file)
 #define        TCPTV_KEEPCNT   8                       /* max probes before drop */
 
 /*
- * TCPTV_MIN represents the minimum allowed retransmit interval.  It
- * is currently one second but will ultimately be reduced to 3 ticks
- * for algorithmic stability, leaving the 200ms variance to deal with
- * delayed-acks, protocol overheads.  A 1 second minimum badly breaks
- * throughput on any network faster then a modem that has minor but
- * continuous packet loss unrelated to congestion, such as on a wireless
- * network.
+ * Minimum retransmit timer is 3 ticks, for algorithmic stability.
+ * TCPT_RANGESET() will add another TCPTV_CPU_VAR to deal with
+ * the expected worst-case processing variances by the kernels
+ * representing the end points.  Such variances do not always show
+ * up in the srtt because the timestamp is often calculated at
+ * the interface rather then at the TCP layer.  This value is
+ * typically 50ms.  However, it is also possible that delayed
+ * acks (typically 100ms) could create issues so we set the slop
+ * to ~160ms to try to cover it.  Note that, properly speaking,
+ * delayed-acks should not create a major issue for interactive
+ * environments which 'P'ush the last segment, at least as
+ * long as implementations do the required 'at least one ack
+ * for every two packets' for the non-interactive streaming case.
+ *
+ * The prior minimum of 1*hz (1 second) badly breaks throughput
+ * on any networks faster then a modem that has minor (e.g. 1%)
+ * packet loss.
  */
-#define        TCPTV_MIN       ( hz/2 )                /* minimum allowable value */
-#define TCPTV_CPU_VAR  ( hz/10)                /* cpu variance (100ms) */
+#define        TCPTV_MIN       ( hz/33 )               /* minimum allowable value */
+#define        TCPTV_CPU_VAR   ( hz/6 )                /* cpu variance (~160ms) */
 #define        TCPTV_REXMTMAX  ( 64*hz)                /* max allowable REXMT value */
 
 #define TCPTV_TWTRUNC  8                       /* RTO factor to truncate TW */