[TOC]
性能测试
性能测试面试题
1. 你能说一下性能测试的流程吗?
- 性能测试流程分为5个阶段:
- 需求调研阶段,主要任务是做需求调研和需求分析,主要产出文档--性能测试需求表和性能测试计划表
- 测试准备阶段,主要任务是构造测试模型,制定测试方案。设计性能测试方案、压测数据准备、压测脚本开发。产出文档--性能测试方案,性能测试用例
- 测试执行阶段,主要任务是执行性能压测,并记录测试结果以及过程,做好性能测试监控,并对测试结果进行分析。产出文档--性能测试执行日志
- 测试报告阶段,主要任务是性能测试报告的编写,包括对测试结果的描述,发现的性能瓶颈和优化过程,最终的压测结果分析和本次性能测试的结论。产出的文档--性能测试分析报告
- 测试总结阶段,主要是对本次压测任务的测试过程和测试技术进行总结和复盘。时间允许的情况下,还应该将所有的测试资产进行归档保存。
- 简单来说就是:需求调研 --> 环境搭建 --> 脚本编写 --> 准备数据 --> 执行测试 --> 回归调优 --> 测试报告
2. 性能测试场景怎么设计?一般都有哪些性能场景?
- 一般基本的场景包括:基准测试、单交易测试、混合测试、稳定性测试
- 其他场景的可选场景:高可用性测试、异常测试等,以及其他的结合各自项目业务的场景
- 单交易基准测试,使用压测工具或平台,1个用户或者基准用户数,运行5分钟或者迭代100次
- 单交易负载测试,并发用户逐渐递增到预估值情况下,运行10分钟
- 混合测试,多种交易设置不同并发用户占比的情况下,运行10分钟
- 稳定性测试,选择混合测试支持最大并发用户数的80%,运行2小时
- 如果压测工作任务时间允许,可以适当调整压测场景运行时间
- 如果要求被测系统支持7*24小时稳定性,稳定性测试运行时间也要跟着做调整
3. TPS是什么?
- TPS是每秒系统处理的交易(事务数量),呈现的是服务器对用户请求的处理能力
- TPS = 并发数/平均响应时间
4. 做性能测试,如何准备性能测试数据?
- 1.调用业务接口构造数据,一般适用于数据逻辑比较复杂的情况下
- 2.直接写jdbc代码造数据,一般适用于数据量较大且数据逻辑比较简单的情况
- 3.存储过程造数据,一般适用于数据量巨大且数据逻辑较简单的情况
- 4.导入SQL,一般适用于数据安全级别较低且数据量巨大的情况
5. 做性能测试的原因是什么?
- 首先呢互联网行业发展快,用户量大增,有些用户反馈的问题是多用户并发操作导致的
- 其次是业务和系统的架构越来越复杂,简单架构没有的性能问题,往往在复杂架构中更容易发现
- 然后是用户量剧增的情况下,导致数据库存的数据量也跟着陡增,这种情况下也会更容易出现性能瓶颈
- 最重要的是用户越来越不仅仅只满足于按钮能用,还关注点点点后的反应速度
6. 性能测试中,一般都需要关注哪些指标?
- 主要包括以下四个性能指标:
- TPS:每秒事务数,代表了系统的处理能力,tps越高,性能越好
- 平均响应时间(单位毫秒):请求的平均耗时,响应时间越短,性能越好,在工作中,如果没有明确需求,就使用258原则判断,即average<8秒即可判断通过,90%line(百分之90的请求在这个时间点完成,即统计大部分人的响应时间)
- 并发数:同时向我们的服务器发起请求的虚拟用户数,在不同的工具里面呢,可以用多个进程或者线程来进行实现
- 事务失败率(Error%):压测过程中失败请求的占比,可以理解为请求的错误率,越小越好,判断标准:x<5%
- 资源使用率:CPU占用率、内存使用率、磁盘I/O、网络I/O
- 服务器的CPU使用率:即服务器的繁忙程度,数值越小越好,对于服务器的CPU使用率有个监控原则,不要持续100%,数值在85%-90%之间,如果持续100就没有办法接收别的请求,就会卡顿,甚至会有失败率
7. 你说下进程与线程的区别是什么?
- 进程的概念:将一些批处理命令按照程序归类,(比如A程序,B程序,C程序)并为归类后的命令集合分别创建一个进程,每个进程都会分配独立的内存空间,且进程之间互不影响,然后配合多核的CPU来实现进程的并行处理
- 线程的概念:将进程中的每条子命令也并行执行,比如进程2的命令很少,当进程2执行完的时候,如果别的进程中还有命令没有执行完,就可以为别的进程中的子命令创建线程来执行命令,也就是说线程是进程的子任务,且线程没有自己的资源。所有线程都共享所属进程的资源,因此线程就变成了计算机执行处理的最小单位,而进程则是计算机分配资源的最小单位
- 进程:具有独立数据空间,进程间不共享数据,由系统进行调度
- 线程:执行程序的最小单元,进程内线程间共享资源,同样是由系统进行调度
8. 怎么根据线下环境评估线上环境的性能?
- 1.首先线下必须要有专门的性能测试环境
- 2.线下环境单台集齐配置和线上不能相差很大,可以通过单台的机器性能推算出多台机器性能
- 3.如果线下机器配置很差,只能测试出程序有无性能问题,这样线下测试出来的数据对线上没有太大参考意义
- 4.如果想获取比较准确的线上性能情况,建议最好做线上的性能测试
9. 产品就只给一个需求,需求调研的内容都不知道,也没人告诉你,怎么开展性能测试?
- 1.没有任何途径进行需求调研的情况下,可以直接跳过需求调研,直接开始压测
- 2.压测完成后,可以把本次压测数据开会讨论,共同决定是否满足性能需求
- 3.或者根据行业内的通用指标规范,比如高频接口响应时间 < 100ms,低频 < 200ms的标准来判断
10. 性能测试中,TPS比较低,可能是哪些方面的问题?
- 1.压力机本身性能瓶颈
- 2.网络IO瓶颈
- 3.中间件(tomcat/nginx/mysql)连接数限制
- 4.Java线程的阻塞、等待
- 5.本系统资源的瓶颈(cpu、内存、磁盘、网络等)
- 6.其他外部系统响应时间过长,造成本系统的time_wait
11. 如何根据测试结果定位性能问题?
- 1.响应时间不符合要求,可以通过pinpoint观察调用链,找出耗时比较长的步骤进行优化
- 2.并发数达不到要求,可以从以下几个方面考虑:
- 是否发生系统依赖资源的征用,比如数据库连接,业务处理线程数等等
- 业务流程代码性能,是否可以优化
- 在运行的过程中,是否频繁的GC
- 3.CPU使用率过高,可以从以下几个方面考虑:
- 在运行过程中,是否频繁GC
- 是否发生过多的线程切换
- 现程序中是否有比较耗CPU的代码
12. 性能测试脚本中为什么要做参数化?
- 参数化是将请求中的参数动态化,每次请求都使用不一样的参数,从而模拟了不同用户使用不同数据来做业务请求
- 常用的参数化方式有:随机数、随机字符串、时间戳、文件参数化、UUID等
13. 工作中常用的jmeter自带函数有哪些?
- digest 特定哈希算法的加密函数,生成摘要,支持的加密算法有MD5/SHA
- urlencode、urldecode分别是URL编码、解码函数
- time 获取当前各种格式时间的函数
- log 记录日志信息,一般用来定位接口请求应答问题
- Random 获取指定范围数值的随机数函数
- StringToFile 指定字符串写入文件的函数
- UUID函数 返回一个伪随机类型通用唯一标识符
14. 性能测试过程中如何对瓶颈进行分析?
- 针对不同的瓶颈采用不同的分析法:
- 内存分析方法:内存分析用于判断系统有无内存瓶颈,是否需要通过增加内存等手段提高系统性能表现
- 处理器分析方法:通过处理器性能计数器的值体现服务器整体处理器利用率,判断是否存在处理器瓶颈
- 磁盘I/O分析方法:通过磁盘I/O性能计数器的值体现服务器整体磁盘I/O使用情况,判断是否存在进程瓶颈
- 进程分析方法:通过进程性能指标数据,判断是否存在进程瓶颈
- 网络分析方法:通过网络性能指标数据,判断是否存在网络瓶颈
15. 应用服务器CPU高和数据库服务器CPU高的分析思路是什么?
- 应用服务器的CPU高,先要看tps和响应时间,如果tps比较高,我们认为是正常的CPU消耗;如果是tps比较低,那么往往某些代码过于消耗cpu
- 数据库服务器cpu高,往往是因为sql语句执行效率比较低,可以通过对数据库慢查询监控,结合执行计划进行分析,是否是相关表没有索引或索引未生效
16. 说一下内存溢出和内存泄露吧?
- 内存溢出通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了主机内安装的内存所承受的大小,这就叫内存溢出
- 内存泄露是指程序在申请内存后,使用完没有进行释放,无法释放已申请的内存空间
- 内存泄露堆积后果比较严重,最后导致内存耗光,造成内存溢出
17. Nginx常用负载均衡配置有哪些?
- 1.nginx.conf
- 2.轮询模式,默认
- 3.weight权重模式,权重越高,权重越高访问概率越大,weight=70
- 4.ip_hash,在upstream中采用ip_hash指令,如果客户已经访问了某个服务器,当客户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访问固定访问一个后端服务器,可以解决session的问题。此种策略,可以实现同一个用户访问同一台服务器,会话不会丢失,但是可能会分配不均
18. 你是如何使用JMETER做性能测试的?
- 做一个简单的压力测试
- 1.会在原有的接口测试脚本中,增加一个元件聚合报告
- 2.准备批量的测试数据,可以使用CSV文件,文件的表头也就是第一行去设置我们的变量名,也就是要引用的变量名称
- 3.在Http请求中去引用我们上述这个文件中的变量名
- 4.我们可以在线程组中设置我们本次要运行的次数
- 流程:测试计划中添加线程组(配置线程数,循环次数,持续时间等)——线程组添加用户自定义变量——右键线程组添加http请求(设置接口请求地址和参数)——右键http请求选择配置元件里的CSV设置数据——右键HTTP请求添加响应断言——右键HTTP请求添加断言结果——右键线程组添加察看结果树和聚合报告—————执行测试
19. 如果一个需求没有明确的性能指标,要如何开始进行性能测试?
- 先输出业务数据,如pv(访问量)、UV(独立访客)、时间段等,计算出大概的值,然后不断加压测到峰值
20. 介绍 JMeter 聚合报告包括哪些内容?
- 请求名、线程数、响应时间(50 95 99 最小 最大)错误率、吞吐量
21. 了解哪些linux资源监控命令?
- ps:用于查看系统进程信息
- top:可用于持续监视系统性能
- 动态显示进程信息。 -n 获取多次cpu的执行情况,top -n4:只更新4次 -d 间隔时间,top -d 4:每隔4秒更新一次 -p 获取指定端口进程的数据,top -p 22
- dmesg | tail:默认显示最新的10个系统信息,可以查看导致性能问题的错误信息。
- vmstat: 逐行输出虚拟内存状态统计信息
- free -m:查看linux内存使用情况
- mpstat:实时监控CPU性能
- pidstat :用于监控全部或指定进程的资源占用情况,和top命令类似,但不覆盖输出,有利于观察数据随时间的变动情况,top会覆盖之前的输出
- iostat:iostat用于显示CPU和块设备(磁盘I/O)相关的统计信息
- sar:系统活动情况报告,是Linux系统性能分析工具。可以用来分析磁盘I/O、CPU效率、内存使用等
22. 针对大并发压力测试,主要是从哪几个方面去考虑点?
- 考虑并发用户数的设计
- 考虑测试场景
- 考虑服务端的资源
- 考虑网络环境(内网还是外网)
- 机器是否足够,是否需要分布式压测
23. jmeter中如何监控linux资源?
- serveragent插件在服务器安装启动
- 保证防火墙对4444端口开放,否则会连接拒绝
- 本机启动监控
24. jmeter负载测试中怎么保持session会话?
- 对session唯一性有要求的接口
- (1):脚本保存session,cookie管理器并发读取session。吞吐量相对较低
- (2)正则提取保存为全局属性,cookie管理器并发读取session。吞吐量正常
25. 如何识别性能瓶颈?
- tps下降?
- 响应时间上升?
- 负载越来越高,响应时间越来越长,tps没有变化?
- 随着负载升高,tps却不变,意味着单线程的tps是越来越低的
- 总的tps/线程数=性能瓶颈点
26. 秒杀场景如何来做性能测试?
-
一般秒杀场景主要都会有以下几个特点:
- 大量用户同时进行抢购操作、系统流量激增、服务器瞬时压力很大;
- 请求数量远大于商品库存量、只有少数客户可以成功抢购;
- 业务流程不复杂,核心功能是下订单
-
一般要从以下几个方面进行处理:
-
限流:
- 从客户端层面考虑,限制单个客户抢购频率;服务端层面,加强校验,识别请求是否来源于真实的客户端,并限制请求频率,防止恶意刷单。
-
缓存:
- 热点数据都从缓存获得,尽可能减小数据库的访问压力;
-
异步:
- 客户抢购成功后立即返回响应,之后通过消息队列,异步处理后续步骤,如发短信、更新数据库等,从而缓解服务器峰值压力。
-
分流:
- 单台服务器肯定无法应对抢购期间大量请求造成的压力,需要集群部署服务器,通过负载均衡共同处理客户端请求,分散压力。
-
测试用例:
- 功能性:
- 下单的测试(数据库落库)
- 限购数量边界值测试
- 秒杀时间边界值测试
- 库存边界值测试
- 幂等性(同一个订单提交多次)
- 锁库存(就剩下一个商品,多个人购买,谁会成功,已下单但是未支付的需要锁定库存,支付超时释放库存)
- 下单队列(多个同时购买,谁先成交)
- 退款订单是否需要恢复库存
- 模拟回调(订单状态流转)
- 主动查询(订单状态流转)
- 断网发送请求慢
- 安全性:
- 越权下单
- 数据权限
- 下单敏感信息传输加密
- 日志中不能直接打印敏感信息
- 性能:
- 支持多少人同时下单
- 功能性:
27. 使用jmeter如何做接口之间的关联?
- 接口关联指的就是一个接口要使用另一个接口的返回值作为参数
- 用户登录后,session信息都不同,有些操作要使用session,就需要将这个动态的信息保存下来。还有经常遇到的场景,第二个请求提交的参数要从第一个请求的返回数据中获取。
- 在jmeter中针对不同的响应数据格式都有不同的处理组件,json格式的采用json提取器,xml或者html格式的采用xpath提取器,其他格式的可以采用正则表达式提取器。
- BeanShell后置处理器也可以从响应结果中提取响应内容
- 跨线程组关联则需要将关联字段设置为全局属性
- 通过这些组件提取所需内容后,在需要关联的接口中引用变量即可完成关联
- THE END -
最后修改:2025年8月1日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qian777.cn/66.html
共有 0 条评论