性能测试篇——八股笔记

1 性能测试中,TPS 比较低,可能是哪些方面的问题?

  1. 压力机本身性能瓶颈

  2. 网络 IO 瓶颈

  3. 中间件(tomcat/nginx/mysql)连接数限制

  4. Java 线程的阻塞、等待

  5. 本系统资源的瓶颈(cpu、内存、磁盘、网络等)

  6. 其他外部系统响应时间过长,造成本系统的 time-wait

1. 压力机本身性能瓶颈

  • 问题描述:压力机(即用于发起性能测试的机器)本身的性能不足,无法生成足够的并发请求。
  • 可能原因
    • CPU、内存、磁盘或网络资源不足,导致压力机无法高效运行。
    • 压力机的并发线程数或连接数配置过低。
    • 压力机的网络带宽不足,无法发送足够的请求。
  • 解决方法
    • 检查压力机的资源使用情况(如 CPU、内存、磁盘 IO 等)。
    • 增加压力机的资源或使用更高性能的机器。
    • 优化压力机的配置,如增加并发线程数或连接数。

2. 网络 IO 瓶颈

  • 问题描述:网络带宽或延迟问题导致请求传输效率低下。
  • 可能原因
    • 网络带宽不足,无法支持高并发请求。
    • 网络延迟过高,导致请求响应时间变长。
    • 网络设备(如路由器、交换机)性能不足。
  • 解决方法
    • 检查网络带宽和延迟,确保满足测试需求。
    • 优化网络配置,如使用更高带宽的网络或减少网络跳数。
    • 检查网络设备的性能,必要时升级设备。

3. 中间件(Tomcat/Nginx/MySQL)连接数限制

  • 问题描述:中间件的连接数或线程数配置过低,导致无法处理高并发请求。
  • 可能原因
    • Tomcat/Nginx 的最大连接数或线程数配置过低。
    • MySQL 的最大连接数配置过低,导致数据库无法处理更多请求。
    • 中间件的资源(如 CPU、内存)不足,导致性能下降。
  • 解决方法
    • 检查并调整中间件的连接数或线程数配置。
    • 增加中间件的资源(如 CPU、内存)。
    • 优化中间件的性能,如启用连接池、缓存等。

4. Java 线程的阻塞、等待

  • 问题描述:Java 应用程序中的线程因阻塞或等待导致处理效率下降。
  • 可能原因
    • 线程池配置不合理,导致线程数不足或过多。
    • 锁竞争(如 synchronized 或 ReentrantLock)导致线程阻塞。
    • I/O 操作(如数据库查询、文件读写)耗时过长,导致线程等待。
  • 解决方法
    • 优化线程池配置,确保线程数合理。
    • 减少锁竞争,如使用无锁数据结构或优化锁粒度。
    • 优化 I/O 操作,如使用异步 I/O 或缓存。

5. 本系统资源的瓶颈(CPU、内存、磁盘、网络等)

  • 问题描述:被测系统的资源不足,导致性能下降。
  • 可能原因
    • CPU 使用率过高,导致处理能力不足。
    • 内存不足,导致频繁的垃圾回收或内存溢出。
    • 磁盘 IO 过高,导致读写效率下降。
    • 网络带宽或延迟问题,导致请求传输效率低下。
  • 解决方法
    • 监控系统资源使用情况,找出瓶颈。
    • 增加系统资源(如 CPU、内存、磁盘)。
    • 优化系统性能,如减少不必要的计算、优化数据库查询、使用缓存等。

6. 其他外部系统响应时间过长,造成本系统的 time-wait

  • 问题描述:被测系统依赖的外部系统响应时间过长,导致被测系统等待时间增加。
  • 可能原因
    • 外部系统(如第三方 API、数据库、消息队列)性能不足。
    • 外部系统的网络延迟过高。
    • 外部系统的并发处理能力不足。
  • 解决方法
    • 检查外部系统的性能,确保其能够满足需求。
    • 优化外部系统的性能,如增加资源或优化配置。
    • 减少对外部系统的依赖,如使用缓存或异步调用。

7. 其他可能原因

  • 问题描述:除了上述原因外,还可能存在其他问题导致 TPS 较低。
  • 可能原因
    • 代码逻辑复杂,导致处理时间过长。
    • 数据库索引缺失或查询语句未优化。
    • 缓存未充分利用,导致重复计算或查询。
    • 测试脚本设计不合理,导致请求分布不均匀。
  • 解决方法
    • 优化代码逻辑,减少不必要的计算。
    • 优化数据库查询,如添加索引、优化 SQL 语句。
    • 充分利用缓存,减少重复计算或查询。
    • 优化测试脚本,确保请求分布合理。

补充

