1.故障简述
8月30日 上午9:30 发现某核心服务开始告警,主动重启,影响线上成交和查看订单。持续影响3分钟
2.故障引入与处理的整个过程
时间 |
故障处理行动 |
2023-08-30 09:29:57 |
收到监控告警某核心 服务自动完成重启 |
2023-08-30 09:30:33 |
服务全部启动完成 |
2023-08-30 09:51:00 |
排查原因——通过日志看到有数据库关闭 |
2023-08-30 10:03:00 |
看到慢sql统计里有昨日上线的sql |
2023-08-30 10:20:00 |
优化sql提交代码打包上线 |
2023-08-30 10:44:41 |
上线完成,观察日志已经没发现新产生对应的慢sql |
3.故障原因分析
3.1 故障触发
故障根因:由于慢sql增多导致数据库连接池打满,所有dubbo服务涉及数据库操作的都需要等待获取链接,从而把dubbo线程池打满,
服务的健康检查发现dubbo服务不可用,所以发生了重启
3.2 故障排查过程
1.首先发现服务频繁重启,排查原因是因为健康检查没有过,健康接口出错日志是 dubbo线程池满了,目前最大是200
2.同时发现这期间有超过200个慢sql,猜测慢sql阻塞住了请求
3.这期间迅速修复慢sql
对大表进行查询,mysql优化器选择了带函数的检索字段,导致索引失效
4.同时排查慢sql阻塞其余请求的原因,连上服务器,发现服务状态都健康,内存CPU等都很稳定
5.jstack查看线程状态,发现所有容器工作线程都是wait状态,如下:
"XNIO-1 task-5" #178 prio=5 os_prio=0 tid=0x000000002a03e000 nid=0x350c waiting on condition [0x000000004013a000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:2029)
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1557)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1337)
at com.alibaba.druid.pool.Dr服务器托管网uidDataSource.getConnection(DruidDataSource.java:1317)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1307)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:109)
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java服务器托管网:79)
at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)
at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)
我们的数据库连接池是DruidDataSource,配置基本都是默认值,现在最大8个连接,深挖代码发现:
就算设置了超时等待时间,只能影响等待线程,不能中断被hold住的查询,如果要中断正在执行的查询,可以通过设置这两个参数:
那么防止慢sql拖垮整个服务的解决方式也很明了:
1.设置maxWait
2.设置removeAbandoned为true,设置removeAbandonedTimeout(应大于业务运行最长时间)
3.设置合理的最大连接数,默认为8,需根据业务自行调整
4.结论
1.上线之前反复确认sql是否正确命中索引,防止慢sql拖垮服务
2.检查和优化数据库配置:执行超时时间,获取链接超时时间等
5.推荐的配置
初始化大小,最大,最小连接等条件根据实际需要进行配置,以下配置相关参数皆为举例
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: PicoRV32-on-PYNQ-Z2: An FPGA-based SoC System——RISC-V On PYNQ项目复现
本文参考: 👉 1️⃣ 原始工程 👉 2️⃣ 原始工程复现教程 👉 3️⃣ RISCV工具链安装教程 本文工程: https://bhpan.buaa.edu.cn:443/link/4B08916BF2CDB42DB78976BCCDB712E2 1.准备工…