rt下降40%?程序并行优化六步法

这篇具有很好参考价值的文章主要介绍了rt下降40%?程序并行优化六步法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 背景

性能优化是我们日常工作中很重要的一部分,主要有以下原因:

  • 降低服务器和带宽等硬件成本:用更少的资源处理更多的请求
  • 提高现实世界的运行效率:人机处理效率存在数量级的偏差,同样机器世界的效率提升能带来现实世界效率提升的方法效果
  • 提高用户的体验:解决响应缓慢、宕机等问题

而并行优化在改善程序接口响应时间和吞吐量指标方面是个利器,所以本次结合前段时间做的一段长链路执行逻辑代码的优化,给大家讲讲程序并行优化的步骤及方法论。

2 多线程优化六步法

2.1 定位优化点

一般是通过全链路监控、火焰图、自定义打点、生产报警等先找到耗时长的性能问题点,之后通过多线程并行化的方式达到优化程序响应时长和吞吐量的目的。

2.2 执行链路分析

对问题点的执行链路进行分析,主要分几方面:

  • 链路里涉及的操作节点;
  • 节点自身的耗时;是io密集型还是cpu密集型;是否依赖和修改外部变量;此节点是否是核心路径;
  • 节点间彼此依赖关系;

2.3 异步链路设计

  • 将链路根据依赖关系进行重排,把被依赖的放在前面;
  • 彼此不依赖有相同起点的节点并行化;设计并行任务结果获取及后续依赖节点的通知机制
  • 如果有指定响应时间目标的链路,为核心路径节点设计降级方案;根据响应时间要求及已耗时数据对非核心路径节点调用进行舍弃;
  • 将对变量修改的逻辑收拢,且尽量在主线程中处理,避免需要做的多线程变量可见性和时序性同步

2.4 并发框架选择

1.线程池

描述:具体业务任务继承接口 Runnable、Callable ,在调用 ExecutorService.submit 接口时,会提交任务到 ExecutorService 内部的一个任务队列中。同时,在 ExecutorService 内部还存在一个预先申请的线程池(Thread Pool),线程池中的线程会从任务队列中领取一个任务来执行。

优点:复用线程,减少线程创建销毁成本及减少请求时延

注意点:cpu密集型和io密集型任务应进行不同的线程池配置;为避免不同任务相互干扰重要业务最好独立使用线程池;不同线程之间要注意操作的有序和数据的可见性

2.AKKA

描述:每个 Actor 代表的是可以被调度执行的轻量单元。如图中所示,Actor A 和 Actor C 在向 Actor B 发送消息时,所有消息会被底层框架发送到 Actor B 的 Mailbox 中,然后底层的 Akka 框架调度代码会触发 Actor B,来接收并执行消息的后续处理。这样,基于 Actor 模型的这套并发框架,首先就保证了消息可以被安全地在各个 Actor 之间传递,同时也保证了每个 Actor 实例可以串行处理接收到的所有消息。

优点:不需要关注多线程之间并发同步和数据一致性;轻量级高并发

注意点:actor任务粒度要小,避免承接太多业务逻辑;计算密集型任务更能发挥出AKKA的优势

3.REACTOR

描述:输入流 Flux 就是 Reactor 中典型的异步消息流,它代表了一个包含 0 个到 N 个的消息序列。另外,图中的 Rule 代表的是一个基于消息的处理逻辑或规则,输入流中的消息可以被中间多个处理逻辑组合连续加工之后,再生成一个包含 0 个到 N 个的输出消息流 Flux。

优点:rule采用pull处理消息,避免消息积压;异步非阻塞io,避免阻塞当前线程

注意点:函数式编程,会有一定的语法学习成本和理解成本;针对消息流处理的、基于 IO 密集型的异步交互场景比较有优势

2.5 并发工具选择

多线程执行涉及到一系列细节问题,如共享变量可见性,执行顺序,结果的获取、后续操作的通知等,所以要结合需求使用一系列相关的并发工具类做多线程执行正确性的保障

2.6 效果验证

1.压测

一般通过jmeter、loadrunner等后端性能测试软件,不断对系统施加压力,并验证系统化处于或长期处于临界饱和阶段的稳定性以及性能指标,并试图找到系统处于临界状态时的主要瓶颈点。

注意点:

  • 完全相同的环境以及测试负载
  • 注意混部情况其他服务可能对验证服务造成的影响
  • 通过加压减压调整请求量观察服务器处理能力的变化及稳定性

2.性能指标验证

  • 验证并发用户数、响应时间及吞吐量这种调优目标量;
  • 观察服务器的负载指标,防止因优化带来服务器超出负载能力;
  • 观察上下游服务的业务指标和服务器负载,防止因优化带来上下游超出负载能力

3.业务结果验证

一般通过diff工具通过采集相同请求的响应对比判别是否影响业务;也可通过qa辅助构建针对改动的测试集去做验证

3 举例

以我们前段时间进行的商品主数据下发消费能力调优进行举例说明整个优化过程:

3.1 优化点定位

主数据程序接收商品批量下发处理缓慢,触发下发积压报警

3.2 执行链路分析

梳理各步骤对入参和保存时需要的变量的处理,分析各步骤相互依赖关系,是否可并行,进行执行过程优化调整。

商品主数据处理步骤分析:

3.3 异步链路设计

  1. 1、 3、4、5异步并行处理,且因对其他变量修改逻辑无依赖,放在最前面提交。
  2. 2、7、8、9、10、11根据依赖关系,把相关性的逻辑收拢,把被依赖的逻辑提前。
  3. 13也异步提交。最后通过completionService.take().get()遍历获取各任务执行结果进行合并返回最终结果

3.4 并发框架选择

出于团队知识栈及框架应用场景综合考虑,这里选择了线程池作为并发框架,并结合多io场景做了线程池参数配置。

/**
     * io任务线程池
     */
    public static ThreadPoolExecutor threadPoolExecutorForIO= new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),Runtime.getRuntime().availableProcessors()*2,1, TimeUnit.MINUTES,new ArrayBlockingQueue(2014),new ThreadPoolExecutor.CallerRunsPolicy());

3.5 并发工具选择

这里使用CompletionService来获取多线程的执行结果,并进行结果归集。
CompletionService通过在线程结果完成时提交到阻塞队列,避免通过遍历future结果的方式导致先提交的任务耗时长造成的阻塞等待。

        CountingExecutorCompletionService<Boolean> completionService= new CountingExecutorCompletionService(ExecutorCollector.threadPoolExecutorForIO);
        //任务提交
 completionService.submit(callableA);
//结果归集
   boolean result=true;
        for(int i = 0; i<completionService.getSubmittedTaskCount(); i++)
        {
            result&=completionService.take().get();
   }

3.6 效果验证

1.压测

采用jmeter对两台相同配置的服务器(分别部署优化版本和原始版本)加压,观察服务负载情况

2.性能指标验证

1)耗时和吞吐量异步版本要优于同步版本

异步版本耗时在80-100ms,同步版本耗时在120-160ms
异步版本吞吐量在17000/5分钟,同步版本吞吐量在15000/5分钟

2)cpu使用率异步版本略高一点,线程数异步版本比较高
线程数高的原因:用到了线程池,预置的核心线程数为逻辑核数64,因为涉及到io操作较多,最大线程数配成了128。

3.业务结果验证

因为公司框架不支持http的diff,此处采用了自己抽检请求结果及qa协助走查和code review的方式保证业务结果的准确性

4 总结

程序性能优化方法关系到方方面面,而多线程异步优化无疑是其中很重要的一种途径。它不光关系到并发框架的选择、多种线程工具类的使用,还关系到对整个处理链路的业务理解和编排分析。希望通过这一课可以帮大家理清相关的思路,作为日常优化工作的一个参考。

作者:京东物流 冯鸿儒

内容来源:京东云开发者社区文章来源地址https://www.toymoban.com/news/detail-454379.html