1. 网络 IO 是什么?

  • 定义:网络 IO(Input/Output)是指通过网络进行数据的输入和输出操作。它涉及数据的发送和接收,通常通过网络协议(如 TCP/IP)实现。
  • 具体内容
    • 输入(Input):从网络接收数据,例如客户端向服务器发送请求,服务器接收请求数据。
    • 输出(Output):向网络发送数据,例如服务器向客户端返回响应数据。
  • 相关指标
    • 带宽:网络传输的最大数据量,通常以 Mbps(兆比特每秒)或 Gbps(千兆比特每秒)为单位。
    • 延迟:数据从发送端到接收端所需的时间,通常以毫秒(ms)为单位。
    • 吞吐量:单位时间内成功传输的数据量,通常以 TPS(每秒事务数)或 QPS(每秒查询数)为单位。
  • 常见问题
    • 网络带宽不足,导致数据传输速度慢。
    • 网络延迟过高,导致请求响应时间变长。
    • 网络设备(如路由器、交换机)性能不足,导致数据传输效率低。
  • 优化方法
    • 增加网络带宽。
    • 优化网络拓扑结构,减少网络跳数。
    • 使用高性能网络设备。

2. 中间件是什么?

  • 定义:中间件(Middleware)是位于操作系统和应用程序之间的软件层,用于简化应用程序的开发和管理,提供通用的服务和功能。
  • 作用
    • 连接不同的应用程序或系统,实现数据交换和通信。
    • 提供通用的服务,如消息传递、事务管理、负载均衡、缓存等。
  • 常见中间件
    • Web 服务器:如 Nginx、Apache,用于处理 HTTP 请求和响应。
    • 应用服务器:如 Tomcat、JBoss,用于运行 Java 应用程序。
    • 数据库中间件:如 MySQL Proxy、MyCat,用于优化数据库访问。
    • 消息队列:如 Kafka、RabbitMQ,用于异步消息传递。
    • 缓存中间件:如 Redis、Memcached,用于提高数据访问速度。
  • 常见问题
    • 中间件配置不合理,导致性能瓶颈。
    • 中间件资源(如 CPU、内存)不足,导致性能下降。
    • 中间件连接数或线程数限制,导致无法处理高并发请求。
  • 优化方法
    • 优化中间件配置,如增加连接数或线程数。
    • 增加中间件资源(如 CPU、内存)。
    • 使用更高性能的中间件。

3. 磁盘 IO 过高

  • 定义:磁盘 IO(Input/Output)是指磁盘的读写操作。磁盘 IO 过高意味着磁盘的读写操作频繁或数据量过大,导致磁盘性能成为系统瓶颈。
  • 具体内容
    • 输入(Input):从磁盘读取数据,例如读取文件或数据库查询。
    • 输出(Output):向磁盘写入数据,例如写入文件或数据库更新。
  • 相关指标
    • IOPS(Input/Output Operations Per Second):每秒的磁盘读写操作次数。
    • 吞吐量:单位时间内读写的数据量,通常以 MB/s 或 GB/s 为单位。
    • 延迟:磁盘读写操作的响应时间,通常以毫秒(ms)为单位。
  • 常见问题
    • 磁盘读写操作频繁,导致磁盘性能下降。
    • 磁盘带宽不足,导致数据传输速度慢。
    • 磁盘碎片化严重,导致读写效率低。
  • 优化方法
    • 使用更高性能的磁盘,如 SSD(固态硬盘)。
    • 优化磁盘读写操作,如减少不必要的读写或使用缓存。
    • 定期进行磁盘碎片整理。
    • 使用 RAID(磁盘阵列)技术提高磁盘性能和可靠性。

2,性能测试过程中如何对瓶颈进行分析?

性能瓶颈分析参考准则:排除法,从上至下、从局部到整体!

针对不同的瓶颈采用不同的分析方法,一般分为: 内存分析方法、处理器分析法、 磁盘 I/O分析方法、进程分析方法、网络分析方法等等。

内存分析方法:内存分析用于判断系统有无内存瓶颈,是否需要通过增加内存等手段 提高系统性能表现。

处理器分析法:通过处理器性能计数器的值体现服务器整体处理器利用率,判断是否 存在处理器瓶颈。

磁盘 I/O 分析方法:通过磁盘 I/O 性能计数器的值体现服务器整体磁盘 I/O 使用情 况,判断是否存在处理器瓶颈。

进程分析方法:通过进程性能指标数据,判断是否存在进程瓶颈。

网络分析方法:通过网络性能指标数据,判断是否存在网络瓶颈。

1. 内存分析方法

目标

判断系统是否存在内存瓶颈,是否需要通过增加内存或优化内存使用来提高性能。

