rt下降40%?程序并行优化六步法 | 京东云技术团队

news2024/12/17 19:30:02

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 总结

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

作者:京东物流 冯鸿儒

内容来源:京东云开发者社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十一、配置内网穿透实现消息模块和授权登陆模块

开通内网穿透的服务&#xff08;后端8333&#xff0c;前端8080&#xff09;&#xff1a; 启动内网穿透服务&#xff1a; 创建CourseApiController来实现关键词查询课程信息&#xff1a; package com.lxl.ggkt.vod.api;import com.baomidou.mybatisplus.core.conditions.query.…

2023年认证杯SPSSPRO杯数学建模D题(第一阶段)立体车库的自动调度问题全过程文档及程序

2023年认证杯SPSSPRO杯数学建模 D题 立体车库的自动调度问题 原题再现&#xff1a; 随着人们生活水平的提高&#xff0c;汽车保有量日益增加&#xff0c;而城市土地资源有限&#xff0c;传统平面停车场土地面积利用率低, 这样便形成了交通拥挤、停车困难的现象。为解决该问题…

资深测试老鸟整理,超全自动化测试用例详解-小技巧总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

PCA的数学原理和python实现

最近学习了一下PCA&#xff0c;具体原理网址如下&#xff1a; CodingLabs - PCA的数学原理 主要原理是通过线性变换将原始数据变换为一组各维度线性无关的表示&#xff0c;其中将方差最大的方向作为主要特征。提取数据的主要特征分量&#xff0c;可用于高维数据的降维 主要算…

工作3年裸辞,从18K到38K,面试也····

现在的面试好像也不是那么的难 工作3年&#xff0c;换了好几份工作&#xff08;行业流行性大&#xff09;&#xff0c;每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心&#xff0c;而且特别不喜欢请假面试&#xff0c;对自己负责也对公司负责。 但是这次没想…

Axure 教程:动态分组条形图(中继器)

本文将教大家如何用AXURE中的中继器动态分组条形图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://v7cmdp.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87807121?spm1001.2014.3001.5503 二、功能介绍 简单填写中继…

Lucene(4):Field域类型

1 Field属性 Field是文档中的域&#xff0c;包括Field名和Field值两部分&#xff0c;一个文档可以包括多个Field&#xff0c;Document只是Field的一个承载体&#xff0c;Field值即为要索引的内容&#xff0c;也是要搜索的内容。 是否分词(tokenized) 是&#xff1a;作分词处理…

requests爬虫

目录 一、爬虫概念及分类 二、requests模块 1、网页地址内容获取 2、图片爬取 3、UA伪装 三、动态加载数据 一、爬虫概念及分类 爬虫: 通过编写代码&#xff0c;让其模拟浏览器上网&#xff0c;然后在互联网中抓取数据的过程 分类&#xff1a;1、通用爬虫&#xff1a;要…

Linux: ARM32各CPU模式下栈配置

文章目录 1. 前言2. 背景3. ARM32 中断向量表 和 中断处理流程3.1 ARM32 中断向量表3.2 ARM32 中断处理流程 4. ARM32 各CPU模式下的栈配置4.1 SVC模式下各CPU栈配置(内核栈配置)4.1.1 BOOT CPU SVC模式栈配置(内核栈配置)4.1.2 非 BOOT CPU SVC模式栈配置(内核栈配置) 4.2 中断…

实现快速多点触控,让App自动化测试操作更方便

目录 前言&#xff1a; PyAutoGUI简介&#xff1a; 代码示例&#xff1a; 总结&#xff1a; 前言&#xff1a; 随着智能设备的普及&#xff0c;触摸点的数量和触摸操作的复杂度也在不断增加。要想在触控界面上获得更高效率和更好的体验&#xff0c;多点触控操作是必不可少的…

历经70+场面试,我发现了大厂面试的套路都是···

今年的金三银四刚刚过去&#xff0c;我又想起了我在去年春招时面试了50余家&#xff0c;加上暑期实习面试了20余家&#xff0c;加起来也面试了70余场的面试场景了。 基本把国内有名的互联网公司都面了一遍&#xff0c;不敢说自己的面试经验很丰富&#xff0c;但也是不差的。 …

【JAVAEE】认识网络及网络通信

目录 1.网络发展史 1.1独立模式 1.2网络互连 1.2.1局域网 1.2.2广域网 2.网络通信基础 2.1IP地址 2.2端口号 2.3协议 2.4五元组 2.5协议分层 2.5.1什么是协议分层 2.5.2协议分层的作用 2.5.3TCP/IP五层&#xff08;或四层&#xff09;模型 3.封装和分用 1.网络发…

调用百度API自动生成春联

目录 1、作者介绍2、百度智能春联介绍录2.1 功能介绍2.2 技术特色 3、智能春联API接口介绍3.1 请求参数3.2 返回参数 4. 操作流程5. 代码实现 1、作者介绍 范宇帅&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;多机器人协…

〖C++11〗线程库详解

「前言」文章是关于C11线程库相关的 「归属专栏」C嘎嘎 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 请不要把陌生人的些许善意&#xff0c; 视为珍稀的瑰宝&#xff0c; 却把身边亲近人的全部付出&#xff0c; 当做天经地义的事情&am…

比赛记录:Codeforces Round 874 (Div. 3) A~G

传送门:CF 前题提要:赛时A出了5道题,并且都是一遍过的,F题也已经找到了解决方法,但是没时间完成了.以为应该能上分,但是没想到赛后E题被hack掉了…绝了.然后打完这场 d i v 3 div3 div3后立马阳了,加上一大堆烦心事(包括但不限于各类考试).就导致现在才写出这篇题解. A题:A. …

移动机器人 | 火星探矿机器人

01、需求分析 “火星探矿机器人”旨在要开发若干个自主机器人&#xff0c;将其送到火星上去搜寻和采集火星上的矿产资源。 火星环境对于开发者和自主机器人而言事先不可知&#xff0c;但是可以想象火星表面会有多样化的地形情况&#xff0c;如河流、巨石、凹坑等&#xff0c;机…

公司从字节招来一个28K的测试工程师,让我见识到了什么才是真正的测试天花板

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

队列——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;又好久不见啦&#xff0c;最近有点摆烂&#xff0c;甚是惭愧&#xff01;&#xff01;&#xff01;&#xff01;今天&#xff0c;小雅兰的内容是队列&#xff0c;下面&#xff0c;让我们进入队列的世界吧&#xff01;&#xff01;&#xff0…

Trigger +Pipeline 完整实战案例

2.4.1 案例环境说明 示例项目&#xff1a;http://code.icloud2native.com/root/spring-boot-helloWorld.git 触发机制: 用户推送代码至项目仓库由Push Hook 自东触发pipeline的流水线的执行 2.4.2 项目实现 1、在k8s上部署一个gitlab&#xff0c;前面上节已经完成。 2、运…

海睿思分享 | 类chatgpt模型在信息抽取领域的应用

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指能够处理海量数据、拥有百亿级参数的深度学习模型&#xff0c;它已成为⼈⼯智能领域中的新热点。2022 年 11 ⽉ 30 号 ChatGPT 发布&#xff0c;其卓越的性能表现给整个⾏业带来了巨⼤的冲击。⼈们不…