求解 springboot+mysql 随机出现的异常延迟

108 天前
 Plumes
两行紧挨着的代码,很简单的根据 id 更新一行数据,然后打印函数执行到此时的耗时




打印出来的日志如下




正常情况下两个打印出来的耗时差值应该是 10ms 以内
但是每天会随机出现几个时间点,两个耗时差值会大于 1s 甚至 10 ~ 20s
日志中可以看到并不是语句执行出现耗时,mybatis 已经把执行结果打印出来了
耗时出现在语句执行之后,但是出现结果之后应该就立即到打印日志了,这之间没有其他代码了,没明白这个延时是怎么产生的,求助
2186 次点击
所在节点    Java
21 条回复
me1onsoda
108 天前
你这样算时间是极不靠谱的,编译器会对指令重排序
Plumes
108 天前
@me1onsoda 不只是看日志打印的时间数据,最近看每天的 16:10 分大概率会出现这个情况,这个时候去测试请求接口,也验证了确实会出现接口高延迟
31415926535x
108 天前
@Plumes 测试环境可重试的话,尝试用 arthas 抓一下看看是哪个方法的问题
v2hh
108 天前
是不是那个时间点数据库连接池占满了
Plumes
108 天前
@v2hh 但是语句不是已经执行完了吗,这个时候连接池满也会有影响吗?
hubqin
108 天前
会不会集群或网络里面有两个 mysql 实例,形成了负载均衡,其中一个是性能较差的
Plumes
108 天前
@hubqin 内部系统,所以是内网部署的单实例数据库
JYii
108 天前
代码硬看不出问题的话,看一下时段的主机、服务、数据库的情况
sagaxu
108 天前
把 GC 日志也开了,full gc 也会引起类似情况。既然是每天的 16:10 分左右,那要排查下四点之后有没有计划任务,不局限于这个进程。
trzzzz
108 天前
如果 op 用的 druid ,可能耗时在 druid 的获取连接和归还连接那边。jstack 配合 arthas 抓一下吧
mark2025
108 天前
备份进程导致高 io ?
falsemask
108 天前
1.数据库用了连接池吗?
2.更新会有行锁吗?
babyrjw
108 天前
应该是有其他大事务把 id=220269386 这条记录锁住了。
锁住的可能有几种,update 的条件命中 id=220269386 或者 lock_status = 4 或者 lock_etime=1726041977 都会锁住这条记录,可以看一下慢查询日志
Plumes
108 天前
@babyrjw 日志里已经出现 updates: 1 ,按照我的理解这应该已经完成提交了吧,查了数据库的 binlog ,也看到已经很快 commit 了
babyrjw
108 天前
@Plumes 是的,那考虑下是不是 10 楼说的归还连接 以及 fullgc 影响
siweipancc
107 天前
给你个极端的原因,定期 roll 日志文件的时候 io 塞住了
cheng6563
107 天前
随机卡,还一卡卡那么久,考虑是随机数生成器问题了.
-Djava.security.egd=file:/dev/urandom
Plumes
107 天前
@siweipancc 附言里有今天的机器磁盘监控,看上去 16 点左右没什么异常
Plumes
107 天前
@falsemask 用的 hikaricp ,看上去连接数没有问题,截图里的数据库操作没有行锁
nealHuang
102 天前
mark 跟踪一下,有思路麻烦各个吴彦祖踢我一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1072735

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX