故障复盘时发现队列最长积压 2 万个任务,持续了 47 分钟,监控面板上只有 CPU 和内存,线程池相关的一个指标都没有。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
pool.getQueue().size(); pool.getActiveCount(); pool.getCompletedTaskCount();
线程池创建后只提交任务,活跃线程数、队列长度、拒绝次数都没往外暴露。队列积压平时不出声,等到内存或超时暴露出来已经晚了。这一点先确认清楚,后面就不用反复试。
「线程池队列监控」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,用 getActiveCount、getQueue().size()、getCompletedTaskCount 注册成指标;队列长度按容量百分比设两级阈值 50% 预警 80% 告警;拒绝次数单独计数 非零就触发告警;把指标接到现有面板 和历史曲线对齐看趋势。
改完照着核一遍,面板上能看到队列长度曲线,压测时长度上升能立刻看到。
