互联网常见架构接口压测性能分析及调优手段建议

news2024/11/18 22:34:14

目录

互联网常见架构接口压测性能分析及调优手段建议

1 接口名称: 获取列表

1.1 压测现象:单台tps700多,应用cpu高负载

  1.1.1 问题分析:

  1.1.2 改进措施:

  1.1.3 改进效果:

1.2 压测现象:数据库资源利用率高

  1.2.1 问题分析:

  1.2.2 改进措施:

  1.2.3 改进效果:

1.3 压测现象:1N15T ,tps4552;10N15T,tps9608

  1.3.1 问题分析:

  1.3.2 改进措施:

  1.3.3 改进效果:

2 接口名称: 信息查询接口

2.1 压测现象:单台tps2000多,应用cpu高,db的qps15000左右

  2.1.1 问题分析:

  2.1.2 改进措施:

  2.1.3 改进效果:

2.2 压测现象:数据库无压力,应用增加多台后tps不变

  2.2.1 问题分析:

  2.2.2 改进措施:

  2.2.3 改进效果:

3 接口名称: 获取详情

3.1 压测现象:单台应用tps2600,10台tomcat才3700

  3.1.1 问题分析:

  3.1.2 改进措施:

  3.1.3 改进效果:

3.2 压测现象:1N10T集群下nginx参数调优对tps提升效果明显

  3.2.1 问题分析:

  3.2.2 改进措施:

  3.2.3 改进效果:

3.1 压测现象:1N5T和1N10T的tps相差不大

  3.1.1 问题分析:

  3.1.2 改进措施:

  3.1.3 改进效果:

4 接口名称: 促销

4.1 压测现象:通过redis存取数据,tps才1000多,CPU 有压力

  4.1.1 问题分析:

  4.1.2 改进措施:

  4.1.3 改进效果:

4.1 压测现象:参数多时tps下降明显

  4.1.1 问题分析:

  4.1.2 改进措施:

  4.1.3 改进效果:

4.2 压测现象:1N3T tps1万多,在增大tomcat可能tps增长不会明显

  4.2.1 问题分析:

  4.2.2 改进措施:

  4.2.3 改进效果:

5 接口名称: 追踪接口

5.1 压测现象:1N10T的tps低于1N3T的tps

  5.1.1 问题分析:

  5.1.2 改进措施:

  5.1.3 改进效果:

6 接口名称: 回填接口

6.1 压测现象:tps不到500,db的qps3500

  6.1.1 问题分析:

  6.1.2 改进措施:

  6.1.3 改进效果:

7 接口名称: 券查询

7.1 压测现象:集群结果与单台应用结果相比不合理

  7.1.1 问题分析:

  7.1.2 改进措施:

  7.1.3 改进效果:

8 接口名称: 推荐

8.1 压测现象:nginx长短连接差异

  8.1.1 问题分析:

  8.1.2 改进措施:

  8.1.3 改进效果:

9 接口名称: 查询2

9.1 压测现象:18N20T的tps才6842

  9.1.1 问题分析:

  9.1.2 改进措施:

  9.1.3 改进效果:

总结:


互联网常见架构接口压测性能分析及调优手段建议

    常见的互联网架构中,一般都能看到spring+mybatis+mysql+redis搭配的身影,在我所服务的公司亦是如此。一般来说,应用内部的接口都是直接调用的,所谓的面向接口编程,应用间的调用直接调或者通过类似dubbo之类的服务框架来执行,数据格式往往采用json,即统一也方便各数据间做转换和取值,缓存一般使用redis或memcached,存储一些对象或json格式的字符串。对外提供的接口,一般都需要进行压力测试,以便估算其性能,并为后续的调优提供指导方向。

    以下接口便是在压测过程中出现的各种“奇怪现象”,所谓奇怪,指的是从表象上看与我们正常的逻辑思路不符,但其本质还是我们对压力下程序的表现出来的特征不熟悉,用惯用的知识结构试图去解释,这根本是行不通的。

    下文是我在一次全面压测过程后对数据进行的分析汇总,其中的现象是很多压测常见的,里面的分析过程及改进措施我认为有很大的参考意义。具体内容如下:(部分接口为了安全我省略了其名称,但不影响我们的分析,另外形如1N3T之类的表示的是1台nginx,3台tomcat,具体的tps数值只是为了说明优化前后的比照,没有实际意义)

