From: Yuchung Cheng Date: Thu, 1 Dec 2016 18:21:40 +0000 (-0500) Subject: ss: print new tcp_info fields: busy, rwnd-limited, sndbuf-limited times X-Git-Tag: v4.10.0~116 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6c7fc61faab047e1ab12d580702358ddc5a1529;p=thirdparty%2Fiproute2.git ss: print new tcp_info fields: busy, rwnd-limited, sndbuf-limited times Dump some new fields added to tcp_info in v4.10: tcpi_busy_time, tcpi_rwnd_limited, tcpi_sndbuf_limited. Example output for a flow busy for 110ms but never measurably limited by receive window or send buffer: busy:110ms Example output for a flow usually limited by receive window: busy:111ms rwnd_limited:101ms(91.0%) Example output for a flow sometimes limited by send buffer: busy:50ms sndbuf_limited:10ms(20.0%) Signed-off-by: Yuchung Cheng Signed-off-by: Neal Cardwell Signed-off-by: Eric Dumazet Signed-off-by: Soheil Hassas Yeganeh --- diff --git a/misc/ss.c b/misc/ss.c index 7f039859f..839781ee2 100644 --- a/misc/ss.c +++ b/misc/ss.c @@ -817,6 +817,9 @@ struct tcpstat { double rcv_rtt; double min_rtt; int rcv_space; + unsigned long long busy_time; + unsigned long long rwnd_limited; + unsigned long long sndbuf_limited; bool has_ts_opt; bool has_sack_opt; bool has_ecn_opt; @@ -1980,6 +1983,18 @@ static void tcp_stats_print(struct tcpstat *s) if (s->app_limited) printf(" app_limited"); + if (s->busy_time) { + printf(" busy:%llums", s->busy_time / 1000); + if (s->rwnd_limited) + printf(" rwnd_limited:%llums(%.1f%%)", + s->rwnd_limited / 1000, + 100.0 * s->rwnd_limited / s->busy_time); + if (s->sndbuf_limited) + printf(" sndbuf_limited:%llums(%.1f%%)", + s->sndbuf_limited / 1000, + 100.0 * s->sndbuf_limited / s->busy_time); + } + if (s->unacked) printf(" unacked:%u", s->unacked); if (s->retrans || s->retrans_total) @@ -2283,6 +2298,9 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r, s.min_rtt = (double) info->tcpi_min_rtt / 1000; s.delivery_rate = info->tcpi_delivery_rate * 8.; s.app_limited = info->tcpi_delivery_rate_app_limited; + s.busy_time = info->tcpi_busy_time; + s.rwnd_limited = info->tcpi_rwnd_limited; + s.sndbuf_limited = info->tcpi_sndbuf_limited; tcp_stats_print(&s); free(s.dctcp); free(s.bbr_info);