TCP监控面临的挑战
大量实际业务属于请求-响应的通信模式,比如数据库、Web应用等。对这些应用而言,端到端的连接数据是重要的监控指标。尤其对云上用户而言,其感知到的云应用的延迟是终端的延迟,也就是整个网络路径上的延迟。理想情况下,要求统计到路径上每个节点处理延迟以及网络上所有延迟的总和,以准确识别网络异常,定位网络问题。
然而,传统的TCP监控方法存在一定局限性,难以应对云场景大规模网络下,端到端TCP常态化监控的需要。
采集到的信息有限:传统TCP监控工具往往仅提供连接粒度的信息,故只能感知到连接整体状态,比如收发数据量、RTT、拥塞窗口等,难以获取请求粒度的监控信息;
引入较高的额外性能负载:抓包是另一种常用的网络监控方式,虽然该方式能够获取到相当多的信息,但是运行时引入较大开销,应用中更多作为调试手段,而不能满足常态化监控的要求;
对用户业务逻辑有侵入:有一类跟踪方式,入侵式地在业务代码中添加埋点,记录各个节点状态信息,通过汇总分析,获取各阶段耗时等信息。但是这种方式依赖业务逻辑适配,实用性不足。
现有的TCP监控工具主要有:
netstat:可显示各种网络信息,包括网络连接、路由表、接口统计信息、连接信息等。对TCP层,能够显示连接状态、收发队列数据,统计丢包数量与原因等。仅采集到连接粒度的信息。
ss:是一个用于查看网络套接字状态的工具,可以获取到多种TCP连接的信息。包括四元组、连接状态、窗口大小、重传信息等。与netstat类似,也仅针对连接粒度。
tcpdump:是一种数据包分析工具,能够抓取网络数据包,采集数据包的收发时间戳信息与数据包内容。该方式会引入较大的性能开销。
socket timestamp:能够在监控TCP socket的收发包时间戳,配合应用侧采集时间,能够获取到整个通信路径上的延迟。该方式需要用户修改业务逻辑适配。
基于eBPF的TCP全链路监控技术
为了克服了传统TCP监控方式的缺陷,龙蜥社区基于eBPF开发实现了一种低开销、可常态化的请求-响应模式的 TCP 时延监控工具tcprt,tcprt能够在TCP层,面向链路、TCP连接、应用进行实时监控,为故障诊断、性能优化提供分析依据。在Web服务、MySQL数据库服务等场景中具有应用价值。
tcprt基于eBPF的tracepoint和sockops机制实现,通过对TCP连接收发包状态的跟踪,监控应用的“请求”与“响应”处理状态,并采集相关的网络参数,包括请求在协议栈中接收的时间,及服务进程处理过程中的耗时等数据信息。最终以日志形式传递到用户空间。
图:tcprt信息采集示意图
上图展示了tcprt划分业务流量的各个阶段。客户端(Client)向服务端(Server)发送的第N个请求(request)表示为ReqN。该请求由ReqN-1和ReqN-2两个数据包组成。服务端收到第一个包的时间被记录为T0,第二个包的时间被记录为T1。服务端收到请求后进行处理,完成处理后会向客户端发送两个响应的数据包RspN-1和RspN-2,服务端发送第一个包的时间被记录为T2。客户端收到响应包后会发送确认信息ACK给服务器,服务端收到最后一个ACK的时间被记录为T3。
tcprt基于以上的时间点的记录,可以采集到以下信息:
(1)upload_time:用户请求上传所使用的时间;
(2)process_time:服务端的处理时间。服务端从收到最后一个请求的数据包开始,到服务端向客户端开始发送响应的数据包为止,这段时间为服务端的处理时间;
(3)download_time:数据下载时间。从服务端开始向客户端发送响应的数据包开始,到服务端收到客户端最后一个ACK为止,这段时间为数据下载时间。对于下载比较大的数据响应,该信息的获取较为重要。此外,tcprt还收集请求处理过程中的TCP连接RTT、乱序、数据量等信息。
tcprt通过命令行,提供开关功能,并提供配置文件以便用户配置过滤条件。配置文件位于/etc/tcprt-bpf/tcprt.yaml,允许配置过滤端口或端口范围。tcprt启动后,会将监控结果以debugfs的方式输出到/sys/kernel/debug/tcp-rt路径下的rt-network-log*为名称的文件中。文件名称的后缀为CPU内核的序号。
tcprt将一对请求-响应视作一个TASK,其提供的监控信息主要包括:
TASK开始时间,开始时间的秒部分;
TASK开始时间,开始时间的微秒部分;
TCP连接的对端IP地址;
TCP连接的对端端口;
TCP连接的本地IP地址;
TCP连接的本地端口;
TASK发送的数据量,单位:Byte;
TASK总耗时。即第一个请求segment到达与最后一个响应的segment被ack之间的时间间隔,单位:μs;
TASK最小的TCP RTT(Round Trip Time),单位:μs;
TASK重传发送的TCP报文段(TCP segment)数量;
TASK序号,TCP建立后的第一个TASK序号为1;
TASK服务延时,即最后一个请求的segment到达与第一个响应的segment发送之间的时间间隔,单位:μs;
TASK上送延时。即第一个请求segment到达与最后一个请求segment到达之间的时间间隔,单位:μs;
TASK接收的数据量,单位:Byte;
TASK过程是否发生接收乱序,参数值说明:1表示发生;0表示没有发生;
TASK过程中TCP使用的最大报文长度(MSS),单位:Byte。
tcprt 工具已开源到Anolis社区,支持在 Anolis OS内核版本5.10-17及以上版本的系统中安装使用,实现对TCP连接状态的精细化监控。
代码仓库地址:https://gitee.com/anolis/tcprt
白皮书:https://openanolis.cn/assets/static/eBPF_technical_practice_v2.pdf
售前咨询
售后服务
回到顶部