1 接口名称: 获取列表

1.1 压测现象:单台tps700多,应用cpu高负载

  1.1.1 问题分析:

    旧框架,平均响应时间长,应用CPU高,程序内部有大量的bean到map到json之间的转换,修改数据库连接数后,tps没有提升。

  1.1.2 改进措施:

    重构系统,用mybatis替代之前的dao操作,减少bean-map-json之间的内部数据转换,减少程序内部的无用操作。

  1.1.3 改进效果:

    tps改进后能到3000左右,有较大提升,但压测时应用cpu几乎跑满,还有改善空间。

1.2 压测现象:数据库资源利用率高

  1.2.1 问题分析:

    单台应用,数据库资源cpu都能到50%,10台tomcat在1万并发下数据库cpu跑满,load值700多,但db的qps也不过11554,并不算多,因此怀疑是sql执行耗费了cpu,可能是某条sql没有按索引查找或者索引失效。

  1.2.2 改进措施:

    查看SQL文件发现如下sql:select count(1) from orders where order_status_id !=40 ,将其改为select order_id from orders 然后通过程序把order_status_id!=40的过滤掉。通过list.size()来获取。order_status_id即使加了索引,由于是!=比较,所以不会去按索引查找,导致cpu高

  1.2.3 改进效果:

    相同环境下(1台nginx,10台tomcat,1000并发),tps由3000变成3727,略有增长,但是db的cpu明显下降,变为30%,效果明显

1.3 压测现象:1N15T ,tps4552;10N15T,tps9608

  1.3.1 问题分析:

    后端都是15台tomcat,前端1台nginx时tps为4552,通过lvs挂10台nginx时为9608,增长不明显,其nginx和tomcat都压力不大,集群结果不合理,怀疑是nginx转发配置的问题;

  1.3.2 改进措施:

    未进一步改进:可能是需要调整nginx的参数,之前发现过nginx不同的配置对后端集群环境的tps影响很大

  1.3.3 改进效果:

2 接口名称: 信息查询接口

2.1 压测现象:单台tps2000多,应用cpu高,db的qps15000左右

  2.1.1 问题分析:

    旧框架,程序内部有很多Bo-map-json相互的转换

  2.1.2 改进措施:

    删除冗余代码、更换连接池包,使用mybatis

  2.1.3 改进效果:

    Tps由2000多增长为8000多,db的qps为9000左右,优化后压测应用的cpu占用高,几乎跑满。

2.2 压测现象:数据库无压力,应用增加多台后tps不变

  2.2.1 问题分析:

    1N1T和1N10T的tps一样,都为5000,增大并发时错误数增多,应用cpu耗费70%,db无压力,nginx单台通过ss –s 发现端口占满,即nginx到tomcat之间转发的连接端口time-wait状态6万多。Nginx存在瓶颈。

  2.2.2 改进措施:

    调优nginx参数,将短连接改为长连接

  2.2.3 改进效果:

    1N3T的tps能到17376,tomat的cpu压力84%,db的qps18000,cpu69%,应用的资源基本使用到量。

3 接口名称: 获取详情

3.1 压测现象:单台应用tps2600,10台tomcat才3700

  3.1.1 问题分析:

  增加应用服务器,tps增长不明显,且nginx、tomcat、db的负载都不高,说明服务器本身不是瓶颈,考虑是不是网络的问题,通过监控网卡包流量发现网络数据跑满,因为此接口会有大量数据的输出,因此瓶颈在网络上。另外,测试过程中发现redis有报错,redis服务器是虚机,可能服务能力有限。

  3.1.2 改进措施:

    开启tomcat的gzip压缩。

  3.1.3 改进效果:

    同等并发下(1台nginx,10台tomcat,1000并发),tps由3727增长到10022,增长了近3倍,效果显著。