分析步骤

  1. 监控内存使用情况
    • 使用工具(如 tophtopvmstatWindows 任务管理器)监控内存使用率。
    • 关注指标:总内存、已用内存、空闲内存、缓存、交换分区(Swap)使用情况。
  2. 检查内存泄漏
    • 如果内存使用率持续上升且不释放,可能存在内存泄漏。
    • 使用工具(如 ValgrindJava VisualVM)分析内存泄漏。
  3. 分析 Swap 使用情况
    • 如果 Swap 使用率过高,说明物理内存不足,系统正在使用磁盘作为虚拟内存,导致性能下降。
  4. 优化建议
    • 增加物理内存。
    • 优化应用程序内存使用,减少内存泄漏。
    • 调整 Swap 配置,避免过度使用。

2. 处理器分析法

目标

通过处理器性能计数器的值,判断是否存在处理器瓶颈。

分析步骤

  1. 监控 CPU 使用率
    • 使用工具(如 tophtopWindows 任务管理器)监控 CPU 使用率。
    • 关注指标:总 CPU 使用率、用户态 CPU 使用率、内核态 CPU 使用率、每个核心的使用率。
  2. 检查 CPU 瓶颈
    • 如果 CPU 使用率持续接近 100%,说明 CPU 是瓶颈。
    • 如果用户态 CPU 使用率过高,说明应用程序占用大量 CPU 资源。
    • 如果内核态 CPU 使用率过高,说明系统调用或内核操作占用大量 CPU 资源。
  3. 分析上下文切换
    • 使用工具(如 vmstatpidstat)监控上下文切换次数。
    • 如果上下文切换次数过高,说明线程或进程切换频繁,可能导致 CPU 资源浪费。
  4. 优化建议
    • 优化代码逻辑,减少 CPU 密集型操作。
    • 增加 CPU 核心数或升级 CPU。
    • 减少线程或进程切换,优化并发模型。

3. 磁盘 I/O 分析方法

目标

通过磁盘 I/O 性能计数器的值,判断是否存在磁盘 I/O 瓶颈。

分析步骤

  1. 监控磁盘 I/O 使用情况
    • 使用工具(如 iostatvmstatWindows 性能监视器)监控磁盘 I/O。
    • 关注指标:磁盘读写速率(MB/s)、IOPS(每秒读写操作数)、磁盘使用率、磁盘队列长度。
  2. 检查磁盘瓶颈
    • 如果磁盘使用率持续接近 100%,说明磁盘是瓶颈。
    • 如果磁盘队列长度过长,说明磁盘 I/O 请求积压,导致性能下降。
  3. 分析读写模式
    • 如果读操作过多,可能是缓存未充分利用。
    • 如果写操作过多,可能是日志或数据写入频繁。
  4. 优化建议
    • 使用更高性能的磁盘(如 SSD)。
    • 优化磁盘读写操作,减少不必要的 I/O。
    • 使用缓存技术(如 Redis、Memcached)减少磁盘访问。

4. 进程分析方法

目标

通过进程性能指标数据,判断是否存在进程瓶颈。

分析步骤

  1. 监控进程资源使用情况
    • 使用工具(如 tophtopWindows 任务管理器)监控进程的 CPU、内存、磁盘 I/O 使用情况。
  2. 分析进程状态
    • 如果进程状态为 D(不可中断睡眠),说明进程正在等待 I/O 操作。
    • 如果进程状态为 R(运行中),说明进程正在占用 CPU 资源。
  3. 检查进程优先级
    • 如果低优先级进程占用大量资源,可能导致高优先级进程无法及时执行。
  4. 优化建议
    • 优化进程逻辑,减少资源占用。
    • 调整进程优先级,确保关键任务优先执行。
    • 使用多进程或多线程模型,提高并发处理能力。

5. 网络分析方法

目标

通过网络性能指标数据,判断是否存在网络瓶颈。

分析步骤

  1. 监控网络使用情况
    • 使用工具(如 iftopnloadWindows 资源监视器)监控网络带宽、延迟、丢包率。
  2. 检查网络瓶颈
    • 如果网络带宽使用率接近上限,说明网络是瓶颈。
    • 如果网络延迟过高或丢包率过高,说明网络质量差。
  3. 分析网络连接数
    • 如果网络连接数过多,可能导致网络设备(如路由器、交换机)性能下降。
  4. 优化建议
    • 增加网络带宽。
    • 优化网络拓扑结构,减少网络跳数。
    • 使用负载均衡技术,分散网络流量。

3,性能测试中,一般都关注哪些指标?

TPS:每秒事务数,代表了性能的好坏,TPS 越高,性能越好

平均响应时间:请求的平均耗时,响应时间越短,性能越好

