应用响应时延背后 深藏的网络时延

DeepFlow开源
• 阅读 272

应用异常时,基本可以分为服务访问不通服务响应慢两个大类。其中服务响应慢的问题定位非常棘手,很多无头案。应用团队有日志和追踪,对于自认为的不可能不合理的事情都会甩给基础设施团队,又由于基础设施团队现有的监控数据缺乏应用的观测视角,通常成为一切「不是我的问题」超自然现象的终极背锅侠,其中以网络团队尤为严重。

01

响应时延

服务为什么响应慢???首先,我们需要一种方式来度量何为响应慢,参考 Google 在 SRE Handbook 中提到过4 个黄金信号及 Weave Cloud 提出来的 RED 方法,都存在度量的指标(Latency/Duration),后文统称为响应时延

  • Latency 表达的是服务处理某个请求所需要的时间,站在的是服务端视角
  • Duration 表达的是每个请求所花费的时间,站在的是客户端视角

总结下来,不论站在什么视角,响应时延表达的都是处理一个请求所花费的时间,可以用来表征服务响应慢的度量指标,但若要定位为什么响应慢还需要进一步剖解响应时延:

  • 系统时延:系统转发请求/响应的时延消耗
  • 网络时延:包含查询 DNS 时延及网络处理的时延
  • 应用时延:从不同视角来看,包含客户端应用处理时延 + 服务端应用处理时延
应用响应时延背后 深藏的网络时延

确定度量指标后,接下就可以分析服务响应慢的原因,此时可以利用分布式链路追踪能力来快速来定界瓶颈点,例如可利用 DeepFlow 的分布式追踪能力来快速定界瓶颈点在应用、系统还是网络。

应用响应时延背后 深藏的网络时延分布式链路追踪-火焰图

完成瓶颈点定界后,则需要去查找根因。对于应用或者系统的问题,可以利用性能剖析(profile)继续追查根因,而对应网络时延的分析,其中 DNS 时延分析是相对简单的,只需要关注请求的响应时延即可,但网络处理时延瓶颈的定位却缺少了分析的工具,接下来将主要聚焦讨论网络传输时延如何分析。

应用响应时延背后 深藏的网络时延性能剖析-火焰图

02

网络时延

参考 AWS 中的定义网络时延是指网络通信中的延时,网络时延显示了数据通过网络传输所需的时间。讨论网络时延如何,也是需要可度量的指标,AWS 也指定了使用“首字节时间”和“往返时间”等指标来衡量网络时延,这两个指标是可以适用于所有网络协议的传输时延的度量,但实际应用 80% 都使用的 TCP 协议,对于 TCP 协议是需要更细粒度的度量指标,下文通过图文的形式,详细的介绍目前可用的度量指标及用法。

TCP 协议是面向连接的传输层通信协议,对其详细的通信过程分析,时延可分为三大类:

1)建连时产生的时延

  • [1] 完整的建连时延包含客户端发出 SYN 包到收到服务端回复的 SYN+ACK 包,并再次回复 ACK 包的整个时间。建连时延拆解开又可分为客户端建连时延服务端建连时延
  • [2] 客户端建连时延为客户端收到 SYN+ACK 包后,回复 ACK 包的时间
  • [3] 服务端建连时延为服务端收到 SYN 包后,回复 SYN+ACK 包的时间

2)数据通信时产生的时延,可拆解为客户端等待时延+数据传输时延

  • [1] 客户端等待时延为建连成功后,客户端首次发送请求的时间;为收到服务端的数据包后,客户端再发起数据包的时间
  • [2] 数据传输时延为客户端发送数据包到收到服务端回复数据包的时间
  • [3] 在数据传输时延中还会产生系统协议栈的处理时延,称为系统时延

3)断连时产生的时延:因为断连的时延并不影响到应用的响应时延,因此并不会单独统计此部分使用

应用响应时延背后 深藏的网络时延TCP 网络时延解剖

度量的网络时延的指标已经拆解好了,接下来讨论在哪里采集指标,网络的报文将在客户端,各种虚拟和物理网络与服务端之间穿梭,因此可报文穿梭的位置点来采集,后续统称为统计位置。当然统计位置越多,定位网络的瓶颈路径越快,但是统计位置多则随之带来的计算量也是成倍增加,企业在有成本压力时,建议在重要节点进行采集即可,比如 K8s Pod 虚拟网卡、K8s Node 网卡、云服务器网卡、网关(如 LVS/Nginx 等)网卡、硬件防火墙/负载均衡器前后......

应用响应时延背后 深藏的网络时延统计位置

分析到这,基本已经清晰网络时延的详细的度量指标了,回过头结合响应时延再讨论下如何查看网络时延对其的影响,基本可以分两种情况讨论:

a)应用发起请求为短连接:此时分析网络时延需要查看 DNS 时延 + 建连时延 + 客户端等待时延 + 数据传输时延 + 系统时延,则可快速定位时延发生的具体原因了。

  • DNS 时延高,结合统计位置,则可回答是网络传输时延高还是DNS 服务响应慢
  • 建连时延高,结合客户端建连时延 + 服务端建连时延 + 统计位置,则可回答是网络传输时延高还是客户端系统回复慢还是服务端处理建连响应慢
  • 客户端等待时延高,结合统计位置,则可回答是网络传输时延高还是客户端请求发送延迟
  • 数据传输时延高,结合统计位置,则可回答是网络传输时延高还是服务端响应慢
  • 系统时延高,结合统计位置,则可回答网络传输时延高还是服务端协议栈处理慢

b )应用发起请求为长连接:因为长连接是保持长期活动的 HTTP 连接,不需要考虑 DNS 查询与建连的时延消耗,只需要关注客户端等待时延 + 数据传输时延 + 系统时延即可

03

案例分析

限于笔者时间限制又想早点将应用响应时延背后深藏的网络时延剖解分享给大家,本文不继续补充实际案例,将在一周后分享在某xx智能终端公司的如何结合 DeepFlow 在服务响应慢时,网络团队在存在可观测性的时延数据时,如何硬气回怼。

04

什么是 DeepFlow

DeepFlow[1] 是一款开源的高度自动化的可观测性平台,是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术,创新的实现了 AutoTracing、AutoMetrics、AutoTagging、SmartEncoding 等核心机制,帮助开发者提升埋点插码的自动化水平,降低可观测性平台的运维复杂度。利用 DeepFlow 的可编程能力和开放接口,开发者可以快速将其融入到自己的可观测性技术栈中。

GitHub 地址:https://github.com/deepflowys/deepflow

访问 DeepFlow Demo[2],体验高度自动化的可观测性新时代。

05

参考文档

  • https://aws.amazon.com/cn/what-is/latency/
  • https://baike.baidu.com/item/%E7%B3%BB%E7%BB%9F%E5%93%8D%E5%BA%94%E6%97%B6%E9%97%B4/22026261
  • https://dev.to/aws/why-are-services-slow-sometimes-mn3
  • https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/promql/prometheus-promql-best-praticase
  • https://www.weave.works/blog/the-red-method-key-metrics-for-microservices-architecture/
  • https://aws.amazon.com/what-is/latency/

参考资料

[1]

DeepFlow: https://github.com/deepflowys/deepflow

[2]

DeepFlow Demo: https://deepflow.yunshan.net/docs/zh/install/overview/

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
DeepFlow开源
DeepFlow开源
Lv1
技术创造价值
文章
3
粉丝
3
获赞
3