我需要监控我的 kubernetes 集群的网络,我正在使用用 Go 编写的 netlink 包来做到这一点。 https://github.com/vishvananda/netlink
我能够解析此处提到的 tcpInfo 类型中的所有字段https://github.com/vishvananda/netlink/blob/9ada19101fc5585d550e5cc0b43c28873214820a/tcp.go#L20并将其发送到时间刻度数据库并在 Grafana 中解析。
然而,对我来说一个主要要求是将指标显示为百分比。也许结合 tcpInfo 结构中提到的一些字段。这些是我的要求。
这是我的节点中 ss -it 的示例输出
vjain@hk-osfebn-1298 ~]$ ss -it
..
..
ESTAB 0 0 10.118.228.4:52388 10.118.223.244:amqp
cubic wscale:7,9 rto:201 rtt:0.132/0.012 ato:40 mss:1448 rcvmss:536 advmss:1448 cwnd:10 ssthresh:9 bytes_acked:1063335432 bytes_received:14283091 segs_out:7802018 segs_in:6550978 send 877.6Mbps lastsnd:33778 lastrcv:28454 lastack:28454 pacing_rate 1748.5Mbps retrans:0/28 rcv_rtt:88378.6 rcv_space:35246
..
..
我似乎无法理解 retrans 或 rtt 的输出。 在retrans:0/28中,0是重传次数,28是发送的数据包总数?但我在 grafana 仪表板中使用 ss 输出中给出的端点看不到任何值为 28 的指标。此外,似乎没有与丢失数据包相关的输出,但 netlink 包从
lost_out
https://elixir.bootlin.com/linux/latest/source/include/linux/tcp.h中的
include/linux/tcp.h
派生它
我不是 TCP 或 Linux 内核方面的专家。但是通过浏览 iproute2 源代码,第一个值指向 s->retrans,秒值指向 s->total_retrans。
s->retrans 是从 /proc/net/tcp 中提取的,其中有一个
retrnsmt
列,可能代表 未恢复的 RTO 超时数。
s->total_retrans 来自内核网络指标
info->tcpi_total_retrans
,这可能意味着重传的总数。
所以我猜值 0/28 可能意味着 0 个数据包未从 RTO 超时中恢复,并且由于 RTO 重传而发送了 28 个数据包?