关于压力测试:RunnerGo可视化场景管理还原真实场景

在进行性能测试时,测试场景的正确配置至关重要。咱们须要先依据业务场景和需要设计正当的测试场景,而后应用相应的工具进行配置,以实现自动化的性能测试。 在JMeter中,用户须要组织本人的测试场景,或者在同一文件中保护多个测试场景。每个测试场景都必须独自设置各种元素,测试场景的执行也须要手动管制。 在RunnerGo中,测试场景的所有组件都能够在平台上应用GUI进行操作,这使得增加、排序和排列测试用例变得十分不便。您能够通过脚本主动执行测试,也能够在指定的工夫执行测试。接下来,我想聊聊如何在RunnerGo中配置测试场景。 * RunnerGo数据大屏新建场景在左侧导航栏点击场景治理—新建场景,建设待测场景。 引入或创立接口您能够抉择创立一个新接口或导入一个接口。增加界面后,它将以方框的模式显示在背景画布上。您能够单击“编辑界面”按钮对其进行编辑,如下图所示。 增加多个接口后能够连贯接口方块来配置场景,RunnerGo自上而下进行测试。 增加控制器期待控制器:在过程配置之间插入等待时间,最长60秒。条件控制器:判断变量是否满足某个条件,从而判断控制器下的接口是否工作。它能够通过从上一个接口提取的值、返回的某个值或其余值来判断。 场景调试点击场景右上角的“开始调试”按钮,能够调试场景中的所有接口(通过后为绿色,失败为红色,不执行的色彩放弃不变);场景调试实现后,点击界面中的“查看后果”按钮,即可查看场景中单个界面返回的后果; 场景设置:能够在场景设置中上载参数文件,也能够手动增加变量。参数化文件的第一行是变量名,用英文逗号分隔。“将具备固定值的变量增加到变量中。此处增加的文件和变量能够应用{{variable name}}在场景的接口中援用。”。 接口权重:在一个测试工作中,咱们设置了500并发。执行测试工作时,每个接口的并发数如图所示:新闻列表接口权重为100,拜访细节接口权重为70,评论新闻接口权重为10。那么拜访细节接口并发为:500✖️ 0.7=350,并发评论新闻界面:500✖️ 零点七✖️ 0.1=35。 接口模式:反对四种模式:默认模式、错误率模式、响应工夫模式和每秒响应次数模式。 错误率模式测试指标:场景中单个接口的错误率。性能:如果场景中的某个接口超过设置的错误率阈值,打算将主动进行;如果在达到最大并发操作数后错误率没有超过错误率阈值,则在稳固持续时间设置的持续时间内持续运行并完结打算。 响应工夫模式测试指标:依据场景中所有接口的响应工夫,将每个接口的响应速度与设置的阈值进行比拟。性能:如果其中一个接口达到了大于设置值的阈值,则并发数不会减少,并且打算将在运行稳固持续时间的设置持续时间后完结;如果在达到最大并发操作数后未达到设置的阈值,则打算将在继续运行稳固持续时间的设置持续时间后终止。 每秒答复模式测试指标:每秒发送和响应的接口数(RPS)。计算方法:RPS=接口申请总数*并发接口数/总响应工夫,近似等于:并发接口数/均匀响应工夫。性能:当RPS大于设置的阈值时,并发数将减少到最大并发数,当RPS小于阈值时,将依据设置逐步减少。

March 31, 2023 · 1 min · jiezi

关于压力测试:最近较火的RunnerGo-与Jmeter优劣势分析

最近有一款较火的测试产品RunnerGo,它是一个基于go语言研发的开源测试平台。在这里我想从性能测试方面、构造方面以及性能方面比照两款产品。 性能方面:Runner基于go语言研发,绝对于jmeter来说更轻量级。所以性能测试方面RunnerGo应该是优于jmeter的这里我做了个压测比照,实在比照一下:一条应用查看新闻的场景:六个接口,应用并发模式,20的并发,执行10分钟。 雷同的配置下进行压测jmeter聚合报告:**RunnerGo间接发送到邮箱的测试报告:** 因为计算形式不同这里只比照总申请数,汇总下来:RunnerGo总申请数:98640个,错误率:0jmeter总申请数:91219个,错误率:0比照咱们发现雷同配置下RunerGo收回了更多的申请,而成功率都是百分百,所以RunnerGo在性能测试方面的确是优于jmeter的。 性能方面:在用jmeter做性能测试时想看残缺一点的测试报告,想配置阶梯模式来压测,想配置不同的接口并发这些都须要装置插件并且影响机器性能,想做自动化测试还得放到jenkins,这些配置起来太繁琐。RunnerGo则比较简单:不须要扩大插件即可实时查看测试报告 内置多种压测模式 平台自带的继续集成和自动化测试配置 构造方面:jmeter的单机模式在个别的压力机配置下,会受限于jmeter本身的机制和硬件配置,最多能够反对几百至一千左右的模仿申请线程。想部署分布式集群测试会带来十分多的运维治理问题。同时,Master-Slave模式,还会给主节点带来很大的交互压力,部署大规模的分布式集群压测十分难做到。 RunnerGo自带分布式构造轻松反对大规模并发。综上所述RunnerGo在构造、性能、性能上都优于jmeter,并且适应互联网工具平台化趋势。 RunnerGo的装置:1、 如果测试公网接口,能够应用saas:https://saas.runnergo.com2、 如果应用开源版本人部署,能够参考:https://wiki.runnergo.cn/docs/42留神:如遇到本人部署后压测提醒“资源有余”的状况,是压力机配置有些低,倡议应用8C16G配置主机。 当然,RunnerGo也有一些须要改良的中央:RunnerGo目前只反对http协定的性能测试,不反对连贯数据库,合作性能也没有那么欠缺等等,这边也心愿他们能尽快迭代产品,让RunnerGo更弱小。最初附上官网和开源链接感兴趣的小伙伴能够关注一下~ 官网链接:https://www.runnergo.comGitHub地址:https://github.com/Runner-Go-Team/Gitee地址:https://gitee.com/Runner-Go-Team

March 17, 2023 · 1 min · jiezi

关于压力测试:性能测试插件太多影响测试全栈式测试平台RunnerGo全部搞定

