微服务架构 | 如何利用好日志链路追踪做性能分析?

链式潮汐
• 阅读 1068
导读:做性能分析听到最多的歪理就是,服务做水平、垂直扩容、分表分库、读写分离、XX中间件、资源静态化等等但是归根到底这些方案都是为了尽可能减少对数据库的访问以及堆栈的释放,提高数据库IO的读写速度和程序的运行效率。

系统都是逐渐演进的,一个系统在运行中必须是根据场景逐渐地提高优化性能。高并发就是对资源的节约的考验,这种考验除了更换优秀和先进的技术,优化架构,还在于从小处出发,对尽可能节约的资源进行节约。

而在一个系统的数据访问中,系统的瓶颈往往是来自于数据库,因此我们要尽可能减少对数据库的访问!

一、背景

最近一段时间粉丝可能留意到,技术号一直没有更新多少技术文章。因为近期都在做一直在做性能优化。

在业务模块在并发量起来以后,接口的性能瓶颈就愈发变得明显。
微服务架构 | 如何利用好日志链路追踪做性能分析?
配置解析和函数路由服务接口性能堆栈分析
微服务架构 | 如何利用好日志链路追踪做性能分析?
本篇主要针对配置布局资源文件过大,导致接口耗时过长问题分析解决。

二、日志链路追踪

排查性能如果从代码层面出发少不了堆栈分析,但是目前大部分服务都为了便于服务扩容、升级都做了微服务处理,日志分析排查免不了通过链路ID追踪日志《微服务分布式架构中,如何实现日志链路跟踪?
微服务架构 | 如何利用好日志链路追踪做性能分析?

▐ 链路追踪日志改造 - RPC接口

在《链路日志追踪》中提到通过restTemplate、Openfeign的形式访问其他服务的接口时,就会携带起始位置生成的traceId、spanId到下一个服务单元。但是没有详细实现,这里做下简单补充便于后面理解与使用。
微服务架构 | 如何利用好日志链路追踪做性能分析?
阅读Spring-Web源码,对于远程接口的调用拦截可以实ClientHttpRequestInterceptor
微服务架构 | 如何利用好日志链路追踪做性能分析?
拦截客户端 HTTP 请求。这个接口的实现可以注册到RestTemplate ,以修改传出的ClientHttpRequest和/或传入的ClientHttpResponse 。拦截器的主要入口点是intercept(HttpRequest, byte[], ClientHttpRequestExecution) 。
微服务架构 | 如何利用好日志链路追踪做性能分析?
计算RPC接口耗时与日志记录,这样在做接口分析的时候可以针对性能较差、耗时高的接口有针对性性排查分析。
微服务架构 | 如何利用好日志链路追踪做性能分析?
远程服务的接口性能暂时不做分析,目前很明确耗时:1528ms 应该存在很大的性能问题。
微服务架构 | 如何利用好日志链路追踪做性能分析?

▐ 链路追踪日志改造- 传播线程变量

但是目前只统计出远程接口耗时是远远不够的,我们需要知道接口总耗时以及对堆栈分析才能精准定位到问题。
微服务架构 | 如何利用好日志链路追踪做性能分析?
微服务架构 | 如何利用好日志链路追踪做性能分析?
记录HTTP监控信息
微服务架构 | 如何利用好日志链路追踪做性能分析?

这里需要补充下不是所有的接口我们都需要捕捉和统计分析,我们可以统一接口规范。如页面请求统一以/data/开头,RPC接口统一以/api/开头这样可以分别区分两则的统计信息,避免记录错乱。
微服务架构 | 如何利用好日志链路追踪做性能分析?

▐ 链路追踪日志改造- 统计RPC调用次数

微服务架构 | 如何利用好日志链路追踪做性能分析?
上面👆🏻的两处的处理目前也只能精确度到当前HTTP请求有哪些PRC接口请求?每个PRC接口请求耗时多少?作为核心服务不太会去关系业务服务的接口细节,如果需要针对PRC接口的主服务做进步性能分析即可。

因此还需要进步统计出所有RPC接口的总耗时和次总次数。
微服务架构 | 如何利用好日志链路追踪做性能分析?

通过“线程变量”传递RPC接口的请求的次数。记得先前有类似出路过服务之间的认证问题也是通过请求头传递。《Spring Cloud中如何保证各个微服务之间调用的安全性?
微服务架构 | 如何利用好日志链路追踪做性能分析?

累计完请求数量继续传递下去,以此类推来统计RPC接口的请求总数

这里做了简单阈值限制,背景不难想到:如果一个接口频繁调用另外一个服务超过20、30次此时,我们就应该考虑服务之间数据同步或者映射问题。

所以在计算RPC接口的请求总次数加了阈值限制,若RPC调用次数超出范围则输出警告日志

▐ 链路追踪日志改造 - 链路日志统计展示

至于链路追踪日志的展示,自己使用就不用太关注图形化样式问题,这里建议直接使用Thymeleaf模板引擎进行渲染展示,也就有了文章开头的图片
微服务架构 | 如何利用好日志链路追踪做性能分析?

三、总结

对于问题分析我们首先能遇到的总是一个较大的问题,在算法中我们常会用分治算法。一言以蔽之:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破。

回顾整个处理思路

  • 微服务日志埋点处理,记录链路日志并统计
  • 监听HTTP请求后,记录微服务服务之间RPC接口耗时
  • 监听HTTP请求后,记录RPC接口深度(请求次数)

记录RPC请求总总耗时与总占比

至此算是完成了我们做链路日志分析的第一步:统计分析HTTP请求所触发的外部服务的性能消耗。

码农架构:专注于系统架构、高可用、高性能、高并发类技术分享

原文地址:微服务架构 | 如何利用好日志做性能分析?

微服务架构 | 如何利用好日志链路追踪做性能分析?

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
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
4年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
SpringBoot 项目优雅实现读写分离 | 京东云技术团队
一、读写分离介绍当使用SpringBoot开发数据库应用时,读写分离是一种常见的优化策略。读写分离将读操作和写操作分别分配给不同的数据库实例,以提高系统的吞吐量和性能。读写分离实现主要是通过动态数据源功能实现的,动态数据源是一种通过在运行时动态切换数据库连
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
分库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践
1问题域业务发展的初期,我们的数据库架构往往是单库单表,外加读写分离来快速的支撑业务,随着用户量和订单量的增加,数据库的计算和存储往往会成为我们系统的瓶颈,业界的实践多数采用分而治之的思想:分库分表,通过分库分表应对存系统读写性能瓶颈和存储瓶颈;分库分表帮
京东云开发者 京东云开发者
10个月前
分库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践
作者:京东物流王军1问题域业务发展的初期,我们的数据库架构往往是单库单表,外加读写分离来快速的支撑业务,随着用户量和订单量的增加,数据库的计算和存储往往会成为我们系统的瓶颈,业界的实践多数采用分而治之的思想:分库分表,通过分库分表应对存系统读写性能瓶颈和存