java程序线上问题排查基本步骤
观察cpu、内存使用情况
1.cpu高
A:查看是否因内存泄漏导致频繁FGC
B:无A问题,如果cpu密集型程序,忽略cpu高问题
2.内存使用高
A:查看是否内存泄漏
记一次集群中一台服务器查mysql慢
场景
1.两台集群,nginx轮询负载
2.服务器A查数据库T表震荡行慢,10-8000ms
3.T表分为近期数据表,T和T0-63(sharding-jdbc)
问题1
原逻辑:查T表->不存在->查历史T0-63
问题:要检索的数据T表无,会导致穿透T查历史T0-63
调整:查T表->不存在->根据时间参数判断是否查历史->查历史T0-63
问题2
1.服务器A/B分别 ping 数据库服务器,发现A的通讯慢10-50倍
2.找运维确认,A和数据不在同一机柜,用光纤连接的
问题3
1.问题2带来的思考:非cpu密集程序卡顿,一定是因为阻塞-线程阻塞,导致线程资源无法释放,导致等待资源阻塞
2.因查库慢,猜测数据库线程池阻塞;但其他查库语句没问题,猜测sharding池阻塞
3.jstack pid | grep Sharding-JDBC
结果:sharding-jdbc池只有32,显然不够
解决:调整到128
结论
1.首先问题2为物理设备问题,解决代价达,基本不可能调整物理设备
2.其实问题1为程序逻辑问题,首当其冲优化
3.最后问题3为中间件使用配置问题,难以发现,只能排除法猜测
网友评论