前置:
任务:
常见线程池告警类型如下,本文也从以下几个方面进行展示:
先说结论:
根据线程池告警修改参数导图:
释义:任务过多,使得线程池中活跃线程占比超过阈值(如99%)
如果核心线程数>最大线程数*80%:该告警基本上无用,可以不使用
如果核心线程数占最大线程数较小:该告警有一定用处,但是不如其他线程池告警
释义:任务过多,达到任务队列容量的阈值(如70%)
如果是任务逐渐处理不过来:
增加pod,增加核心线程数最大线程数,增加任务队列容量
如果是突发任务:
增加任务队列大小容量
释义:任务过多,线程数量达到最大,且任务队列已满,触发线程池拒绝策略
(线程池告警)降低队列容量告警阈值
增加 任务排队超时告警、任务执行超时告警
如果是任务逐渐处理不过来:
增加pod,增加核心线程数最大线程数,增加任务队列容量
如果是突发任务:
增加任务队列大小容量
优化拒绝策略,尝试自定义拒绝策略(从Netty、Dubbo等框架中学习非JDK8的拒绝策略)
释义:任务从任务队列到线程池中时,时间过长
优化点:
增加核心线程数与最大线程数(如原有数量*2)
(其他)单个任务逻辑,优化可以从异步,并发等方面入手
增加pod数量
释义:执行期间单个任务直接放入线程中执行,但是整个执行期间过长。
优化点有以下:
(线程池告警)该线程池的任务队列告警阈值需要降低阈值优化,如果是核心业务,则需要减少降低限度(如5%),直至可以在运维发现问题后,有足够时间让开发排查;如果不是核心业务,则可以随便修改,甚至不修改
(线程池参数)增加任务队列容量,如果遇到任务激增,则可以尽量避免触发拒绝策略
线程存活时间可以增加(1000~10000之间是业务上比较合理的数值),避免比核心线程数多的对应数量线程
增加核心线程数与最大线程数(如原有数量*2)
(其他)单个任务逻辑,优化可以从异步,并发等方面入手
启动时预热全部核心线程数量,避免创建线程导致任务消耗时间增加
增加pod数量
调参通知、队列容量告警、拒绝策略告警必然是需要的
核心微服务:
必须加上 调参通知、队列容量告警、拒绝策略告警
如果是对于设备时效性要求较高=>加上 任务排队超时告警、任务执行超时告警
如果是长任务=>加上 任务执行超时告警、线程池活跃度告警
非核心为服务:
一般只需要 调参通知、队列容量告警、拒绝策略告警,后续根据业务需要增加
告警阈值怎么设定?
线程池有以下几种形式:
推荐使用方式2
优先基于一些理论得到合适一些的线程池参数
核心微服务:
基于计算得到的理论线程池参数根据Jmeter进行压侧微调,直至获得最合适的线程池参数
以上是理论上的线程池参数,为了可以更好地使用线程池,还需要根据压力测试对线程池参数进行微调,直至可以获得能最大限度利用资源的。
压测-压测报告对比-调参-再压测。。。重复循环,直到获取到最优的线程池参数配置。
非核心微服务:
不如直接根据理论值配好上线,如果有压力可以立刻增加资源、修改线程池参数。
可有可无的微服务,要避免浪费资源,也需要线程池监控查看配置,此时线程池情况可以做一个较好的缩容的指标。
首先需要明确一下几点:
排查思路大概如下:
需要关注的点:
业务增长怎么转换成可以量化的“需要新增的资源量”
业务增长后,可以依据原有微调后的参数等比例修改,后再进行压侧/根据实际业务微调参数
核心微服务可以根据压测修改,非核心业务可以根据CPU核数重新计算。
业务增长后,监控项是否需要增减,是否需要改阈值
监控项需要根据业务特性是否发生变更做更改;
阈值由于是一个百分比,可以不变,后续再根据业务预警做修改。