到了这里,关于rt下降40%?程序并行优化六步法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 25.4 matlab里面的10中优化方法介绍——最速下降法(matlab程序)

    1. 简述        matlab实现最速下降法 定义:沿负梯度方向进行搜索的算法(负梯度方向为最速下降方向) 算法步骤: 步0:选取初始点x0,容许误差是e=[0~1],令k=1 步1:计算目标函数的梯度gk=▽f(xk))   若 ||gk||=e,即达到误差要求,立即停止计算,并输出xk作为近似最优解。 步

    2024年02月15日
    浏览(35)
  • 阿里云多款ECS产品全面升级 性能最多提升40%

    “阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新,为客户创造业务价值。”10月31日,杭州云栖大会上,阿里云弹性计算计算产品线负责人张献涛表示,通过持续的产品和技术创新,阿里云发布了HPC优化实例等多款新品,性能可提升40%,并对g8i等多款第八

    2024年02月06日
    浏览(40)
  • 提速 40%,融云基于 QUIC 深度优化通信协议

     8 月 17 日(本周四),融云直播课从排查问题到预警风险,社交产品如何更好保障体验、留住用户?欢迎点击报名~ 各分位(P99、P95、P50)连接速度提升 30%~50%; 关注【融云全球互联网通信云】了解更多 网络延迟低连接耗时终端占比提升 50%,高连接耗时终端占比压缩至 1%

    2024年02月12日
    浏览(30)
  • ChatGPT+低代码,将干掉40%的程序员

    作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 关于程序员失业有个段子:拖拽建站出来的时候,他们人说程序员会失业;低代码出来了,他们说程序员会失业;Copilot出来了,他们说程序员会失业;如今Chatgpt出来了,他们又说程序员会失业,程序员咋就这么遭人恨

    2024年02月04日
    浏览(26)
  • Java程序性能优化技巧

    在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性能而言是非常糟糕的。虽然在一次 try-catch中,无法察觉到它对性能带来的损失,但是,一旦try-catch被应用于循环之中,就会给系统性能带来极大的伤害。 以下是一段将try-catch应用于for循环内的示

    2024年02月11日
    浏览(39)
  • Winform程序性能优化

    以下是一些Winform程序性能优化的建议: 1. 尽量减少无用的重绘,做好控件的布局和样式设计。因为Winform程序是采用事件驱动的框架,控件的重绘会触发Paint事件,频繁的重绘会降低程序性能。 2. 避免在UI线程中执行耗时操作,因为在UI线程中执行耗时操作会阻塞UI线程,导

    2024年02月12日
    浏览(29)
  • 8000字程序性能优化全能手册

    8000字讲清楚程序性能优化。 本文聊一个程序员都会关注的问题:性能。 当大家谈到“性能”时,你首先想到的会是什么? 是每次请求需要多长时间才能返回? 是每秒钟能够处理多少次请求? 还是程序的CPU和内存使用率高不高? 这些问题基本上反应了性能关注的几个主要方

    2024年02月03日
    浏览(30)
  • 优化算法之梯度下降|Matlab实现梯度下降算法

    题目要求: 使用Matab实现梯度下降法 对于函数: min ⁡ f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 min f(x)=2 x_{1}^{2}+4 x_{2}^{2}-6 x_{1}-2 x_{1} x_{2} min f ( x ) = 2 x 1 2 ​ + 4 x 2 2 ​ − 6 x 1 ​ − 2 x 1 ​ x 2 ​ 试采用 MATLAB实现最速下降法求解该问题, 给出具体的迭代过程、 最终优化结果、

    2024年02月16日
    浏览(44)
  • uniapp小程序如何进行性能优化

    减少页面层级:尽量减少页面的层级,减少页面的嵌套,可以减少页面的渲染时间,提高页面的加载速度。 避免过多的数据绑定:减少数据绑定的次数,尽量将数据绑定到最外层的组件上,避免过多的数据绑定,可以减少页面的渲染时间。 避免频繁的数据更新:对于一些不

    2024年02月13日
    浏览(23)
  • 8000字,程序性能优化的全能手册

    8000字讲清楚程序性能优化。 本文聊一个程序员都会关注的问题:性能。 当大家谈到“性能”时,你首先想到的会是什么? 是每次请求需要多长时间才能返回? 是每秒钟能够处理多少次请求? 还是程序的CPU和内存使用率高不高? 这些问题基本上反应了性能关注的几个主要方

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包