线程池优化与监控

随着应用不断的迭代更新,零售工程内异步任务逐渐增多,包括网络请求、本地 DB 操作、轮询等任务使用的都是同一个线程池,线程池极易打满(比如网络一慢就容易阻塞线程池),导致任务堆积,造成「操作卡顿」的现象。用户看到操作没反应,可能会更频繁的尝试操作,再加上不断轮询的任务,应用的线程池队列会快速积压更多的任务,「卡顿」现象加剧,单一线的线程池已经无法支撑业务需求:

前言

随着应用不断的迭代更新,零售工程内异步任务逐渐增多,包括网络请求、本地 DB 操作、轮询等任务使用的都是同一个线程池,线程池极易打满(比如网络一慢就容易阻塞线程池),导致任务堆积,造成「操作卡顿」的现象。用户看到操作没反应,可能会更频繁的尝试操作,再加上不断轮询的任务,应用的线程池队列会快速积压更多的任务,「卡顿」现象加剧,单一线的线程池已经无法支撑业务需求:

线程池优化与监控

  1. 任务没有隔离,异步任务相互影响主要是长耗时影响短耗时任务
  2. 轮回任务开销大:没有统一的轮询处理方式,业务方需要自己创建线程或线程池(有些干脆就在默认的 I/O 线程池进行轮询),应用中存在大量的自建线程池,增加无谓的资源消耗
  3. 缺少监控:缺乏线程池的监控和日志,线程池的运行状况和健康度无法衡量,一旦出现「卡顿」问题,排查非常困难,完全不知道是哪些任务造成的问题,伤害用户体验的同时,也极大的消耗开发人员的精力线程池优化与监控图注:短时间任务暴涨的情况,在几毫秒内触发多次任务

    二、整体设计

    目标:

    1. 任务隔离,避免耗时任务影响交互
    2. 统一轮询,减少资源开销
    3. 任务监控,防止业务方使用错误
    4. 信息采集与监控,快速定位排查问题线程池优化与监控

      优化的核心在于分离和监控

      分离:

      对原有的 I/O 线程池进行拆分,分离出不适合放在这个线程池的任务,保证 I/O 线程池能对大量、快速的本地任务给予更好的支持,而分离的关键就在于分离出「慢」和「多」的任务:

      • 避免耗时短的任务等待耗时长的任务
      • 避免频繁、大量执行的任务占据大量的线程池资源

      具体的策略包括:

      • 将网络请求的线程分离出来,放入单独的线程池中,避免因网络任务慢阻塞本地的快速任务
      • 将轮询任务分离出来,当轮询的任务耗时过长或者线程池打满的场景下,会极速加剧线程池的恶化,最终让主流程完全瘫痪,轮询任务不适合放在通用的线程池中,通过将它放入通用的轮询任务线程池,统一化的对轮询任务进行管理

      监控:

      除了已知的网络任务&轮询任务需要分离出 I/O 线程池之外,还需要增加对线程池的监控,进一步分离出不适合放在I/O线程池的任务(同样是「慢」和「多」)

      1. 通过监控每个任务执行的时长,分离出长耗时(即「慢」)的任务,分析出是因为逻辑 bug 还是本身的复杂度正常占用,如果是正常占用就考虑是否合适继续放在默认的 I/O 线程池,最终目标是达成对「慢」的优化
      2. 另外零售工程中还存在短时间大量重复任务堆积的现象,当线程池接近或达到负荷状态时,监控线程池中的任务,找到批量的任务,然后进行优化,最终目标是达成对「多」的优化
      3. 通过上面的方式将「慢」的任务分离出去之后,并不代表这样就完事了,这些任务可能会消耗大量的系统资源,所以同样需要统一对这个线程池进行监控(主要是网络任务的监控),把慢网络请求找出来,达到对「慢」的进一步优化
      4. 通过 API 监控业务方使用合理性,比如:使用多线程轮询的合理性

      三、技术实现

      2.1 线程管理库

      目标:

      1. 管理工程内所有线程池与线程创建
      2. 子线程任务监控
      3. 线程池隔离任务分开执行,使用不同线程池执行不同任务
      4. 轮询任务的统一与异常任务的过滤

线程库结构图

线程池优化与监控

线程池管理,目前会提供三种线程池:

  1. 网络线程池:针对网络任务。更改方式:直接在网络库替换业务方无感知
  2. IO 线程池:针对本地异步任务。更改方式:App 启动时 Hook RxJava 线程池替换业务方无感知
  3. 轮询线程池:针对轮询任务,需要业务方的接入

线程池 API 定义线程池优化与监控