在用jmeter做性能测试时想看残缺一点的测试报告,想配置阶梯模式来压测,想配置不同的接口并发这些都须要装置插件并且影响机器性能,想做自动化测试还得放到jenkins,这些配置起来太繁琐。明天给大家举荐一款全栈式测试平台:RunnerGo,内置各种测试工具解决这些痛点。 不须要扩大插件即可实时查看测试报告 RunnerGo反对实时查看服务器状态、测试报告、debug日志并且反对发送测试报告到指定邮箱,而jmeter默认不反对性能监控,只能是在GUI模式下,通过扩大监听器插件来实现,并且No-GUI模式下只能生成后果报告。 连贯卡片配置场景:可视化场景配置 对于业务流程简单,触发事件比拟多的我的项目个别要进行场景测试,并在此流程上进行性能测试。在这种我的项目中不同的触发程序、处理结果,还有不稳固的并发数,面对这样的需要在编写测试脚本时是一件又耗时又耗力的大工程。 RunnerGo在配置脚本时自研的可视化场景配置在应用时让人眼前一亮,比照jmeter的列表配置,这种可视化的场景配置配置起来简略高效。 RunnerGo配置办法:点开场景治理-导入接口-间接在背景画布上连贯接口即可配置好一条测试场景。在触发事件多的我的项目时能够增加条件控制器,期待控制器间接连贯接口即可。 无需控制器间接配置的接口权重配置碰到有不稳固的并发场景时,接口权重配置能够满足这一场景,接口权重可间接配置到接口卡片中,测试时每个接口的并发依照它的权重百分比计算后履行 。如下图所示:前置条件并发数为500。 随机值接口权重为100,首页接口权重为80,那么因为这两个接口上一级没有接口,所以,随机值接口的并发为500,而首页接口的并发为400;因为右侧注册正本接口的权重为80,那么取它上一级接口的最大并发数500为准,那么它的并发数为400,它的下一级登录接口(右侧),因为权重为50,所以登录接口的权重等于:400*0.5=200并发。 多种压测模式间接内置辞别扩大插件性能测试须要模仿理论生产中的各种状况。为了更好的还原实在业务场景,应用传统的压测工具须要先下载插件,而且配置起来十分繁琐,而在RunnerGo中,间接内置了并发模式、阶梯模式、错误率模式、响应工夫模式、每秒应答数模式等多种罕用压测模式,笼罩绝大多数压测场景,满足各种简单业务的须要。满足更多的场景,RunnerGo内置多种压测模式一键即可批改。 平台自带的继续集成和自动化测试配置应用jmeter配置好测试场景后想做自动化测试还得放到jenkins上做一个继续集成,RunnerGo内置了自动化测试性能,可配置用例:同时执行或程序执行,定时工作配置:可抉择指定工夫运行,运行频率,还可将测试报告发送到指定邮箱中不便随时查看。  RunnerGo的装置 1、如果测试公网接口,能够应用saas: https://saas.runnergo.com 2、如果应用开源版本人部署,能够参考: https://wiki.runnergo.cn/docs/42 留神:如遇到本人部署后压测提醒“资源有余”的状况,是压力机配置有些低,倡议应用8C16G配置主机。 这款性能测试平台的确帮忙我解决了在性能测试时的一些应用问题,另附官网和开源链接不便大家理解~ 官网链接: https://www.runnergo.com GitHub地址: https://github.com/Runner-Go-Team/ Gitee地址: https://gitee.com/Runner-Go-Team      

March 16, 2023 · 1 min · jiezi

关于压力测试:推荐一个好用的开源测试平台RunnerGo

作为一名工作多年的测试工程师始终心愿有一款能够颠覆目前测试工具的平台,相较于研发岗位有各种工具能够笼罩他们整个的工作流程,而测试工具比方:jmeter,它的性能更突出在性能测试方面,其余方面更依赖于各种插件或者其余工具。最近有通过同行举荐尝试了一款开源测试平台—RunnerGo,感觉它更像是所有测试工具的一个倒退方向:一款能够笼罩整个测试流程的测试平台,上面给大家介绍一下举荐它的起因,先附上RunnerGo的官网和开源地址。 官网链接:https://www.runnergo.com GitHub地址:https://github.com/Runner-Go-Team/ Gitee地址:https://gitee.com/Runner-Go-Team RunnerGo为什么是测试工具的倒退方向?开源:RunnerGo采纳了较为宽松的Apache-2.0 license开源协定,号召开发者一起为开源贡献力量。平台化:团队合作肯定是互联网工具的倒退方向,平台化能力更好的推动合作。全栈式:反对从接口调试-场景治理-性能测试-自动化测试。一个平台笼罩全测试周期。易上手:内置各种测试工具无需下载各类插件,上手就能测。 性能介绍:接口治理:RunnerGo反对环境治理、断言、变量等Api调试性能,反对从各类Api调试工具中导入。集体认为RunnerGo能够撑持的起Api调试的性能。 场景测试:RunnerGo独有的可视化场景流配置,能够间接从接口治理中引入接口,接口以卡片的形式展示在背景画布上,能够增加条件控制器,期待控制器,连贯这些接口卡片即可配置场景,看起来的确很直观,给个好评。 性能测试:RunnerGo性能测试方面十分厉害,基于go语言研发比jmeter还轻量,测试后果更精确。它还是分布式架构,反对大规模的测试场景真的不在话下。 自动化测试:RunnerGo目前反对接口自动化测试,反对定时工作,反对用例集。后续会反对UI自动化等性能。 相较于传统测试工具的劣势RunnerGo作为web平台能在线做到接口治理,脚本编辑,场景编辑,报告治理这是传统测试工具不具备的。 RunnerGo在做性能测试时反对实时查看服务器状态、测试报告、debug日志并且反对发送测试报告到指定邮箱,而jmeter默认不反对性能监控,只能是在GUI模式下,通过扩大监听器插件来实现,并且No-GUI模式下只能生成后果报告。 在应用jmeter时接口治理和性能测试个别是离开去做的,或者用其余Api调试工具去做接口治理(比方Apipost)而后再去jmeter中配置脚本,但其实性能测试应该是基于接口治理的根底上做的,RunnerGo能够间接从接口治理中援用调试好的接口,配置好一条场景,而后在此基础上进行持续性测试,自动化测试,这样在接口测试阶段就能够间接执行性能测试。 集体感觉RunnerGo的设计理念十分当先,作为一个刚刚公布的平台曾经有了将来测试工具的雏形,也心愿随着版本迭代RunnerGo的性能越来越欠缺。

March 13, 2023 · 1 min · jiezi

关于压力测试:优测压力测试教程

