线上间歇性卡顿问题

news/2024/9/19 17:24:35/文章来源:https://www.cnblogs.com/leecoder5/p/18421007

事情起因

最近一段时间我们公司有个项目是做视力筛查的,平时都是正常的,但是最近这两天突然会时不时地卡顿一下,一卡就是几分钟。
 

排查过程

1.查看日志

卡顿首先是排查日志,日志报的是feign调用学生服务超时,进到学生服务查看时,看到日志报的是事务超时
 

2.继续排查,既然是事务超时,查看mysql锁

select * from performance_schema.data_lock_waits
另外还有个复杂的查询sql就不贴了,反正就是没有查到锁,可能也是查的时候已经锁释放了。
然后查看innodb日志
show engine innodb status
发现没有输出结果,搞半天不知道啥原因(后来发现是navicat的原因,结果没显示全)
 

3.查看代码

简单走读一下代码,发现主要卡顿的那个接口代码里用了@Transational注解,而且这个接口里包含了多个feign调用,这个显然不太合理。如果feign调用慢,会增加事务的提交时间。但是这是另外一个问题,因为被锁超时的是学生服务,不是调用它的视力服务。而学生服务里代码很简单,就是简单的查询。因此仍未查到根源,继续排查
 

4.查看磁盘io

后来还发现一个现象,就是偶尔超时的不只是那个接口,还有其他的表查询和接口,以及clickhouse的查询也有慢的(clickhouse是另外一个服务在调用的)。
由于曾经数字家医那个项目也曾出现过类似的现象,是由于更新和插入操作太多,造成间歇性卡顿,并且那边服务器的磁盘性能也不是很好(那边最后是通过减少大量的业务增改操作来解决的),所以这边我第一时间也是查看了磁盘io,我用fio测试工具测试的结果如下:
0
可以看到磁盘io最低的时候iops已经到了1,平均也才几十。
虽然看到磁盘io很差,但是由于当时考虑磁盘更换麻烦,而且并没有磁盘io差导致卡顿的先例,所以也是先记下了这个问题,继续从其他方面入手排查
 
这里附上测试的命令
fio -filename=test.log -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=4k -size=1G -numjobs=4 -runtime=10 -group_reporting -name=mytestfilename 读写的文件,会自动创建,不要用已存在的文件,它会往里写二进制数据,这个参数一定不能为空,不然坐等删库跑路吧
-rw=randrw 代表是随机读写
-numjobs=4 代表是开启4个线程一起操作
-runtime=10 是执行10秒,这个可以稍微大一点
 

5.分开部署clickhouse和mysql

上面的迹象让我感觉是不是clickhouse和mysql部署在一起导致互相竞争资源,并且当时这台服务器只有4G内存。于是向客户申请了一台单独的机器部署clickhouse,并升级了配置。部署完以后第二天发现还是会发生卡顿现象,于是继续排查
 

6.查看慢日志

既然看不了innodb日志,就看一下慢日志
慢日志里有很多的下面这种日志
# Time: 2024-04-24T16:43:54.679098+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id: 330916
# Query_time: 50.073778  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1713948184;
commit;
# Time: 2024-04-24T16:51:16.271288+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id: 330914
# Query_time: 180.347378  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1713948495;
commit;
# Time: 2024-04-24T16:51:16.271384+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id: 330916
# Query_time: 179.729376  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1713948496;
commit;
# Time: 2024-04-24T16:51:16.271453+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id: 330915
# Query_time: 174.483131  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1713948501;
commit;
# Time: 2024-04-24T16:51:16.271494+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id: 330845
# Query_time: 168.485559  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1713948507;
commit;
以及时间很长的查询(我删除了大部分内容):
# Time: 2024-04-25T15:18:07.672106+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id:   193
# Query_time: 152.159829  Lock_time: 0.000003 Rows_sent: 0  Rows_examined: 0
SET timestamp=1714029335;
INSERT INTO tb_exam_eyesight  ( id,creator,
operator,
is_deleted )  VALUES  ( 1374268092235520,624545294563164160,
624545294563164160,
0 );
# Time: 2024-04-25T15:18:07.672148+08:00
# User@Host: edu_health_app[edu_health_app] @  [172.16.5.183]  Id:   195
# Query_time: 179.016619  Lock_time: 0.000001 Rows_sent: 0  Rows_examined: 0
SET timestamp=1714029308;
INSERT INTO tb_exam_eyesight  ( id,creator,
operator,
is_deleted )  VALUES  ( 1374267870420736,500024611083403264,
500024611083403264,
0 );
可以看到这些sql的Query_time都很长,但是Lock_time却很少,说明并不是被其他sql锁住了,而是本身的执行时间长(这些sql很多都是插入语句,以及根据主键更新的,所以没有性能问题)。
还有#Time都是一样的,几乎在同一时间完成。那说明sql都在等待什么东西释放,考虑过后感觉很像redo log的刷脏页,就是所谓的mysql抖动。
 

7.更改mysql配置

innodb_io_capacity(控制刷脏页的速度,建议设置成磁盘的iops)从默认200改成了100,因为上面看到磁盘io性能差,如果这个值太高反而会降低刷脏页速度
sync_binlog和innodb_flush_log_at_trx_commit尝试调整成了0,减少磁盘io,加快速度
后面发现还是没什么用。(后来想想其实根本不可能是这种情况,因为我们业务量很少,一天也新增不了多少数据,一万条都不到)
 

8.装监控

