压测 200 并发时接口 P99 8 秒,HikariPool 日志每隔几秒打一次 connection is not available, request timed out after 30000ms,线程池活跃数是 200。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,线程池允许 200 个任务同时跑,连接池上限只有 20,剩下的 180 个线程都在 getConnection 上排队。线程没被复用,全卡在等连接。
「线程池连接池配比」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。
SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections';
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,先算数据库能承受的连接数 再定连接池上限;线程池大小不要超过连接池的几倍 超过的部分只会排队;连接等待超时调短 快速失败好过堆积;压测时同时看活跃线程和活跃连接两个数。
最后用这个标准收尾,活跃连接数接近上限时线程池活跃数不再继续上涨,P99 回到 500ms 以内。
