java程序线上问题排查基本步骤

2020-07-20  本文已影响0人  kingTao_

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为中间件使用配置问题,难以发现,只能排除法猜测
上一篇下一篇

猜你喜欢

热点阅读