流量上来后接口全部无响应,线程堆栈显示大量线程在等待数据库连接。日志里能对上时间点,这种反而好排。
线程池容量大于连接池,所有线程都占着连接等待,或存在嵌套获取连接。这一点先确认清楚,后面就不用反复试。
# 连接池 pool_size=20, max_overflow=10, pool_timeout=5 # 线程池 max_workers=20 # 打印堆栈 jstack 12345 | grep -A10 pool
「线程池连接池死锁」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
处理上按这个顺序:让线程数与连接数匹配;避免在持有连接时再申请连接;加超时与监控。
结果对不对很好判断,高峰时线程不再堆积,接口能在超时时间内返回。