时间减少90%以上!分布式系统的性能优化实战

1背景

分布式批量系统指的是采用分布式数据库架构,主体功能由批量程序实现的系统。分布式系统批量程序的性能测试,除了和联机交易性能测试一样关注服务器资源使用率是否合理、是否存在性能异常外,在测试执行阶段需要关注是否因数据分布不均衡导致部分并发子程序执行时间过长,成为整体批量程序的“短板”,从而影响批量程序的整体时间。

下面我主要介绍一种分布式系统批量程序性能优化的思路,并结合实际测试效果说明。

2分布式系统分片和批量并发规则

被测系统数据库为分布式数据库,存储并处理某公司各个机构的业务数据,包括若干个数据库分片、500多个分片键(分布式表的一个主键字段,用来区分数据存放的分片),分片键值是由机构ID号(以下简称机构号)按照一定规则映射而来。每个分片包含若干分片键,某个分片键对应若干机构的数据。

批量程序执行时,根据系统相关配置表中的静态配置,500多个子程序并发分别处理对应分片键下的业务数据。各个子程序处理逻辑相同,所以当某些子程序待处理的数据量相对其他子程序过多时(即该分片键下机构数据明显多于其他分片键下数据),这些耗时长的子程序会拖慢整体程序的效率。

图1分片与分片键对应关系

3抢任务方式优化数据分布不均衡的批量程序

3.1由静态并发改造抢任务模式

根据系统按分片键静态并发的特点,当批量程序子程序间处理数据分布不均衡时,部分子程序执行时间过长,成为整体批量程序的“短板”,从而影响批量的整体时间。为解决上述问题,本系统采取了“抢任务”的动态并发优化方法。

图2抢任务改造前后批量程序逻辑对比

1)将待处理表中的所有数据,按照一定的维度(如机构号+该表的某个参数值)划分成若干个任务,单个任务就是某个机构下某参数值对应的数据。

2)在实际处理数据程序执行之前,添加一个生成任务程序,执行该程序就会在任务表中添加全部任务的记录,所有任务当前处于初始化状态。

3)生成任务程序执行后,自动调起数据处理程序,改造后的程序不再按照静态并发,而是去查询任务表中状态为初始化且数据量大(优先级高)的任务,任务结束时,处理状态改为已完成,子程序查找下一个未处理的任务,直到任务表没有状态为初始化的任务,所有子程序成功执行完成。

实际测试场景执行时采用1600万条数据对某批量程序(该程序处理的业务数据,各个分片键下的数据极不均衡,经分析适用于本优化方法)进行测试数据准备,按照优先级处理任务300个子程序动态并发执行,按当前维度共生成11万个任务,所有子程序均在33分钟内完成,无明显过长的子程序,总体执行时间32分21秒,系统资源和数据库资源利用率均正常。

3.2优化任务处理数据量

按前述优化的生成任务维度,有个别任务处理数据量仍然很大,如果不进行进一步拆分还是存在一定“短板”,且生成的任务过多,大量任务都是小数据量任务,处理数据程序频繁抢“小任务”并更新数据的效率较低。为解决上述问题,程序进行了第二次优化。

1)生成任务时增加限制任务处理数据量的参数,该参数作用是规定单个任务的最大数据处理数,当同一分片键维度的任务处理数据量未达到这个值时,将这几个任务合并为一个更大的任务,如果分片键发生了切换,则生成下一个任务。

2)对于原有维度拆分出来的大任务,通过增加维度的字段,使单个维度的处理数据量降低,这样一个维度包含的数据更小,同时也参照上述参数限定任务最大数据处理数。

上述优化主要目标即控制个别“大任务”的处理数据量,合并多数“小任务”,使任务总量变少,减少抢任务造成的时间成本,并且任务之间处理数据量更均衡。

按上述策略优化的生成任务程序和数据处理程序,并发数不变,仍然采用同样数据进行准备并执行测试,由于生成任务的规则变化,生成的任务量由原来的10万以上降低到1000以内,生成任务时间增为2分40秒,执行数据处理程序时间降低为12分33秒,生成任务和处理数据的总执行时间比第一次优化明显提升。下表是两次优化执行性能测试执行时间对比。

该批量程序按上述策略两次优化后,生产环境中处理时间由优化前的近4小时缩短到15分钟左右,时间减少90%以上,且系统资源运行平稳,无性能瓶颈。

4总结及展望

通过分布式系统的性能测试实践,我们根据系统特点在批量程序性能优化方面积累了一定经验。抢任务性能优化方式解决了批量程序不同分片键处理数据量不均衡导致的执行时间过长问题,在项目测试中取得了明显的优化效果。

未来我还将持续探索分布式系统的批量测试技术和测试方法,加强系统分析与调优能力,为提升分布式批量系统效率及可靠性继续努力。

文末了:

可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。同时我邀请你进入我们的软件测试学习交流平台,大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,了解测试行业的最新趋势,助你快速进阶Python自动化测试/测试开发,稳住当前职位同时走向高薪之路。

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

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

相关文章

JsonUtility.ToJson 和UnityWebRequest 踩过的坑记录

项目场景: 需求:我在做网络接口链接,使用的unity自带的 UnityWebRequest ,数据传输使用的json,json和自定义数据转化使用的也是unity自带的JsonUtility。使用过程中发现两个bug。 1.安全验证失败。 报错为&#xff1a…

在CentOS中怎么安装和配置NginxWeb服务器

在CentOS中安装和配置Nginx Web服务器可以通过以下步骤完成: 1. 使用yum安装Nginx: sudo yum install nginx 2. 启动Nginx服务: sudo systemctl start nginx 3. 设置Nginx开机自启动: sudo systemctl enable nginx 4. 配置防火墙规…