3.2 压测现象:1N10T集群下nginx参数调优对tps提升效果明显

  3.2.1 问题分析:

    经过tomcat的启用gzip后,1N10T下tps为10022,需进一步提升。

  3.2.2 改进措施:

    优化nginx:

    l nginx日志关闭

    l nginx进程数量worker,由24改为16

    l nginx keepalive数量由256改为2048

  3.2.3 改进效果:

  Tps由10022提升为13270。

3.1 压测现象:1N5T和1N10T的tps相差不大

  3.1.1 问题分析:

    1N10T的tps为1万3千多,1N5T的tps为1万2千多,相差不大,应用的tomcat资源利用没满,cpu为65%,Db的QPS已经到2万多了,单台服务器db基本上到量了,因此再增加应用也没效果,只会导致响应的时间变长。

  3.1.2 改进措施:

    单台db已经无法改进了,要不提升服务器硬件,要不读写分离。

  3.1.3 改进效果:

4 接口名称: 促销

4.1 压测现象:通过redis存取数据,tps才1000多,CPU 有压力

  4.1.1 问题分析:

    此接口通过redis取数据,tps不高才1000多,但cpu占用了80%,说明程序内部有大量序列化反序列化的操作,可能是json序列化的问题。

  4.1.2 改进措施:

    将net.sf.json改成alibaba的fastjson。

  4.1.3 改进效果:

    同等并发条件下tps由1000多提升为5000多,提高了近5倍。

4.1 压测现象:参数多时tps下降明显

  4.1.1 问题分析:

    此接口根据参数从redis中获取数据,每个参数与redis交互一次,当一组参数时tps5133,五组参数时tps1169,多次交互影响了处理性能。

  4.1.2 改进措施:

    将从redis获取数据的get改为mget,减少交互次数。

  4.1.3 改进效果:

    五组参数时1N3T压测TPS9707,据此估算即使是单台tomcat,tps也能有三四千,性能比单次get的调用方式提升了3,4倍。

4.2 压测现象:1N3T tps1万多,在增大tomcat可能tps增长不会明显

  4.2.1 问题分析:

    此处说的是可能,因为nginx服务器的cpu虽然不高,但pps已经800多k,此时应该是nginx的服务器网络流量成为了瓶颈。(只是猜测)

  4.2.2 改进措施:

    可以增加多台nginx负载,前端加lvs

  4.2.3 改进效果:

5 接口名称: 追踪接口

5.1 压测现象:1N10T的tps低于1N3T的tps

  5.1.1 问题分析:

    1N3T在2000并发下tps为9849,此时db的qps为90000,CPU80%,将tomcat增到10台,5000并发下,tps为7813,db的qps为19000,cpu75%,load 1,说明压力增大情况下db的压力反而下来了,注意到nginx服务器的网卡流量达到885M,说明是压力过大情况下,网络满了,发生丢包,导致db端压力反而下来了。

  5.1.2 改进措施:

    注意压测情况下部分接口由于数据量传输较大,会出现网络瓶颈。

  5.1.3 改进效果:

6 接口名称: 回填接口

6.1 压测现象:tps不到500,db的qps3500

  6.1.1 问题分析:

    虽然缺少应用的cpu及db的cpu利用率数据,较低的tps应该是应用的瓶颈,且需要关注是不是db在处理查询的时候缓慢。

  6.1.2 改进措施:

    1.连接池由dbcp改为hikar;

    2.减少了日志打印输出

    3.sql优化,将部分条件过滤改为在java代码中执行

  6.1.3 改进效果:

  Tps由不到500增长为1300多。

7 接口名称: 券查询