登录优测平台以团队购买资源o 压力测试通过VUM(Virtual User Minute) 计费。o 耗费VUM = 模仿用户数 * 压测时长进入压力测试工作台优测首页 -> 进入工作站 -> 产品/压力测试创立压测打算1、在左侧导航抉择压测打算2、依据业务类型,抉择压测打算类型(单接口、全链路、JMeter压测)第一步:批改压测打算名称点击打算名称后的批改图标,压测打算名称变成编辑模式,即可批改。批改之后,点击空白处实现批改。第二步:填写接口申请信息对于全链路压测打算,零碎会默认增加一个HTTP申请,可间接在右侧填写被测接口的相干信息。具体参数阐明详见以下表格:其余高级性能:• 前置处理器/后置处理器• 出参定义• 公共变量• 公共函数• 多接口混压第三步:调试/调试日志实现接口申请配置后,可点击调试按钮,确认接口响应信息是否合乎预期。通过调试日志查看校验后果,可依据查看接口的申请信息、响应信息和公共变量找到失败根因。注:如需重复查看本次调试日志,可点击调试日志按钮第四步:压力配置实现链路配置后,点击下一步,进入压力配置页面其余高级性能:• 梯度增压• 性能监控具体参数阐明详见以下表格: 第五步:执行预览实现压力配置,点击保留并执行,进入执行预览页面• 确认所填配置信息正确。点击批改按钮可从新进入编辑页面进行批改• 账户有足够余额发动本次测试。如余额有余,点击去购买按钮进行充值• 勾选批准《优测平台服务协定》 留神:由压测所引起与第三方的纠纷及造成的所有结果,使用者应自行承当全副法律责任。压测报告在执行预览页面,点击执行,即发动压力测试工作。 测试工作执行中• 随着压力测试的执行,概览报告会实时更新测试后果数据。• 点击“进行压测”按钮,可随时终止以后测试,查看已执行的局部报告。留神:进行测试之后会退还未应用的VUM。在线报告在压测工作完结后,会生成在线报告如下图所示具体参数阐明详见以下表格:报告各性能指标具体阐明可见压测报告解读 下载报告点击下载报告按钮,可抉择下载显示水印/不显示水印PDF报告注:如需自定义报告款式,请分割在线客服或者拨打热线以上内容来自优测官网,未经受权严禁转载。

January 18, 2023 · 1 min · jiezi

关于压力测试:DGIOT千万级ZETag云标签压力测试报告

ZETag云标签压力测试 [导读]:在软件运行时,设施一直减少,软件内信息量一直晋升,程序压力一直减少,程序的承受能力至关重要。 DGiot计划:利用ZETA AP影子设施模仿1万ZETA AP、千万ZETag云标签同时在应用程序中工作;其余计划:我的项目实际测试软件承受能力援用1 概述1.1 测试背景随着ZETA产业的倒退与业务的深入利用,设施治理、网络管理、应用服务都面临大规模设施接入挑战。ZETA设施接入服务必须可能反对高并发性 (如超过百万级的并发设施接入)、高速率 (如每秒超过十万事件)、高吞吐量 (如每100秒解决超过GB)。同时,利用事件发生率各不相同,须要接入服务有超强的解决能力,保障利用事件的失常解析。 1.2 测试简介压力测试是软件质量保证的一项根本行为,是每个重要软件测试工作的一部分。软件压力测试是指对系统一直施加压力的状况下,依据零碎各项指标的变动状况来判断:1、零碎可能存在的瓶颈;2、零碎负载能力;3、零碎失常运行状况下的运行效率。 图1-理论业务场景 本次压力测试通过模仿1万ZETA AP、千万ZETA TAG标签的在线运行,精准高效实现ZETA AP、ZETag的在线协定解析、解析数据实时入库、海量数据在线查问与展现等流程。同时,对实在物流业务场景进行形象,实现批次ZETag在不同线路上产生轨迹扭转,挪动过程中利用不同的ZETA AP实现定位。 ZETag在线运行过程中,每隔15分钟发送心跳包,被邻近的单个或者多个ZETA AP报送至服务端。服务端会依照策略抉择信号最好的上报数进行存库,并利用上报信号最好的AP对ZETag进行定位。 1.3 目标通过压力测试,判断以后应用环境状况下零碎的负载能力,为今后利用范畴扩充,用户量回升后,服务器扩容、降级等提供必要的技术撑持,及服务器布局等。 本次测试目标是为了验证基于dgiot连贯与设施治理平台的ZETA物流跟踪治理可能实现千万级ZETag云标签同时在线稳固运行、数据及时回传、失常入库、高效查库。 本次测试场景的压力与复杂度远高于实在场景,在保障ZETA物流跟踪以后业务能够失常发展的同时,也能够无效撑持ZETA相干业务利用的拓展与深入利用。 2 测试环境2.1 网络为了尽量避免网络传输给测试后果带来的影响,应该选取外部局域网作为压力测试的网络环境(然而咱们没有专门的局域网,只能用外网测试)。网络框图如下: 图2-网络结构示意图 2.2 腾讯云服务器平台服务器即连贯与设施治理平台服务器,是压力测试的次要对象。平台服务器为目前正式环境中运行的服务器,应用服务器配置不同,其压力测试后果也不统一。服务器配置如下: 2.3 应用服务器服务器配置如下: 2.4 测试机因为压力测试是对系统负载能力的测试,无奈通过真是的环境来进行获取相干指标,因而通过测试机与测试服务,模仿1万AP、千万ZETATAG与服务器高频数据交互,利用算法虚构实在业务场景下理论的操作来进行测试。 测试机部署虚构云设施服务,及进行压力测试的客户端机器,个别采纳高配置的机器来进行测试。在压力测试过程中,个别疏忽测试机对压力测试后果的影响。测试机配置(腾讯云服务器): 服务器类型腾讯云服务器 2.5 条件与限度为了尽量保障压力测试后果的真实性,在压力测试期间,做如下的条件限度:1、尽量在局域网内进行压力测试,防止因网络起因干扰测试后果与论断;2、数据库服务器除了解决测试利用零碎申请外,不进行其它简单利用申请;3、测试应用服务器不进行其它的失常业务解决,因而压力测试安顿在非工作日进行;4、压力测试后果疏忽测试机、应用服务器、网络等其它额定的开销,不作为零碎瓶颈的剖析对象。 2.6 测试场景启动测试机,导入已编写好的服务,设置线路条数、起始地位、发送频率、AP数量、TAG取值范畴、等参数信息,便能够启动模仿场景,进行AP、TAG与服务器的高频数据交互。 3测试工具3.1测试工具测试工具:虚构AP;监控工具:Grafana 3.2工具简介利用ZETAAP影子设施模仿1万ZETAAP、千万ZETATAG同时在应用程序中工作的环境,对应用程序进行负载测试。当应用程序在负载状态下运行时,Grafana会精确评测、监控并剖析零碎的性能和性能。ZETAAP影子设施应用TCP/IP协定,次要思维是应用虚构设施来模仿实在设施并发对系统施加压力。通过ZETAAP影子设施模仿接管ZETATAG标签上报数据,将上报数据上报至服务端。 4测试场景与指标ZETAAP、ZETATAG设施音讯收发是平台功能模块中实现数据网关性能,同时服务器须要进行简单运算的查问、计算。但也是零碎中根本的模块,操作量绝对较大,性能的要求较高,对服务的压力绝对较大。 ZETA物流跟踪业务场景图 ZETA设施运行模仿:ZETA AP:每10s被动连贯服务端,间断30min未连上期待2min再次连贯;连贯状态下1min一次心跳交互;间断三次未收到ACK,发动重连。ZETA TAG:每15分钟上报一次心跳包;心跳报文被不同AP接管上报后,服务端会比拟后保留首次收到TAG心跳后3s内RSSI最强上报的AP地位信息作为TAG的以后地位。 客户端场景模仿形容:运输、配送线路:本次场景模仿线路总计200条,线路能够配置。运输车辆:本次场景模仿运输车辆50000部,货车会模仿实在物流场景在既定线路上进行挪动,车上ZETag云标签随之挪动。ZETA AP:本次模仿10000台,每条线路上散布500台ZETA APZETag云标签数量:本次模仿在运ZETag云标签1000万个,ZZETag云标签随运输车辆挪动,每隔15分钟的心跳报文被相邻的2-3个ZETA AP接管。 服务端业务形容:1、每15分钟内实现千万在运ZETag云标签心跳数据包解析(加上冗余报文,每15分钟内解析心跳报文数量2000多万条);2、实现ZETag云标签心跳数据比拟与冗余数据过滤;3、实现解析出的海量TAG地位信息实时分类入库;4、反对ZETag云标签最新地位更新与轨迹查问;5、每分钟实现1万ZETA AP的心跳报文解析、存储;6、实现ZETA AP运行状态信息的接管与存储;7、反对ZETA AP运行状态信息查问。依据测试零碎中音讯的业务场景状况,选取以下指标作为场景压力测试状况判断根据:A、ZETA AP在线状况统计B、ZETA AP在线率C、在线ZETag云标签数量D、ZETA标签解析包数量E、1/5/15分钟CPU均匀负载F、内存使用量 5测试策略5.1测试筹备依照本测试计划及测试计划,筹备测试数据,实现服务部署,并在模仿环境中进行测试运行。 5.2压力测试压力测试分以下几种状况测试: 测试内容测试项阐明 A、ZETA AP在线状况统计统计同时在线的ZETAAP数量 B、ZETA AP在线率在线ZETAAP与模仿总量的比值 ...