无奈,先装上监控试试,原先客户环境配置太低,也装不了监控,现在客户把资源放开了,装上监控也是条不错的路子,于是装了grafana和skywalking,以及手动写的监控脚本(sar命令实现的)
持续观察发现磁盘io使用率动不动就飙升到100%,而且在卡顿的时候去看就是维持在100%,于是我觉得还是磁盘io有问题。
0
 

9.换磁盘

由于原先换服务器是在同一台服务器上的,因此做不到隔离磁盘,于是向客户申请换一个不在同一台物理机的磁盘,原本以为很麻烦,没想到客户有超融合服务器,直接切换一下就切换到新物理机上了,都不影响业务。
顺利切换以后观察了一下午,再没出现过卡顿问题。至此问题解决,问题也确诊为磁盘性能问题了。
 
总结
磁盘性能差导致服务性能的情况很少见,但从这次经历也收获了一些经验,如果磁盘性能有问题,从以下几个征兆就可以看出来了:
  • 磁盘io性能测试结果很差,iops基本在200以下,偶尔会到个位数,那肯定不正常了
  • 如果有多个服务,多个服务同时受影响,比如这次clickhouse和mysql同时报超时
  • mysql多个慢查询同时完成(慢日志里可以看到)
 
最后我又去测了一下磁盘差的那台服务器和正常的服务器,看最上面的r和w就行,差的时候已经到个位数了,有时候甚至是0。对比图如下:
io有问题的服务器:
0
 
io正常的服务器:
0
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于springcloud中openfeign中服务调用日志输出

在使用openfeign进行服务调用的时候,我们可以通过一些配置,获取到服务调用的日志输出,可以从消费端看到日志 有两种方法:一、使用配置类;二、使用配置文件配置 日志输出级别有四种: NONE:不输出(默认) BASIC:只输出请求方式、url、请求成功与否 HEADERS:输出请求头的…

《现代操作系统》第10章——实例研究1:UNIX、Linux和Android

《现代操作系统》第 10 章——实例研究 1:UNIX、Linux 和 Android 10.1 UNIX 与 Linux 的历史 第一次使 UNIX 的两种流派一致的严肃尝试来源于 IEEE(它是一个得到高度尊重的中立组织)标准委员会的赞助。有上百名来自业界、学界以及政府的人员参加了此项工作。他们共同决定将…

linux使用yum命令报错Cannot find a valid baseurl for repo: base/7/x86_64

【问题】 在VMware上安装搭建centOS 7虚拟机,配置好网络后,尝试通过yum命令进行安装docker容器。执行命令报错: 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile  Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea…

研发工程师的「第一性原理」思维

回顾复盘五年来的研发经历,愈发认同身边同事强调的“第一性原理”思维,仅做浅浅记录和分享一、定义与理论介绍第一性原理(First Principles),又称基本原理,是指从最基本的假设和定义出发,通过逻辑推理和演绎得出结论的一种思维方法。它强调对事物的本质和根源进行深入的…

Meta Llama3 论文研读

一、 引言概述(Intro & Overview) Llama3是一系列基于Transformer结构的大型多语言模型,通过优化数据质量、训练规模和模型架构,旨在提升模型在各种语言理解任务中的表现。通过引入更优质的数据和更高效的训练方法,Llama3展示了在自然语言处理领域的巨大潜力。其创新点…

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

本次研讨会经纬恒润将结合业务团队多年来在SOA架构开发和工具实施领域的项目实践经验,分享探讨SOA趋势下先进的整车EE架构开发模式,聚焦在SOA开发难点分析、开发阶段划分、开发工具链的适配与应用等内容。9月26日,我们在直播间期待您的参与! 面向服务的架构(Service…

服务的UUID

1. UUID 广播数据中,一般会包含一个UUID列表,用以展示自己支持的服务。但是GAP和GATT服务的UUID不能加到广播中。广播包中可以根据自身情况包含一部分服务的UUID或者包含所有服务的UUID。部分服务的UUID列表和完整的UUID列表只能包含一个。 什么情况下包含部分UUID?广播数据…

Common PyPI?

Skip to main contentTwo factor authentication is available, enable it now for your account.Search PyPISearch macnote Common questions BasicsWhats a package, project, or release? How do I install a file (package) from PyPI? How do I package and publish my…

Hackademic.RTB1 打靶记录

第一次打靶机,思路看的红队笔记https://www.vulnhub.com/entry/hackademic-rtb1,17/环境:kali Linux - 192.168.75.131,靶机 - 192.168.75.132 主机发现和端口扫描扫描整个网络有哪台机子在线,不进行端口扫描 nmap -sP 192.168.75.0/24 Starting Nmap 7.93 ( https://nmap.…

安装网站时出现“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”解决方法

当你在安装网站时遇到“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”的错误时,可以按照以下步骤来排查和解决这个问题。 排查步骤确认数据库连接信息:确认数据库服务器地址、用户名、密码、数据库名称等信息是否正确。 确认数据库服务器是否处于…

易优eyoucms网站二次验证密码忘记解决办法

当你忘记了易优CMS(EyouCMS)后台的二次验证密码时,可以通过修改数据库中的相关设置来绕过或重置这个验证。根据提供的记录信息,可以按照以下步骤来进行操作: 步骤登录数据库 修改相关设置 清除缓存详细步骤 1. 登录数据库 首先,你需要登录到你的MySQL数据库。你可以使用命…

mysql事务隔离级别和spring事务传播机制

一、事务并发会出现的三个问题 数据库事务具有ACID4个特性: A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行; C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100; I:Isolation…