7.1 压测现象:集群结果与单台应用结果相比不合理

  7.1.1 问题分析:

    查看是否存在瓶颈资源,可以看到5台tomcat集群下,tps为9952,但db的qps为5-6万,cpu利用率为37%,说明对数据库进行了大量的主键或索引查询,一般单台db的qps也就4万左右,再增加应用的集群数量,对tps也不会有太大影响。

  7.1.2 改进措施:

    可以考虑分库

  7.1.3 改进效果:

8 接口名称: 推荐

8.1 压测现象:nginx长短连接差异

  8.1.1 问题分析:

    18nginx,2tomcat时tps8100,此时应用服务器的端口数满, 一般来说,Nginx短连接在高并发下容易导致端口占满的问题。

  8.1.2 改进措施:

    将nginx改为长连接

  8.1.3 改进效果:

    tps增长为10733,TPS稳定,起伏减少,但是CPU耗尽。说明cpu打满了,此时如果还要优化就的进行代码调优了。

9 接口名称: 查询2

9.1 压测现象:18N20T的tps才6842

  9.1.1 问题分析:

    18台nginx,20台tomcat,tps才6842,此时应用cpu利用率85%,说明cpu存在瓶颈,但检查此接口并未做大计算量的工作,有可能是日志的级别问题,cpu在频繁的打日志。

  9.1.2 改进措施:

    将日志级别由debug级改为info级

  9.1.3 改进效果:

    同等环境tps由6842增长为23592.坑爹的生产环境debug日志级别。

总结:

感谢每一个认真阅读我文章的人!!!

我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

   Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

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

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

相关文章

SciencePub学术 | 计算机科学类重点SCIEEI征稿中

SciencePub学术 刊源推荐:计算机科学类重点SCIE&EI征稿中!信息如下,录满为止: 一、期刊概况: 计算机科学类重点SCIE&EI 【期刊简介】IF:3.0-3.5,JCR 2区,中科院4区; 【检…

使用R绘制气泡图、带有显著性标记的热力图、渐变曲线图

大家好,我是带我去滑雪! 一幅精美的科研绘图会有诸多益处,精美的图像可以更好地传达研究结果和数据分析的重要信息。通过使用清晰、直观和易于理解的图像,可以更好地向读者展示研究的发现,有助于读者理解和解释数据。还…

JAVA开发(记一次504 gateway timeout错误排查过程)

一、问题与背景: 最近在发布一个web项目,在测试环境都是可以的,发布到生产环境通过IP访问也是可以的,但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通,域名却不行&…

如何在矩池云上运行 AI 图像编辑工具 DragGAN

5 月,DragGAN 横空出世,在开源代码尚未公布前,就在Github上斩获近 20000 Star,彼时,页面上只有效果图和一句“Code will be released in June”,然而这也足够带给人们无限期待。 在6月末,在若干…

SpringBoot最多可以处理多少个请求?

SpringBoot最多可以处理多少个请求? SpringBoot夺命连环14问,1天刷完别人半个月的springboot面试内容,比啃书效果好多了!_哔哩哔哩_bilibili 最小线程数:最少的厨师的量,饭店人不多的时候的量。 最大线程数…

微信可以自动跟圈的软件有吗?

对于许多人而言,每日发朋友圈已成为必要的任务之一,如同上学时老师检查作业般。但发圈何尝不像是写作业一样呢?有许多小号需发几十上百条朋友圈,令人感到枯燥、浪费时间。再加上我们还有其他事务要处理,例如服装店老板…

让你不再疑惑ai绘画生成器有哪些

有一天,设计师小李接到了一份任务,要在短时间内完成一幅复杂的插画。小李感到非常苦恼。于是,他开始寻找一种新的解决方案。通过搜索和咨询同事,小李发现通过使用ai绘画工具可以提高快速绘制图画的速度.那么,你知道最新…

paddlespeech 声纹识别embedding向量提取