October 17, 2022 · 1 min · jiezi

关于压力测试:docker搭建图片压测QPS3000服务器ftpnginx

docker搭建图片压测QPS3000+服务器(ftp+nginx)在针对图片算法服务进行压力测试时,须要高性能的图片服务器本人编写的图片利用性能不肯定能达到要求可能因为图片利用本身达不到压测要求,影响算法服务的压测数据筹备工作须要在服务器先装置好docker,性能后果看文章结尾 步骤参数我的项目keyvalue地址IP192.168.0.2ftp用户名FTP_USERNAMEftpuserftp明码FTP_PASSWORDabc@123宿主机保留目录FTP_PATH/var/ftpftp地址FTP_URLftp://192.168.0.2/图片申请地址PHOTO_URLhttp://192.168.0.2/ftpuser/**shell中设置变量(依据本人的理论参数去设置)export IP=192.168.0.2 # 服务器ipexport FTP_USERNAME=ftpuser # ftp账号export FTP_PASSWORD=abc@123 # ftp明码export FTP_PATH=/var/ftp # 图片上传根目录export FTP_DOCKER_NAME=ftp # ftp容器名称export NGINX_DOCKER_NAME=nginx # nginx容器名称装置ftp创立文件目录mkdir ${FTP_PATH}启动容器docker pull fauria/vsftpddocker run -d \ --name ${FTP_DOCKER_NAME} \ --restart=always \ -p 20:20 \ -p 21:21 \ -p 21100-21110:21100-21110 \ -v ${FTP_PATH}:/home/vsftpd \ -e FTP_USER=${FTP_USERNAME} \ -e FTP_PASS=${FTP_PASSWORD} \ -e PASV_ADDRESS=${IP} \ -e PASV_MIN_PORT=21100 \ -e PASV_MAX_PORT=21110 \ fauria/vsftpd装置nginx容器启动命令 docker pull nginx:latestdocker run -d \ --name ${NGINX_DOCKER_NAME} \ --restart=always \ -p 80:80 \ -v ${FTP_PATH}/${FTP_USERNAME}:/usr/share/nginx/html/${FTP_USERNAME} \ nginx:latest重要配置!(nginx)通过ftp上传的图片,拜访会报403无权限谬误进入nginx容器,关上/etc/nginx/nginx.conf文件 ...

July 26, 2022 · 1 min · jiezi

关于压力测试:Kafka消息迁移工具的压测与调优

原文由rihkddd发表于TesterHome社区,点击原文链接可与作者间接交换。压测背景邻近双十一大家都免不了要对本人的业务零碎进行压测。公司一个外围业务预计双十一会迎来数倍日常流量的业务顶峰,该零碎强依赖于 Kafka,Kafka 自身是分布式的零碎,扩容比拟不便。然而为了保障外围业务的稳定性和高可用,须要在机房故障的场景下外围业务疾速复原服务,因而 Kafka 须要跨机房热备机制。 个别状况的 Kafka 集群,都是在同一个 IDC 中的,跨 IDC 的热备在 Kafka 的应用场景叫做 Mirror,Kafka 内置的反对为 MirrorMaker,当初曾经进化到了第二版,下文简称为 MM2. 通过后期技术调研,根本确定了 MM2 的 Kafka 热备机制。为了确定这套计划在双十一的流量顶峰状况下,能满足音讯零碎热备的需要,须要提前做压测。 压测施行MM2的工作原理能够简略了解为:在目标端机房生产源端机房须要复制的音讯。因而MM2 的压测,实质上还是 Kafka 的压测。而侥幸的是 Kafka 作为高性能、宽泛应用的音讯队列,它自身就提供了 benchmark 工具,能够不便的应用内置的命令行进行压测。 根本的用法如下: ./bin/kafka-producer-perf-test.sh --topic test_perf --num-records 1000000 --record-size 15000 --throughput -1 --producer-props bootstrap.servers=10.xx.xx.1:9094,10.xx.xx.2:9094 acks=1几个重要的参数解释如下: acks 音讯确认模式,-1 示意须要确认所有正本都写入胜利,1 示意只需确认一个正本写入胜利,0 示意无需确认。--topic topic 名称,本例为 test_perf--num-records 总共须要发送的音讯数,本例为 1000000--record-size 每个记录的字节数,本例为 15000--throughput 每秒钟发送的记录数,本例为 -1,示意不做限度--producer-props bootstrap.servers=localhost:9092 发送端的配置信息,本例只指定了 kafka 的链接信息--producer-num-retries 一个音讯失败发送重试次数--request-timeouts-ms 一个音讯申请发送超时工夫音讯体的大小,咱们能够依据理论的业务场景结构适合的音讯大小,例如统计一批音讯的均匀大小: ./bin/kafka-console-consumer.sh --bootstrap-server 10.xx.xx.1:9094,10.xx.xx.2:9094 --topic sdsoms --max-messages=100 | wcacks 模式须要和理论生产环境保持一致即可。 ...

June 20, 2022 · 1 min · jiezi

关于压力测试:Jmeter-压测分析