并发数:同时向服务端发起请求的虚拟用户数,在不同的工具里可以用多个进程/线 程来实现

错误率:失败的请求比例

吞吐量:网络上行和下行流量的总和,吞吐量是网络瓶颈定位的重要指标

4,应用服务器 cpu 高和数据库服务器 cpu 高的分析思路是什么?

1)应用服务器的 cpu 高,先要看 tps 和响应时间,如果 tps 比较高,我们认为是正常的 cpu消耗;如果 tps 比较低,那么往往某些代码过于消耗 cpu,可以考虑使用代 码剖析工具分析下

2)数据库服务器 cpu 高,往往是因为 sql 语句执行效率比较低,可以通过对数据库 慢查询是监控,结合执行计划进行分析,是否是相关表没有索引或索引未生效

1. 应用服务器 CPU 高的分析思路

分析步骤

  1. 检查 TPS 和响应时间

    • TPS 高:如果 TPS(每秒事务数)较高,且响应时间在合理范围内,说明 CPU 高是由于业务处理量大,属于正常现象。
    • TPS 低:如果 TPS 较低,且 CPU 使用率高,说明可能存在代码或配置问题,导致 CPU 资源浪费。
  2. 使用代码剖析工具分析

    • 使用工具(如 Java VisualVMJProfilerArthas)对应用程序进行性能剖析,找出 CPU 占用高的代码段。
    • 重点关注:
      • 是否存在死循环或递归调用。
      • 是否存在频繁的字符串操作、正则表达式匹配等 CPU 密集型操作。
      • 是否存在不合理的线程池配置或线程阻塞。
  3. 检查线程状态

    • 使用工具(如 jstackThread Dump)分析线程状态,查看是否存在大量线程处于运行状态(RUNNABLE),或者是否存在线程阻塞(BLOCKED、WAITING)。
  4. 优化建议

    • 优化代码逻辑,减少 CPU 密集型操作。
    • 使用缓存技术,减少重复计算。
    • 调整线程池配置,避免线程过多或过少。
    • 升级硬件资源(如增加 CPU 核心数)。

2. 数据库服务器 CPU 高的分析思路

分析步骤

  1. 检查慢查询

    • 使用数据库的慢查询日志(如 MySQL 的 slow_query_log)找出执行时间较长的 SQL 语句。
    • 关注:
      • 查询语句是否使用了索引。
      • 查询语句是否涉及大量数据扫描(如全表扫描)。
      • 查询语句是否存在复杂的计算或连接操作。
  2. 分析执行计划

    • 使用数据库的 EXPLAINEXPLAIN ANALYZE 命令分析 SQL 语句的执行计划。
    • 重点关注:
      • 是否使用了正确的索引。
      • 是否存在不必要的表连接或子查询。
      • 是否存在排序(ORDER BY)或分组(GROUP BY)操作,导致性能下降。
  3. 检查索引使用情况

    • 确认相关表是否创建了索引,索引是否生效。
    • 使用工具(如 SHOW INDEX)检查索引的状态和选择性。
  4. 监控数据库资源使用情况

    • 使用数据库监控工具(如 MySQL Performance Schemapg_stat_activity)查看数据库的资源使用情况。
    • 关注:
      • 是否存在大量并发连接。
      • 是否存在锁竞争或死锁。
  5. 优化建议

    • 优化 SQL 语句,减少全表扫描和复杂计算。
    • 创建或调整索引,确保查询语句能够高效执行。
    • 使用缓存技术(如 Redis)减少数据库访问。
    • 调整数据库配置(如连接池大小、缓存大小)。
    • 升级硬件资源(如增加 CPU 核心数、使用 SSD 磁盘)。
相关推荐
铭阳(●´∇`●)20 分钟前
Python内置函数---breakpoint()
笔记·python·学习
月临水1 小时前
软件测试笔记1(测试的概念、测试和开发模型介绍、BUG介绍)
软件测试·笔记·bug
大学生亨亨1 小时前
蓝桥杯之递归
java·笔记·算法·蓝桥杯
姝孟1 小时前
学习笔记(C++篇)--- Day 4
c++·笔记·学习
10000ask3 小时前
Android audio_policy_configuration.xml加载流程
笔记
jackson凌3 小时前
【Java学习笔记】选择结构
java·笔记·学习
DKPT4 小时前
正则表达式与python使用
笔记·python·学习·面试·正则表达式
EQ-雪梨蛋花汤4 小时前
【Unity笔记】Unity音效管理:ScriptableObject配置 + 音量控制 + 编辑器预览播放自动化实现
笔记·unity·编辑器
海绵宝宝的月光宝盒4 小时前
[STM32] 4-1 UART与串口通信
c语言·开发语言·笔记·stm32·单片机