参考: https://aistudio.baidu.com/aistudio/projectdetail/4353348 https://github.com/PaddlePaddle/PaddleSpeech/blob/develop/demos/speaker_verification/README_cn.md 注意 1)安装paddlespeech,参考: https://blog.csdn.n…

儿童牙刷语音方案,低功耗语音芯片NV040C,支持UART指令

随着人们对生活品质的追求越来越高,家庭中的日常用品也开始注重便携性、功能性与智能化。牙刷作为家庭必备的清洁用品,同样也在走向智能化的方向。为此,市场上出现了一些支持语音指令的儿童牙刷语音方案,其中低功耗语音芯片NV040C…

TypeScript 中接口类型【Interfaces】的定义使用解读

导语: 什么是 类型接口? 在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement&#x…

从“裸辞”到“终于找到理想工作”,面试了37家公司,经过5个月的时间终于如愿以偿。

软件测试行业裸辞5个月,面试了37家公司,终于找到理想工作了... 在软件测试行业里工作已经有7年的时间了。然而,在今年初,我因为一些原因选择了离开原来的公司,成为了一名“裸辞族”。我并不后悔这个决定,因…

QT Creator上位机学习(一)基本类别及主体框架解析

系列文章目录 文章目录 系列文章目录前言基础认识多种项目3种基类文件管理编译 项目程序项目管理文件UI文件信号与槽主程序窗体头文件窗体源文件 前言 之前也学习制作过串口上位机和利用Qchart完成数据的曲线显示等等,但大多只是对网上的程序进行拼接,这…

15.RocketMQ中的负载均衡

1.3负载均衡 1.3.1什么是负载均衡 负载均衡(Load Balance)是一种技术解决方案。用来在多个资源(一般是服务器)中分配负载,达到最优化资源使用,避免单台服务器过载。 RocketMQ中的负载均衡主要可以分为生产者发送消息的负载均衡和消费者订阅消息的负载均衡…

记一次phpMyAdmin弱口令爆破事件应急响应

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 事件背景介绍02 流量分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中,安全部门在安全设备上观察到大量phpMyAdmin登录请求,现需根据流量情况进行…

leetcode887. 鸡蛋掉落(动态规划-java)

鸡蛋掉落 leetcode887. 鸡蛋掉落题目描述暴力递归 二分查找代码演示 动态规划代码演示 动态规划专题 leetcode887. 鸡蛋掉落 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/super-egg-drop 题目描述 给你 k 枚相同的鸡…

Python实现所有英雄皮肤图片采集,超高清

目录标题 前言环境使用:模块使用:代码基本四个步骤:代码展示尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 环境使用: Python 3.8 Pycharm 模块使用: requests —> 数据请求模块 需要安装 re 正则表达式 内置模块 不需要安装 os 文件操作模块 内置模块 不需…

记一次Weblogic控制台弱口令爆破事件应急响应

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 事件背景介绍02 流量分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中,安全部门在安全设备上观察到大量Weblogic控制台登录请求,现需根据流量情况…

Rancher集群搭建

前言 随着容器的普及和Kubernetes 的日渐成熟,企业内部运行多个Kubernetes 集群已变得颇为常见,然而部署kubernetes集群的方式也多样化,二进制部署、rancher、kubeadm、minikube等。然而本篇文章主要讲解的是如何使用rancher快速部署一个k8s集…

Linux:LAMP搭建(全源码包安装)

LAMP 就是 Linux Apache Mysql PHP/Python 目录 Linux安装 Apache安装 Mysql安装 安装PHP 安装PHP扩展包 编译安装PHP PHP 添加优化模块 测试网页协同工作 Linux安装 虚拟机安装 (1条消息) VMware:安装centos7_鲍海超-GNUBHCkalitarro的博客-CSD…

从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)

一、前言 doctest从字面意思上看,那就是文档测试。doctest是python里面自带的一个模块,它实际上是单元测试的一种。 官方解释:doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果 doctest测试…