原文由周小丽发表于TesterHome社区,点击原文链接能够和作者间接交换如果 jmeter 达不到预期的性能指标,可查看压测机器的性能,是否因为内存、网络、cpu 占用导致的瓶颈。 一、端口不够用压测的线程数过多时,或者线程没有及时开释,会导致 TCP/IP 连贯端口已达到最大限度,jmeter 会报错【报错信息】Non HTTP response code:java.net.BindException【起因剖析】windows 提供给 TCP/IP 连贯的端口号是 1024-5000,并且要四分钟左右循环回收,这就导致咱们短时间内频繁调用大量申请时,端口号被占满【解决方案】批改零碎的最大端口连接数 TCP 客户端和服务器连贯时,客户端必须调配一个动静端口,默认状况下这个动静端口的调配范畴为 1024-5000 ,也就是说默认状况下,客户端最多能够同时发动 3977 个 Socket 连贯。咱们能够批改如下注册表来调整这个动静端口的范畴[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]MaxUserPort = 5000 (Default = 5000, Max = 65534) 二、线程数【异常现象】大量申请呈现连贯失败,或者压测的错误率异样高,但服务器性能并没上去【起因剖析】线程数已达到瓶颈【解决方案】循环创立线程,勾选 keep-alive(个别默认是勾选的),可复用线程,即一个 http 申请解决完之后,另外一个 http 申请会从这个连贯走 三、内存不足【异常现象】jmeter 装置目录下产生大量很大的.hprof 文件【起因剖析】这种.hprof 文件的产生是内存透露引起的【解决办法】windows 环境下,批改 jmeter.bat:set HEAP=-Xms256m -Xmx256mset NEW=-XX:NewSize=128m -XX:MaxNewSize=128m改为:set HEAP=-Xms256m -Xmx1024mset NEW=-XX:NewSize=128m -XX:MaxNewSize=512mPS:heap 最多设置为物理内存的一半,默认设置为 512M.如果 heap 超过物理内存的一半,可能运行 jmeter 会慢,甚至呈现内存溢出,起因 java 比拟吃内存,占 CPU. 四、倡议1、定期清理 jmeter 生成的日志文件:jmeter.log 和 jmeter-server.log(装置目录下)2、压测线程数过大时,可采纳分布式压测,以命令行执行形式,别应用 GUI 形式压测 ...

March 9, 2022 · 1 min · jiezi

关于压力测试:如何做健康码的性能压测

简介:随着无线设施的遍及和 5G 的鼎力建设,越来越多的线上零碎、小程序成为了人们生存中必不可少的工具。对于这些工具,都会面对一个问题:零碎能接受多少用户同时拜访,面对突发的流量洪峰,是否保证系统无故障稳固运行?本文将解答这个问题并进行讲解。 作者:拂衣、风波 为什么要做压测随着无线设施的遍及和 5G 的鼎力建设,越来越多的线上零碎、小程序成为了人们生存中必不可少的工具。对于这些工具,都会面对一个问题:零碎能接受多少用户同时拜访,面对突发的流量洪峰,是否保证系统无故障稳固运行? 为了答复这个问题,就须要在零碎上线前做多轮压力测试,提前模拟出简单的, 高仿真的线上流量来验证整体零碎的高可用性, 这也是施行零碎高可用计划的关键环节。另外,通过不同阶段的压测,也实现对系统的容量布局、瓶颈探测,对系统整体能力进行验收,确保在突发的流量洪峰降临前,零碎的确可能接受即将来临的实在线上压力。 从某种意义上来说,压测是零碎稳定性的验证者。 如何施行一次精确的性能压测 筹备压测环境压测的执行环境是一个陈词滥调的话题,如果间接在生产环境执行压测,会有2个问题: 会影响线上业务,对失常拜访零碎的用户造成影响会净化线上数据,将压测数据写入线上数据库 为了解决这 2 个问题,个别业内采纳如下几种计划: 以上计划各有优缺点,实用场景也不尽相同,能够依据本人我的项目所处的阶段灵便抉择计划。 构建压测脚本业内罕用的压测工具包含 JMeter、Gatling、Locust、k6、Tsung、阿里云 PTS 等。这些工具无一例外,都须要将压测业务的 API,编排为一个压测脚本。 这一步工作的重点在确认压测的 API,不要有脱漏,且 API 编排的程序要合乎用户的操作逻辑。对于衰弱码业务的压测来说,如果脚本中脱漏了登录鉴权 API,那前面的刷新衰弱码、查看核酸报告等 API 都会在权限校验这步就报错,不会执行失常的业务逻辑,也就无奈模仿实在的业务场景。 以上压测工具编排脚本都有 2 个形式: 手动输出脚本,这须要脚本的编写人员对业务十分相熟,保障不会脱漏API。 主动录制脚本,上述开源压测工具都提供了录制申请的代理性能,开启并配置代理后,只有在页面上模仿用户的操作和点击行为,即可主动录制申请,并生成压测脚本。同时 PTS 还提供了 Chrome 录制插件[1],免代理配置,能够一键生成 JMeter 和 PTS 压测脚本。晋升了脚本编写的效率,也能保障不脱漏 API。 为了防止简单脚本中脱漏 API 的危险,举荐应用录制性能生成脚本。 确认压力模型这一步是在配置压测中模仿的压力峰值、不同 API 的压力散布比例以及压力值递增模型。压力值指的是模仿并发用户数,或每秒发送的申请数。 施压模式 在设置之前,须要确认施压模式,业内次要有 2 种施压模式: 虚构用户(VU)模式,能够了解为一个线程模仿一个实在用户,压测时线程始终循环执行,模仿用户不停地发送申请。 吞吐量模式,即每秒申请数(QPS),能够间接掂量服务端的吞吐量。 在我的项目验收阶段,很重要的一个指标就是零碎的吞吐量,即可反对的QPS。对于这种压测场景,更举荐应用吞吐量模式,能够直观的看到施压机每秒收回的申请数,并和服务端的吞吐量间接对应起来。 各 API 压力散布比例 确认了施压模式后,须要配置不同 API 的压力散布比例。比方衰弱码业务,100% 的用户会调用登录 AP 和获取衰弱码 API,但前面并不是所有用户都会调用查问核酸报告 API、查看推送信息等 API。所以每个 API 的精确压力散布比例,也是一次胜利压测中不可获取的因素。 ...

February 17, 2022 · 2 min · jiezi

关于压力测试:内含福利得物B站技术大佬分享系统稳定性保障干货邀您共赴上海交流

October 25, 2021 · 0 min · jiezi

关于压力测试:企业云迁移暗藏风险1人如何扛起性能测试大旗

