当前位置: 首页 > news >正文

性能测试中TPS上不去的几种原因浅析

先来解释下什么叫TPS:

TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位。

关于性能测试的其他一些常见术语,可参考之前的博客:性能测试:常见术语浅析

 

下面就说说压测中为什么TPS上不去的原因:

1、网络带宽

在压力测试中,有时候要模拟大量的用户请求,如果单位时间内传递的数据包过大,超过了带宽的传输能力,那么就会造成网络资源竞争,间接导致服务端接收到的请求数达不到服务端的处理能力上限。

2、连接池

可用的连接数太少,造成请求等待。连接池一般分为服务器连接池(比如Tomcat)和数据库连接池(或者理解为最大允许连接数也行)。

(关于连接池的具体内容,可参考之前的博客:性能测试:连接池和线程)

3、垃圾回收机制

从常见的应用服务器来说,比如Tomcat,因为java的的堆栈内存是动态分配,具体的回收机制是基于算法,如果新生代的Eden和Survivor区频繁的进行Minor GC,老年代的full GC也回收较频繁,那么对TPS

也是有一定影响的,因为垃圾回收其本身就会占用一定的资源。

4、数据库配置

高并发情况下,如果请求数据需要写入数据库,且需要写入多个表的时候,如果数据库的最大连接数不够,或者写入数据的SQL没有索引没有绑定变量,抑或没有主从分离、读写分离等,

就会导致数据库事务处理过慢,影响到TPS。

5、通信连接机制

串行、并行、长连接、管道连接等,不同的连接情况,也间接的会对TPS造成影响。

(关于协议的连接,可参考之前的博客:HTTP协议进阶:连接管理)

6、硬件资源

包括CPU(配置、使用率等)、内存(占用率等)、磁盘(I/O、页交换等)。

7、压力机

比如jmeter,单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会间接影响TPS(这个时候就需要进行分布式压测来解决其单机负载的问题)。

8、压测脚本

还是以jemter举个例子,之前工作中同事遇到的,进行阶梯式加压测试,最大的模拟请求数超过了设置的线程数,导致线程不足。

提到这个原因,想表达意思是:有时候测试脚本参数配置等原因,也会影响测试结果。

9、业务逻辑

业务解耦度较低,较为复杂,整个事务处理线被拉长导致的问题。

10、系统架构

比如是否有缓存服务,缓存服务器配置,缓存命中率、缓存穿透以及缓存过期等,都会影响到测试结果。

 

PS:性能瓶颈分析不能单从局部分析,要综合起来,多维度分析问题原因。上面列出的几点,可能有描述不当或者遗漏的,仅供参考。。。

如果有不准确的,请评论指正,谢谢!

转载于:https://www.cnblogs.com/ryn3316/p/9404304.html

相关文章:

  • jmeter的脚本增强之参数化
  • 关于有时候导入maven项目时候报错(有红色叹号,类中导入的包提示the import java.util cannot be resolve,)...
  • 性能优化中CPU、内存、磁盘IO、网络性能的依赖
  • leetcode485 python3 88ms 最大连续1的个数
  • logstash常用插件解析
  • Websocket(1)pom引入、嵌入spring
  • Docker 操作记录
  • CentOS7安装GO
  • dll和lib的关系(转)
  • Quest 公司的Shareplex 与 GoldenGate比较
  • WPF程序 双击exe自动申请“以管理员方式运行”权限
  • 块设备
  • CCPC-Wannafly Camp #4(部分解题报告)
  • HDU 6370(并查集)
  • 面试题16:数值的整数次方
  • hexo+github搭建个人博客
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • git 常用命令
  • HTTP中的ETag在移动客户端的应用
  • iOS编译提示和导航提示
  • Markdown 语法简单说明
  • mongodb--安装和初步使用教程
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Webpack 4 学习01(基础配置)
  • XML已死 ?
  • 编写高质量JavaScript代码之并发
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从0到1:PostCSS 插件开发最佳实践
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊flink的TableFactory
  • 前端性能优化——回流与重绘
  • 前嗅ForeSpider教程:创建模板
  • 入手阿里云新服务器的部署NODE
  • 我是如何设计 Upload 上传组件的
  • 用Canvas画一棵二叉树
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • !!Dom4j 学习笔记
  • ###项目技术发展史
  • #git 撤消对文件的更改
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (1)Nginx简介和安装教程
  • (10)STL算法之搜索(二) 二分查找
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)fread与fwrite详解
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)一些感悟
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换