3.2 轮询任务统一

  1. 禁止时间间隔小于 1 秒轮询任务,防止高频轮询消耗资源
  2. 所有轮询任务巡检间隔 1 秒检测一次
  3. 轮询检测是独立的线程,只做轮询检测,有任务时死循环间隔检测,没有任务时则睡眠等待下次注册执行,根据结果轮询执行或睡眠
  4. 线程任务模式有两种:
    单线程回调: 表示最多占用一个线程。例:1 秒轮询回调 1 次,再回调前会判断上个任务是执行完成,如果没有执行完成则回调 pollTaskExceptionCallback(),如果已经执行完成则回调 pollTaskCallback()
    多线程回调:表示最多占用 30 个线程。例:1 秒轮询回调 1 次,再回调前会判断当前任务占用线程总量,如果没有执行完成则回pollTaskExceptionCallback(),如果已经执行完成则回调。pollTaskCallback() 默认是单线程回调
  5. 业务方可以指定轮询次数,或设置无限轮询
  6. 轮询线程池动态扩容:初始线程为 30 个,如果使用线程等于核心线程则动态扩容 2 倍,最大限制 120 个核心线程线程池优化与监控

线程池优化与监控

线程池优化与监控

任务过滤:

轮询正常回调 pollTaskCallback() 方法,如果异常这时将回调到 pollTaskExceptionCallback() 方法。

异常任务过滤的实现:

  1. 记录所有任务。
  2. 每次执行任务时会进行校验,校验监听者是否已经把自己申请的线程全部使用,如果已经全部占用将回调异常方法,直接到任务有一个释放后再继续回调。
  3. 任务执行完后重设记录数据。

轮询异常回调有三种触发场景:

  1. 单线程任务没有释放超时。
  2. 多线程任务占用线程超过最大数量。
  3. 轮询线程池被全部占满超时。

    任务过滤-流程图线程池优化与监控

    四、工程更改

    工程更改主要分为 5 块:

    1. 网关请求线程池的替换,在构建 RxJava observable 替换成自定义网络线程池。
    2. RxJava 默认线程池的替换,App 启动时把 RxJava Hook 设置成自定义 IO 线程池。
    3. 轮询业务接入统一轮询。
    4. 网线线程池使用错误拦截,目的防止线程使用错误,禁止 IO 线程网络请求,通过拦截器方式实现。
    5. 线程任务监听设置给 APM ,通过 APM 分析上报。

    备注:只有轮询需要业务方逐个替代其它都正常使用不感知。

    五、信息采集与监控

    1. 任务提交之后记录每个任务的调用栈信息以及任务提交的时间,之后在任务真正开始执行时会记录任务开始的时间,任务执行完成后即可算出一个任务完整的执行时间、任务等待时间等,这样就可以抓取出「慢」的任务
    2. 在任务执行完成时,如果线程池已满并且任务的等待时间超过阈值,则会拉出线程池任务栈的信息,用于查找出异常的任务

      线程池监听 API线程池优化与监控

      改善效果:

      卡顿定义:包含主线程超过300ms慢方法、ANR、本地子线程操作超过1s、线程池阻塞、页面渲染时间超过200ms。

    3. 六、未来规划

      • 支持更多维度的任务监控,并增加自动报警能力
      • 针对不同的机型进行最优线程池配置,最大化复用系统资源
      • 逐渐完善 pthread、线程任务数量等监控能力

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。商机网仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 tenspace2022@163.com 举报,一经查实,本站将立刻删除。 本文链接:https://www.315965.com/n/52915.html 聚才发 母婴好物

(0)
上一篇 2023年12月15日 上午4:37
下一篇 2023年12月15日 上午4:44