小编理解到某家大型社交电商公司在2020年底实现了云迁徙的动作,有幸与他们的性能测试负责人张哥(化名)进行了深刻交换,为大家带回了一线情报。 1次云迁徙,每年能够节俭500万的硬件老本投入,做么? 先别急着答复,迁徙的老本、新平台的可靠性、过程的安全性些都是须要三思而行的。企业能够使用云计算技术推动业务翻新,实现麻利、灵便治理,升高IT老本,以进步企业在新常态下的倒退能源和竞争力。企业上云不再是新事物,但随着本身业务倒退以及云计算服务产品的一直变动,为了以更低成本取得更好的服务,越来越多的企业须要面对云平台之间的迁徙挑战。 该如何平安高效地进行云迁徙呢? 小编理解到某家大型社交电商公司在2020年底实现了云迁徙的动作,有幸与他们的性能测试负责人张哥(化名)进行了深刻交换,为大家带回了一线情报。出于信息爱护,以下咱们简称该电商公司为A。 敲定迁徙计划,功能测试验证2020年底,A公司做出了一项重大决策,要将公司业务从阿里云平台迁徙至华为云平台。公司现有业务蕴含上百个利用以及数十PT的数据都要进行迁徙,如何平安高效地实现迁徙成了大家最关怀的问题。若迁徙之后业务在云上无奈失常发展,那损失将不可估量,所以首先要做的就是敲定迁徙计划。为了更好地测验迁徙计划的可行性,测试一次必定是不够的,更不可能间接上生产环境进行测试。A公司测试团队先在华为云上搭建了一套最小单元的测试环境,用来测试不同计划的可行性以及实现华为云的中间件和阿里云中间件的比照验证。 先迁服务再迁数据的计划行不行?波及跨云功能测试,测试团队将数据库、redis缓存这些保留在阿里云上,将应用服务先迁徙至华为云。业务上须要跨云调用,因为两个云端拜访时延较大,响应工夫是失常的三倍以上。后果不言而喻,先迁服务再迁数据计划是不可行的。 所以最终采纳停机全量迁徙的计划。测试团队将所有服务、测试环境的数据同步下来,开始进行整个业务流程的功能测试。测试笼罩了像商品能不能新建流动,能不能失常下单,下完单后订单、资金、客服售后等全场景的流程是否跑通。业务流程失常跑通,性能实现上没有问题,那么接下来要做的就是零碎性能测试,验证零碎能不能达到高可用性,高稳定性及预期的性能指标。 筛选最优性能测试计划“咱们过后得出的论断是,用跟阿里云同一套利用代码和同一套数据来做压测,不便做数据比照,失去的性能测试后果也是最精确的。”正式发展性能测试前,测试团队针对多种测试计划开展了具体探讨。在这里遇到整个我的项目中最为外围的问题——如何解决压测数据?咱们来看看在过后次要探讨的3种计划有何区别。 计划一:将阿里云的业务与数据1:1搬迁至华为云,在生产环境间接利用现有数据进行性能压测,实现后只对压测过程产生的测试数据数据进行清理解决。 计划二:同样是将阿里云的业务与数据1:1搬迁至华为云,在生产环境间接利用现有数据进行压测, 不同的是压测数据的清理更加简略粗犷,将数据层的数据库,文件,缓存,消息中间件等全副清理掉,从新全量同步一份。 计划三:第一步仍旧是将阿里云的业务与数据1:1搬迁至华为云,而后引入生产环境全链路压测技术,对压测数据做标识,压测过程中对压测数据做隔离,达到压测数据不净化业务数据的成果。 计划被提出和探讨,必然是有其对应的劣势和劣势,项目组在做决定前,也做了屡次比照和论证。先看计划一。这个计划的挑战点是复杂度极高,并且很容易对正式数据产生净化,具体有如下几点: 压测波及数据表很多,很容易漏清理或者错清理,清理脚本的调试和清理后的验证也是一大工作量;除了数据表里的压测数据,音讯队列,缓存也会有压测数据,都给清理带来了极大的复杂度;对于主键自增型的表还会影响前期增量数据的同步;即便革除了压测数据,报表类利用仍会受到压测数据烦扰,除非对报表类利用做些硬革新。 再来看计划二。这个计划尽管也可行,然而这外面有两个问题,一是二次同步后没通过测试依然存在危险,还是须要再进行次回归测试;二是数据迁徙周期比拟长,要实现数PT数据、文件迁徙、缓存迁徙预热等动作,动辄几周。这期间须要同时租用两边云环境的1:1机器,硬件老本投入是笔不小的开销,此外数据迁徙须要各个业务线配合,二次迁徙造成的人力资源的反复投入与节约不容忽视。 最初咱们来看看计划三。生产环境全链路压测技术的引入使得迁徙新云环境性能测试这件事件变得很简略了。在压测前将所有业务的调用链路梳理进去,不必更改业务代码,利用数列科技的探针agent进行生产环境数据隔离,就能放心大胆地在生产环境去做压测,不用放心数据净化问题。 数列的ForceCop生产压测数据隔离能力,当初反对数百款中间件,也包含云原生的中间件,可能让生产环境压测数据流入提前配置好的影子缓存,影子音讯队列,影子库表里,不必放心影响业务数据。配合流量施压平台,压测控制台,可能在生产环境模拟海量用户进行操作,跑所有业务调用链路,测试后果天然实在牢靠。通过综合考量,最终选定计划三进行性能测试,老本投入起码也最为平安。 1集体的生产环境全链路压测实际基于以上计划的探讨,兼顾A公司人员配置,最终项目组决定,实现性能压测这个光彩的工作就交给了性能测试工程师张哥。 影响着200万商家生意和1500万用户体验的大工程,之前也没有可复制的教训,1集体如何扛起这支大旗?有遇到什么特地辣手的问题吗?在聊到这些问题时,张哥脸色轻松。 第一步就是制订正当的压测指标,为保障业务的顺利开展,华为云的性能起码要与阿里云并驾齐驱。为此张哥以2020年的大促性能指标为基准,将流量缓缓递增来做压测。参考之前做过的全链路压测性能体现数据,在等同流量条件下比照阿里云和华为云的响应工夫,以此为根据去找寻网关、连接池、带宽、数据库等一些能够优化的中央。 1集体必定无奈实现所有的工作,那最辣手的就是内部人员合作的问题。为了不便配合全链路压测后果及时进行性能优化调整,张哥特意将性能压测工夫定在技术团队发版后的1-2个小时。这时大部分的技术人员都在,能够及时配合起来解决相干问题进行性能优化。 测试工作在张哥的调配下按计划进行,耗时十多天,实现了几轮生产环境全链路压测后,的确发现了不少的问题。作为电商企业,高并发是业务的突出个性,加上A公司对Redis的依赖比拟重,很多Redis接口都是循环调用的,所以对Redis连接数的要求就比拟高。测试到一半的时候,忽然呈现Redis连贯上不去的景象,通过排查发现是华为云的Redis的最大连接数配置有问题,无奈满足其应用场景。 除此之外最让人印象粗浅的就是华为云网关负载平衡问题,测试结果显示为曲线。华为云上有3套主ELB和8个子ELB,可是压力永远只会在第1个ELB上,这个ELB打满了才会到第二个ELB上,单台服务器cpu 65%其余服务器15%,负载重大不平衡。 这俩典型的配置和环境问题如果不通过全链路压测是很难找进去的。A公司技术团队联结华为云的驻场工作人员一起依据压测后果进行调试整改,最终胜利实现所有性能优化。 通过后面的测试验证之后,就能够放心大胆地发展正式云迁徙了。因为后期准备充分,主体迁徙理论耗时仅2天,上线后业务失常发展,0性能故障产生。 企业云迁徙的趋势不可逆转,现今企业须要思考的不仅仅是要不要进行云迁徙,还要思考如何平安地进行云迁徙。我想生产环境全链路压测技术曾经给出了本人的答案。 如果对全链路压测技术比拟感兴趣的,能够加【小树】企业微信,邀您进群交换;如果对文中提到的压测平台感兴趣也能够私聊小树申请产品收费试用哦~

