首页 > 其他分享 >一次服务启动慢问题排查

一次服务启动慢问题排查

时间:2023-07-25 12:55:38浏览次数:38  
标签:jooq 服务 NAME AUTHOR 启动 analyzer 排查 BOOK

随着时间推移,参与开发的人员越来越多,项目代码也会越来越复杂,需要我们有意识的定期对代码进行优化,有问题及时解决,避免技术债务越积越多。
这不本人就遇到一个服务启动慢的问题,印象中服务启动是比较快的,一般也就20几秒,但这次开发一个需求发现服务启动要接近1分钟,这对本地开发调试,测试同学测试都是非常不方便的,影响工作效率。

启动服务后观察日志,发现在最后一行这里卡了好久,但没有更有帮助的日志信息打印正在做什么。从图看起来像是xxl job的问题,但这是很早就引入了的,以前启动并不会慢,通过打断点也可以看出xxl job的初始化并没有阻塞。

image

一般服务启动慢原因主要有:
1.程序太大了,加载的bean非常多,默认情况下spring没有使用异步加载,如果bean太多可能导致启动慢。
2.在启动时做一些业务初始化,如使用@PostConstruct,在方法内进行接口调用,数据库查询等IO操作,可能导致服务启动慢。
3.在启动时做一些框架初始化,如使用数据库orm框架,通常需要加载数据库元信息,如果数据库表过多,加载时间长,可能导致服务启动慢。

那要怎么排查这个问题呢?
恰好在github上看到一个工具就可以发现问题所在,spring-startup-analyzer,可以分析spring应用启动过程。

spring-startup-analyzer

使用步骤非常简单:
1.下载最新的包,放到用户目录下,注意最好放到用户目录下,否则可能会有问题。
2.添加启动命令

-Dspring-startup-analyzer.app.health.check.endpoints=http://localhost:8020/actuator/health -javaagent:C:/Users/huangyb1/spring-startup-analyzer/lib/spring-profiler-agent.jar

-Dspring-startup-analyzer.app.health.check.endpoints 是健康检查的url,当这个接口返回200就表示服务启动完成了。
-javaagent 配置为上面下载的包路径
3.启动观察有如下日志表示正常,8065断开可以查看分析报告,可以通过-Dspring-startup-analyzer.admin.http.server.port参数配置。

image

服务启动后分析结果如下:

image

可以看到dslContext花费了23秒多,占用了接近一半的时间了。那这个是不是就是在上面xxl job日志后卡住的原因呢?我们看如下的详细过程,发现确实如此。

image

解决问题:
从图可以看出问题就是dlsContext这个加载慢导致,并且它是一个org.jooq.impl.DefaultDSLContext,由org.jooq.impl.DefaultConfiguration导入。
jooq是什么?jOOQ 从您的数据库生成 Java 代码,并允许您通过其流畅的 API 构建类型安全的 SQL 查询。
它可以实现将java代码翻译成sql语句,如:

create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
      .from(AUTHOR)
      .join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
      .where(BOOK.LANGUAGE.eq("DE"))
      .and(BOOK.PUBLISHED.gt(date("2008-01-01")))
      .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
      .having(count().gt(5))
      .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
      .limit(2)
      .offset(1)

将被翻译成

SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
FROM AUTHOR
JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
WHERE BOOK.LANGUAGE = 'DE'
AND BOOK.PUBLISHED > DATE '2008-01-01'
GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
HAVING COUNT(*) > 5
ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
LIMIT 2
OFFSET 1

说实话,本人不太喜欢这种书写方式,这种方式看起来并不直观,还没法直接拿这条sql语句出来执行,这种方式比较适合一些sql语句很简单的场景。
我们的项目使用的是mybatis plus,也没有用到jooq,那它是怎么来的呢?通过maven dependency analyzer可以看出,它是由sharding-jdbc带入的,前段时间刚好有同学对sharding-jdbc做升级,根据经验这就是问题所在了。

image

上github也可以看到我们使用这个版本的sharding的jooq确实会导致服务启动慢,参见issues,官方下一个小版本就修复这个问题。

解决方式也很简单,升级一些sharding-jdbc即可,通过上面的分析知道也可以排除jooq依赖,@SpringBootApplication(exclude = {JooqAutoConfiguration.class})。
解决后重启服务观察到,jooq的初始化没有了,服务启动快了20多秒。

