MysqlIO.readFully问题排查分析过程

支付清结算系统在6:00~7:00对账速度缓慢,初步认为是数据库性能瓶颈。线程栈分析显示Thread-68、Thread-69阻塞在对账写入部分。排查了网络、MySQL设置、连接池配置和TCP缓冲区大小,最终发现是未加索引的大数据表导致执行阻塞,增加索引后问题解决。
摘要由CSDN通过智能技术生成

问题描述

支付清结算系统"外部对账"部分任务在早上6:00~7:00时间段内对账速度缓慢,且经常造成对账统计结果不准确问题,导致结转记账不准确。

初步分析及处理过程

由于外部对账是经过性能优化的,且在压测环境表现良好,所以最开始初步认为是由于数据库性能瓶颈导致,初步处理方式为将线上6:00~7:00之前的慢SQL进行了一番排查,并对涉及外部系统的慢SQL进行了优化,这个步骤理论上是可以解决此类问题,但RDS(阿里云Mysql可能存在慢SQL统计不准确问题)。

特点时间段内线程栈分析

特定时间段线程栈分析,由于SQL优化部分并没有解决此类问题,为了查看在早上6:00~7:00这个时间段内程序JVM内部到底发生了什么,所以采取了定时抓取线程栈日志的手段(具体方式为在Linux服务器添加cron任务,并累计输出日志的方式,脚本如👇)。

#clearjstack.sh

#!/bin/sh
DATE='/bin/date'
timestamp() {
$DATE +'%Y-%m-%d %H:%M:%S'
}
ts=`timestamp`
echo "start log $ts" >> /tmp/clearjstack.log
/usr/java/jdk1.7.0_67/bin/jstack -l `/usr/java/jdk1.7.0_67/bin/jps -lvm | grep tomcat-clear | awk '{print $1}'` >> /tmp/clearjstack.log
ts=`timestamp`
echo "end log $ts" >> /tmp/clearjstack.log

Linux下添加定时任务的方式:

//添加计划任务
[root@123.57.28.241/10.172.233.8 tmp]cd /var/spool/cron/
[root@123.57.28.241/10.172.233.8 cron]pwd
/var/spool/cron/具体用户名(如为root用户)
[root@123.57.28.241/10.172.233.8 cron]vim root
*/5 * * * * /bin/sh /tmp/clearjstack.sh > /dev/null 2>&1
//查看计划任务
[root@123.57.28.241/10.172.233.8 cron]crontab -l
0 0 * * * /usr/local/script/Cutlog.sh >/dev/null 2>&1
*/5 * * * * /bin/sh /tmp/clearjstack.sh > /dev/null 2>&1

对线程栈日志分析(1)

#clearjstack.log

start log 2016-11-24 06:20:01
2016-11-24 06:20:02
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode):

"Thread-70" prio=10 tid=0x00007f21f4022800 nid=0x12da runnable [0x00007f216cace000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
- locked <0x0000000786facbc8> (a com.mysql.jdbc.util.ReadAheadInputStream)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3014)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3467)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3997)
at com.mysql.jdbc.MysqlIO.s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值