June 15, 2021 · 1 min · jiezi

细说双Buffer缓冲池

前言缓冲机制是对数据持久化的延迟,减少不必要的IO,提高数据落盘的效率。本文将会详细探讨拥有双Buffer的缓冲池(下文统称TwinsBufferPool)是如何实现的,读者可以依此推广,得到N-Buffer的实现原理。在此篇文章中,缓冲区(Buffer)和缓冲池(BufferPool)是两个重要的概念,很明显,两者构成了一个包含与被包含的关系,一个缓冲池内可以有一个或者多个缓冲区协同工作,缓冲池中的所有缓冲区被组织成了一个环形队列,一前一后的两个缓冲区可以互相替换角色。当然,在整个过程中,还会有其他辅助工具的出现,在下文都会逐一阐述。一、设计要点1、可扩展性。毫无疑问,可扩展性是对一个设计良好的软件的一项基本要求,而一个软件的可扩展的地方通常是有很多处的,这在某种程度上会依赖于编程者的经验,如果仅仅局限于产品需求,可能会严重限制了软件的可扩展性。缓冲池是一种相对通用的中间件,扩展点相对比较多,比如:缓冲区数量可指定,线程安全与否,缓冲区阈值调配等等。2、易用性。设计出来的中间件应该是对用户友好的,使用过程中不会有繁琐的配置,奇形怪状的API,更不能有诸多不必要的Dependencies,如果能做到代码无侵入性,那就非常完美了。基于这个要求,TwinsBufferPool做成了一个Spring Boot Starter的形式,加入到项目里的dependencies中即可开启使用。3、稳定性。这就是衡量一个中间件好坏的重要KPI之一,从外观上看,同样是一艘船,破了一个洞和完好无缺将会是一个致命的区别,用户期望自己搭上了一艘完整的船,以便能航行万里而无忧。4、高效性。说到稳定性,那就不得不说高效了,如果能帮助用户又好又快的解决问题,无疑是最完美的结果。关于TwinsBufferPool的稳定性和高效性两个指标,会在文中附上jemeter的压测结果,并加以说明。二、设计方案这一小节将会给出TwinsBufferPool完整的设计方案,我们先从配置说起。每个参数都会提供默认值,所以不做任何配置也是允许的。如下是目前TwinsBufferPool能提供的配置参数(yml):buffer: capacity: 2000 threshold: 0.5 allow-duplicate: true pool: enable-temporary-storage: true buffer-time-in-seconds: 120下面附上参数说明表:以上参数比较浅显易懂,这里重点解释enable-temporary-storage和buffer-time-in-seconds这两个参数。根据参数说明,很明显可以感受到,这两个参数是为了预防突发情况,导致数据丢失。因为缓冲区都是基于内存的设计的,这就意味着缓冲的数据随时处于一种服务重启,或者服务宕机的高风险环境中,因此,才会有这两个参数的诞生。因为TwinsBufferPool良好的接口设计,对于以上两个参数的实现机制也是高度可扩展的。TwinsBufferPool默认的是基于Redis的实现,用户也可以用MongoDB,MySQL,FileSystem等方式实现。由此又会衍生出另外一个问题,由于各种异常情况,导致临时存储层遗留了一定量的数据,需要在下次启动的时候,恢复这一部分的数据。总而言之,数据都是通过flush动作最终持久化到磁盘上。因为大多数实际业务场景对于缓冲池的并发量是有一定要求的,所以默认就采用了线程安全的实现策略,受到JDK中ThreadPool的启发,缓冲池也具备了自身状态管理的机制。如下列出了缓冲池所有可能存在的状态,以及各个状态的流转。/** * 缓冲池暂未就绪 /private static final int ST_NOT_READY = 1;/* * 缓冲池初始化完毕,处于启动状态 /private static final int ST_STARTED = 2;/* * 如果安全关闭缓冲池,会立即进入此状态 /private static final int ST_SHUTTING_DOWN = 3;/* * 缓冲池已关闭 /private static final int ST_SHUTDOWN = 4;/* * 正在进行数据恢复 */private static final int ST_RECOVERING = 5;通过上述的一番分析,设计的方案也呼之欲出了,下面给出主要的接口设计与实现。通过以上的讲解,也不难理解BufferPool定义的接口。缓冲池的整个生命周期,以及内部的一些运作机制都得以体现。值得注意的是,在设计上,将缓冲池和存储层做了逻辑分离,使得扩展性进一步得到增强。存储相关的接口包含了一些简单的CURD,目前默认是用Redis作为临时存储层,MongoDB作为永久存储层,用户可以根据需要实现其他的存储方式。下图展现的是TwinsBufferPool的实现方式,DataBuffer是缓冲区,必须依赖的基础元素。因为设计的是环形队列,所以依赖了CycleQueue,这个环形队列的interface也是自定义的,在JDK中没有找到比较合适的实现。值得注意的是,BufferPool接口定义是灵活可扩展的,TwinsBufferPool只是提供了一种基于环形队列的实现方式,用户也可以自行设计,使用另外一种数据结构来支撑缓冲池的运作。三、压测报告使用的是个人的PC电脑,机器的配置如下:处理器:i5-7400 CPU 3.00GHZ 四核内存:8.00GB操作系统:Windows10 64位 基于x64的处理器运行环境如下:jdk 1.8.0_144SpringBoot_2.1.0,内置Tomcat9.0Redis_v4.0.1MongoDB_v3.4.7测试工具:jemeter_v5.1总共测试了四组参数,每组参数主要是针对最大容量,阈值和最大缓冲时间三个参数来做调整。第一组:buffer: capacity: 1000 threshold: 0.8 pool: buffer-time-in-seconds: 60第二组:buffer: capacity: 5000 threshold: 0.8 pool: buffer-time-in-seconds: 60第三组buffer: capacity: 5000 threshold: 0.8 pool: buffer-time-in-seconds: 300第四组buffer: capacity: 10000 threshold: 0.8 pool: buffer-time-in-seconds: 300总共采集了9个指标:CPU占用率,堆内存/M,线程数,错误率,吞吐量/sec,最长响应时间/ms,最短响应时间/ms,平均响应时间/ms,数据丢失量。限于篇幅,只展示4个指标:堆内存,数据丢失量,平均响应时间,吞吐量。总体来看,随着每秒并发量的增加,各项指标呈现了不太乐观的趋势,其中最不稳定的是第四组参数,波动较为明显,综合表现最佳的是第二组参数,其次是第三组。数据丢失量是一个比较让人关心的指标,从图中可以得知,在并发量达到4000的时候,开始有数据丢失的现象,而造成这一现象的原因并非是TwinsBufferPool实现代码的Bug,而是请求超时导致的“Connection refused”,因为每个Servlet运行容器都会有超时机制,如果排队请求时间过长,就是直接被拒绝了。因此,看数据丢失量和错误率曲线,这两者是一致的。如果设置成不超时,那么将是零丢失量,零错误率,所带来的代价就是平均响应时间会拉长。因为受限于个人的测试环境,整个测试过程显得不是很严谨,得出来的数据也并不是很完美,不过,我这里提供了一些优化调整的建议:1、硬件环境。正所谓“巧妇难为无米之炊”,如果提供的硬件性能本身就是有限的话,那么,在上面运行的软件也难以得到正常的发挥。2、软件架构。这个想象的空间很大,其中有一种方案我认为未来可以纳入到RoadMap中:多缓冲池的负载均衡。我们可以尝试在一个应用中启用多个缓冲池,通过调度算法,将缓冲数据均匀的分配给各个缓冲池,不至于出现只有一个缓冲池“疲于奔命”的状况,最起码系统的吞吐量会有所提升。3、其他中间件或者工具的辅助,比如加上消息中间件可以起到削峰的作用,各项指标也将会有所改善。4、参数调优。这里的参数指代的不仅仅是缓冲池的参数,还有包括最大连接数,最大线程数,超时时间等诸多外部参数。四、总结本文详细阐述了双Buffer缓冲池的设计原理,以及实现方式,并对TwinsBufferPool实施了压测,也对测试结果进行了一番分析。欢迎关注我的微信订阅号:技术汇。如果想查看完整的测试报告,可在订阅号内回复关键词:测试报告,即可获取到下载链接。如果想深入研究TwinsBufferPool源码的读者,可在订阅号内回复关键词:缓冲池。 ...