相关推荐

  • 花束包装教程图解(简单鲜花包装教程)

    DIY 的花太多了,不知道如何存放?8 种花艺包装给你选择 (附教程) 今天的主题就是 花束包装 教程1 这次的教程总共分为8个教程 不管是对于鲜花 还是我们自己制作的手工花 包装包装的手法大体一致 主要的区别就是 鲜花需要做保鲜处理 而我们的手工花 只需要负责美美哒! 教程2 在包装材料的选取这一块 我们也尽量遵循着纸艺的原则 所以在材料准备上面 大家只需…

    2023年7月30日
    355
  • 简单ppt制作教程步骤(ppt制作教程详细步骤)

    1. 开始→程序→Microsoft Word→选“模板”→确定→选“演示文稿设计”卡片→“彩晕型模板” →“确定”选第一行第二列的幻灯片→确定。 2.将工具栏的“50%”改为“66%” 3.插入→文本框→文本框→在幻灯片左上角单击→输入“计算机世界”→在其他地方单击。 4.单击底部的“自选图形”→单击“基本”基本选梯形→在页面左下角拖动鼠标,形成梯形→在梯…

    2023年7月30日
    337
  • css菜鸟教程(CSS菜鸟教程总结)

    相信做过网页的对Css都不是很陌生,它可以帮助我们重铸网页中很多绚丽的特效,尤其是现在Css已经发展3.0版本,很多功能更是丰富多彩,让我们的开发时间不仅大大缩短,而且还可以轻松做出许多华丽的特效,需要注意的是,Css相当于Html的一个美化装置,所以它必须依赖于Html才能发挥作用,那么今天我们就来深入了解下它吧。 一、Css的用法 1.如何使用Css 要…

    2023年7月31日
    505
  • 无线监控安装教程(无线监控安装教程图片)

    视频监控就像我们的第三只眼睛,应用越来越广范,不管是公共场所,还是家用,随处可看到监控探头的影子。 有时候我们需要在家里装一两个监控,但数量少,找专业人士又不划算,那咱们可以自己学学自己动手装,超级简单,一学就会。下面咱们跟着截图一步步学。以有线网络摄像头为例。 第一步:组装好摄像头,安装到需要的位置,连接好网线和电源线,电源为12V直流供电,可以用集中电源…

    2023年8月1日
    252
  • 黑苹果安装教程2024(黑苹果安装教程详细)

    黑苹果安装步骤 上一篇内容我们讲到了安装黑苹果前的所有准备步骤,正式安装的时候插入提前制作好的 U盘 电脑开机之后连续按 F12 键,在启动项的页面我们选择 U盘 启动。 选择 U盘 引导启动之后回车执行,来到如下图显示的引导界面之后我们选择苹果图标并回车进入。 在进入到如上图的界面之后需要一段时间的等待,而这里也是最容易出问题的地方,就是我们常说的卡代码。…

    2023年7月30日
    490
  • B站UP主宣布集体停更背后原因是什么?

    这次B站up主收益降低,有的直接宣布停更的事件,我作为一个B站的UP主,来聊聊我的看法。 首先说下我的团队,我们现在的团队是四个固定成员,偶尔在忙不过来的时候,会有两个机动的兼职后期。四个人负责从脚本、到拍摄、到后期剪辑、到商单、到资源拓展所有的工作。 我们所有的视频是在主流的通发的,前前后后做了大概5年的时间。其中,B站的粉丝刚刚过10万,属于是腰部靠下,…

    2023年12月15日
    230
  • 织围巾教程简单易学(织围巾教程简单易学图解)

    这是骗你生女儿的贴~粉嫩嫩的颜色太好看了~ 这款围巾成品快,适合新手 用线:雪妃尔五股 用量:主色一团有剩余 作品秀: 喜欢的小伙伴一起钩起来吧 成品图↓ 这是我儿子的同学,好可爱的小女生,帮忙试戴了一下 我自己戴貌似也可以~ 有点装可爱了~ 前几天兰州群聚会,带去晒了晒 过程图: 脚脖和脚掌分别钩好两个,缝合即可 主题两头白色,中间可以换其他颜色,长短加减…

    2023年7月30日
    304
  • windows10重装系统教程(重装windows10系统的详细教程)

    电脑怎么重装系统win10.首先,我们插上系统u盘,然后按咱们的开机键,一直按f12 每张主板的启动热键不同,我这里已经放了一个图给大家 然后选择win8pe点回车,在这里稍作等待,然后进入到我们的pe装机界面 打开u深度pe装机工具,找到咱们这个硬盘,然后右击快速分区 大家想分几个就可以分几个,然后分多大,然后在工具里,找到我们拷贝到u盘的系统镜像选择一下…

    2023年7月31日
    382
  • PGO 是啥,咋就让 Go 更快更猛了?

    PGO 是什么 Profile-guided optimization (PGO),翻译过来是使用配置文件引导的优化。也被称为: profile-directed feedback(PDF) feedback-directed optimization(FDO) PGO 是计算机编程中的一种编译器优化技术,使用分析来提高程序运行时性能。也就是可以提高 Go …

    2023年12月16日
    203
  • 小程序开发流程详细(小程序开发入门教程)

    数据绑定 vx小程序页面渲染时,框架会将WXML文件同对应的Page的data进行绑定,在页面中我们可以直接使用data的属性,其使用的语法是Mustache语法,也就是使用双大括号将变量或简单的运算规则包裹起来,实现的主要渲染方式有以下几种: 简单绑定 简单绑定就是使用Mustache语法(双大括号)将变量包起来,在模版中直接作为字符串输出使用,可以用于内…

    2023年7月31日
    255