Opened 9 years ago
Last modified 9 years ago
#1036 new enhancement
Add tcpi_total_retrans to tcp_info variables
| Reported by: | craigt | Owned by: | |
|---|---|---|---|
| Priority: | minor | Milestone: | |
| Component: | other | Version: | 1.11.x |
| Keywords: | Cc: | ||
| uname -a: | |||
| nginx -V: | nginx version: nginx/1.11.0 | ||
Description
I would like to be able to assess the impact of changes to transport protocol parameters more easily. Per session retransmission counters are really valuable for this measurement, where the global counters are too coarse.
Please add at least 'tcpi_total_retrans' to the existing list of tcp_info variables. Ideally the complete list would be made available, or a way to use the full set exposed by the kernel without further code changes.
I can think of use cases for several of the other data points also. Super-set here:
https://github.com/torvalds/linux/blob/master/include/uapi/linux/tcp.h
Thanks...
Note:
See TracTickets
for help on using tickets.

You can try following unofficial patch:
# HG changeset patch # User Alexey Ivanov <SaveTheRbtz@GMail.com> # Date 1482209934 28800 # Mon Dec 19 20:58:54 2016 -0800 # Branch tcpi_total_retrans # Node ID e3ed384526b87ebba7e8e95ceb586499804bf163 # Parent 01adb18a5d23910c518062d7e6f30fdf7653e310 HTTP: the $tcpinfo_total_retrans variable. This metric is one of the most important KPIs for measuring network performance. For example it can be used to find regressions on peering/transit links, issues in the backbone network, and effects of the network-stack optimizations. It can also be grouped by ASN or GeoIP data to find issues that are affecting a specific ISP/Country. diff --git a/auto/unix b/auto/unix --- a/auto/unix +++ b/auto/unix @@ -476,6 +476,28 @@ . auto/feature +ngx_feature="tcpi_total_retrans" +ngx_feature_name="NGX_HAVE_TCP_INFO_TOTAL_RETRANS" +ngx_feature_run=no +ngx_feature_incs="#include <netinet/tcp.h>" +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct tcp_info ti; + ti.tcpi_total_retrans" +. auto/feature + + +ngx_feature="tcpi_snd_rexmitpack" +ngx_feature_name="NGX_HAVE_TCP_INFO_SND_REXMITPACK" +ngx_feature_run=no +ngx_feature_incs="#include <netinet/tcp.h>" +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct tcp_info ti; + ti.tcpi_snd_rexmitpack" +. auto/feature + + ngx_feature="accept4()" ngx_feature_name="NGX_HAVE_ACCEPT4" ngx_feature_run=no diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c --- a/src/http/ngx_http_variables.c +++ b/src/http/ngx_http_variables.c @@ -354,6 +354,11 @@ { ngx_string("tcpinfo_rcv_space"), NULL, ngx_http_variable_tcpinfo, 3, NGX_HTTP_VAR_NOCACHEABLE, 0 }, + +#if (NGX_HAVE_TCP_INFO_TOTAL_RETRANS) || (NGX_HAVE_TCP_INFO_SND_REXMITPACK) + { ngx_string("tcpinfo_total_retrans"), NULL, ngx_http_variable_tcpinfo, + 4, NGX_HTTP_VAR_NOCACHEABLE, 0 }, +#endif #endif { ngx_null_string, NULL, NULL, 0, 0, 0 } @@ -1036,6 +1041,12 @@ socklen_t len; uint32_t value; + /* + * TODO: cache whole tcp_info for the request to prevent multiple + * getsockopt(2) calls when multiple $tcpinfo_* variables are requested + * for the same request + */ + /* TODO: add $upstream_tcpinfo_* counterpart */ len = sizeof(struct tcp_info); if (getsockopt(r->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) { v->not_found = 1; @@ -1064,6 +1075,16 @@ value = ti.tcpi_rcv_space; break; +#if (NGX_HAVE_TCP_INFO_TOTAL_RETRANS) || (NGX_HAVE_TCP_INFO_SND_REXMITPACK) + case 4: +#if (NGX_HAVE_TCP_INFO_TOTAL_RETRANS) + value = ti.tcpi_total_retrans; +#elif (NGX_HAVE_TCP_INFO_SND_REXMITPACK) + value = ti.tcpi_snd_rexmitpack; +#endif + break; +#endif + /* suppress warning */ default: value = 0;