March 28, 2019 · 1 min · jiezi

后端相关技能(六):压力测试

预期学习目标压力测试的概念常见的压力测试工具实例相关文章后端相关技能(一):数据库后端相关技能(二):Vue框架后端相关技能(三):正则表达式后端相关技能(四):计算机网络后端相关技能(五):Node.js后端相关技能(六):压力测试

February 2, 2019 · 1 min · jiezi

一次性能优化:吞吐量从1提升到2500

性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。压测也是检验一个架构设计是否合理的一个重要方法。项目介绍这个项目是一个线下支付的交易系统,使用线下设备发起支付。项目使用SpringMVC+Dubbo的微服务开发模式,其中SpringMvc作为Web端部署在tomcat上对外提供rest服务,其他模块使用dubbo开发,SpringMVC调用dubbo服务完成业务功能。优化目的这一次的性能优化,目的是在不调整业务逻辑的情况下通过压力测试的方式测试下单时接口的性能能达到多少,如果有性能问题,就要在不修改业务逻辑的情况下通过优化各项参数的方式(包括JVM优化、数据库连接数和Dubbo连接数)来提升整体性能。压测前的准备压力测试策略采用循序渐进的方式,逐渐增加并发量的方式,先以1个并发开始,慢慢增加,当达到瓶颈的时候就进行参数调整和优化。建立压测分支压测优化过程中,可能随时需要调整配置参数,可能会对一些配置参数进行修改或者对公共代码进行优化。为了不让其他研发人员的开发受到干扰,在git上基于release分支建立了feature_stress分支,专门用来压测过程中,参数配置调优使用,不影响其他研发人员的开发。搭建压测环境为了不不影响研发和测试人员的工作,单独申请了三台4C32G的虚拟机进行压力测试,一台部署tomcat,一台部署dubbo服务,一台部署mysql。为什么只申请单机部署的方式压测呢?因为本次测试的目的是看单台服务器的性能情况,优化的目的是将单台服务器的性能最大化。准备测试脚本本次测试选用jmeter作为测试工具进行压力测试,由测试人员模拟线下支付的流程写好测试脚本。初步压测很保守的,从1个并发开始压测,测试结果让人非常的惊喜,压测开始几分钟后,就出现大量的连接失败,无法继续测试。出现大量的内存溢出的异常。没出现异常时的吞吐量达到了1req/s。同时,通过jconsole控制台监控tomcat,发现其线程数最高到了2万多个。问题分析这个异常是创建本地线程失败抛出的异常,为什么有这么大量的线程呢?不合常理呀!于是查看对应的代码,原来这是一个自定义的一个人日志Appender,在这个Appender里使用了线程池,这个Appender本来的目的是使用多线程提升日志性能,并且将所有的日志都收集到一个文件中。代码类似如下:log4j.properties中直接将新的Appender添加到了rootLogger下:初步优化通过以上代码和日志配置文件就能看出来,每次日志输出都会创建线程,这就是线程为什么越来越多,最后导致无法创建新的本地线程的原因。为了不影响现有的功能,将LogAppender类append方法中的线程池创建的部分变成了类的属性,并固定只用8个线程:提交代码重新部署压测环境,再进行压测,吞吐量马上就上来了,达到了1700req/s,][7]深入调优经过上面的优化之后,整体的性能还不是很高,经过jconsole监控发现,线程数还是很高,虽然没有2万那么多了,但还是有3000多的线程,这么多的线程根本无法发挥机器的性能,时间都浪费在线程切换上了,通过查看线程栈发现大量的线程都是dubbo连接的线程,为什么如此之多呢?查看dubbo的配置文件,consumer的链接数都设置成了1000,于是将所有dubbo的consumer连接数均改为了64。同时将log4j.properties中配置了控制台输出的都关闭了。最终的优化后的测试结果,最高达到了2600req/s。总结性能优化需要从几个方面考虑:CPU是否有瓶颈,本项目没有大量的计算,所以CPU没有瓶颈。IO是否是瓶颈,线程太多或者连接太多都是瓶颈,本项目中并发时创建了大量的线程,达到了服务器的最高可用的连接数,导致内存溢出了,创建太多的线程也会让CPU把时间都浪费在线程切换上了。生产环境不要使用控制台输出,因为控制台输出是同步的,输出太多会对性能有很大的影响。如果出现吞吐量小的情况可以输出线程栈,看看到底是block在哪里了,是调用服务时间长还是读写数据库时间长。———— / END / ————

December 4, 2018 · 1 min · jiezi