image

欢迎关注我的github:https://github.com/jmilktea/jtea

标签:jooq,服务,NAME,AUTHOR,启动,analyzer,排查,BOOK
From: https://www.cnblogs.com/jtea/p/17579628.html

相关文章

  • RTSP/Onvif视频服务器LntonNVR(源码版)平台鉴权功能的应用场景和意义
    LntonNVR平台是基于RTSP/Onvif协议的视频接入、处理及分发平台,可以分发出RTSP、RTMP、WS-FLV、HTTP-FLV、HLS、WebRTC等格式的视频流,还可以提供API接口,便于用户调用集成。用户也能够直接将流地址放到第三方播放器进行播放。感兴趣的朋友也可以去CSDN(https://blog.csdn.net/LNTON)......
  • 工具 | Pycharm中调试服务器代码并且运行
    首先在pycharm中创建一个python的空项目project,删除main.py。1.配置远程服务器信息打开pycharm,选择Tools—>Deployment—>Configuration,点右上角的“+”添加服务器信息,服务器类型选择SFTP,name自己习惯起一个就行,然后点OK。接着配置一下连接信息,输入服务器的ip地址、用户......
  • 2023-06 服务器行业产品趋势
    06-07赛迪顾问《2022-2023年中国服务器市场研究年度报告》发布,数据显示,宝德品牌在中国ARM架构服务器市场销售规模排名第一位 06-22英特尔(Intel)官方宣布,美国能源部阿拉贡国家实验室已经完成基于英特尔CPU及GPU的新一代超算“Aurora”的安装工作,今年晚些时候上线后将提供超过2e......
  • 2023-07 服务器行业产品趋势
    07-13国家网信办联合国家发展改革委、教育部、科技部、工业和信息化部、公安部、广电总局公布《生成式人工智能服务管理暂行办法》(以下称《办法》),自2023年8月15日起施行。其中提到:鼓励生成式人工智能算法、框架、芯片及配套软件平台等基础技术的自主创新;鼓励采用安全可信的芯片、......
  • 2023-04 服务器行业产品趋势
    产品趋势概述:1.多样性算力、液冷技术2.国产AI大模型演进3.龙芯3D5000服务器CPU4.华为MetaERP5.以国资央企为代表的行业信创迎重大进展 看政策:生成式AI规范化 具体如下:国际研究机构Gartner®发布全球服务器市场指南《MarketGuideforServers》(以下简称《市场指南》)......
  • RTMP流媒体服务器LntonMedia(免费)平台利用srs通过webrtc推流到LntonMedia平台的具体操
    WebRTC属于开源的即时通信技术,它实现了基于网页的语音对话或及视频通话,目的是无插件实现web端的实时通信能力,其中包含视频音频采集、编解码、数据传输、音视频展示等功能。LntonMedia也是基于WebRTC技术的互联网视频云服务平台,具有视频直播、点播、视频拉转推、时移、视频回看等功......
  • 微服务下使用maven做多环境配置
    分享技术,用心生活前言:很多项目在开发,提测,上线时都会提前手动改一些配置文件来适应对应环境,麻烦不说了,而且也容易出错;生产环境的配置也容易暴露。基于此,我们基于springcloudalibaba架构下通过使用maven的profile来实现多环境切换的功能。1maven的profile介绍详细可查阅官......
  • 4 STM32MP1 Linux系统启动过程
    1.ROM代码  这是ST官方写的代码,在STM32MP1出厂时就已经烧录进去,不能被修改。ROM代码是上电以后首先执行的程序,它的主要工作就是读取STM32MP1的BOOT引脚电平,然后根据电平来判断当前启动设备,最后从选定的启动设备里面读取FSBL代码,将FSBL代码放在对应的RAM空间。  STM32MP1启......
  • 1分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>
    微服务技术栈一、微服务介绍了解1架构结构案例与springboot兼容关系拆分案例拆分服务拆分-服务远程调用2eureka注册中心Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现3Ribbon组件负载均衡Ribbon-负载均衡原理Ribbon-负载......
  • 【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High A
    如何保证服务的高可用性HA(HighAvailability)?高可用HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论上,高可用是通过冗余+自动故障转移来实现的。我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的......