PID算法原理分析及优化

今天为大家介绍一下经典控制算法之一的PID控制方法。PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。 在大学期间,参加的智能汽车竞赛中就使用到了PI…

如何安装和卸载SFP光模块

SFP光模块的安装和拆卸是简单直接的过程。然而,任何非标准操作都可能导致隐式损坏甚至永久故障。您需要参考及时更新的光模块的数据表或用户手册,以熟悉其特性和锁定机制。 准备工作 常见事项 拆卸和插入SFP光模块可能会缩短其使用寿命,因…

重新了解一下之前的單對象變化問題

單對象變化問題 聲明一個方法在頁面中監聽這個對象的改變 2年之前寫過一篇文章,有些誤導,重新寫一遍 聲明一個方法 不管是在哪裡,創建一個名為 single-object.jsx 的文件 export const singleObject (newObj, oldObj) > {return JSON.str…

美团门票度假java实习(66m)

1.介绍一下redisson分布式锁 2.redission分布式锁底层如何实现 3.基于setnx实现的分布式锁的缺点有哪些 4.基于redis如何实现可重入的分布式锁 5.项目的qps大概多少 6.如何自己实现一个限流算法中的滑动窗口 8.code:用两个队列实现一个栈,java语言 9.jvm…

jupyter | jupyter里执行shell命令

先说结论&#xff1a; 在 shell 命令前加 ! tar -zxvf sp.tgzFile "<ipython-input-2-3125352daeb6>", line 1tar -zxvf sp.tgz^ SyntaxError: invalid syntax 在 jupyter Code Cell中只能执行ls 、pwd 等简单命令。当需要执行tar 或者稍微负责命令时就报错了…

数据库被.[Goodmorningfriends@onionmail.org].faust勒索病毒加密,能恢复吗?

.faust勒索病毒有什么特点及危害&#xff1f; .faust勒索病毒是一种恶意软件&#xff0c;以其复杂的加密技术和勒索行为而闻名。这种病毒的主要目标是通过加密受害者的数据文件&#xff0c;然后勒索赎金以解密这些文件。它通常通过恶意附件、恶意链接或潜在的不安全下载源传播&…

在realsense D455相机上运行orb_slam3

配置orb_slam3的环境 参考https://blog.csdn.net/weixin_42990464/article/details/133019718?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171109916816777224423276%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request…

操作符详解(C语言)—第三期

逻辑操作符 逻辑操作符有哪些&#xff1a; && 逻辑与 || 逻辑或区分逻辑与和按位与 区分逻辑或和按位或 1&2----->0 1&&2---->1 1|2----->3 1||2---->1逻辑与和或的特点&#xff1a; 360笔试题 #include <stdio.h&…

蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接&#xff1a; 1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路说明&#xff1a; 首先&#xff0c;考虑DFS暴力解&#xff1a;对于蜗牛来说&#xff0c;它出发的起点可能是&#xff1a; 1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi&#xff0c; 那么他有三种方式走&…

JS08-DOM节点完整版

DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…

2024年阿里云2核4G服务器价格30元、165元和199元1年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

element-table 悬浮header

/* * table-sticky.js 混入函数 * 组件需要提供parent字段&#xff0c;指定表格的className&#xff08;字符串&#xff09; * 在页面局部组件使用此组件&#xff0c;如果局部组件有使用display为none,会导致header头显示不全&#xff0c;可使用v-if重新初始化组件 */const …

babel主要内容

定义 babel是一个编译工具 &#xff0c;用于把JSX等编译成浏览器可执行的javascript。 主要内容是几个包babel/parser 这个包主要是用于解析代码到AST树babel/types 这个包中有一堆API&#xff0c;用于手动创建ASTbabel/traverse 这个包主要是为了遍历AST树&#xff0c;结合具体…

Python计算机二级选择易错题(二)

选择题第07&#xff0c;05&#xff0c;01套 题目来源&#xff1a;python计算机二级真题&#xff08;选择题&#xff09; - 知乎 选择题第07套 选择题第05套 选择题第01套 ​​​​ s.index(x)或s.index(x,i,j)返回序列s从i开始到j位置中第一次出现元素x的位置 ​​​​​​

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据 1、时间&#xff1a;2001-2023年 2、范围&#xff1a;300个地级市&#xff08;包括直辖市&#xff09; 3、来源&#xff1a;历年中国铁道出版社出版的《全国铁路旅客列车时刻表》 4、用途&#xff1a;高铁开通可作…

Unity---Lua语言

Lua Binaries Download 13.2 逻辑热更新——Lua1-3_哔哩哔哩_bilibili nil表示空 只有false和nil为false&#xff0c;其他值都为true ..连接两个字符串

实景户外亲子公园剧本杀小程序开发搭建

实景户外亲子公园剧本杀小程序开发搭建需要以下步骤&#xff1a; 1. 确定需求和功能&#xff1a;根据客户需求和剧本杀游戏的特点&#xff0c;确定小程序需要实现的功能和界面设计。 2. 选择开发平台&#xff1a;选择适合小程序的开发平台&#xff0c;如微信小程序、支付宝小…

java 泛型(下)

本篇文章主要说明的是类型通配符、可变参数、可变参数的使用等。 在学习之前&#xff0c;希望能对泛型有个大概了解&#xff0c;可参考链接 java 泛型&#xff08;上&#xff09;-CSDN博客 也希望对泛型类、泛型接口、泛型方法有个大概的认识及使用&#xff0c;可参考链接 j…