# 性能测试面试题

🔗测试开发训练营 (opens new window):针对面试求职的测试开发训练营,大厂导师 1v1 私教,帮助学员从 0 到 1 拿到测开满意的 offer

  • ✅直播授课+实时互动答疑,课程到就业贯穿企业级案例,由测试开发导师全程主讲,绝无其他助理老师代课。

  • ✅大厂测试开发导师一对一求职陪跑,覆盖课程答疑+简历打磨+面试模拟面试+面试复盘等求职辅导

# 一、Jmeter工具使用

# 1. JMeter中如何实现参数关联?比如登录token传递给下一个接口?

答案话术: JMeter实现参数关联主要用正则表达式提取器或JSON提取器。

具体做法是:在登录接口的请求上右键添加"后置处理器",选择JSON提取器或正则表达式提取器,提取返回结果中的token值,设置变量名比如${token}。然后在下一个接口的请求头中引用这个变量${token},就实现了参数传递。

举个例子:登录接口返回{"code":0,"data":{"token":"abc123"}},我用JSON提取器配置$.data.token提取token值,变量名设为token。后续接口在Headers里添加Authorization: ${token},就能把登录token传递过去了。


# 2. JMeter如何模拟多用户并发登录?

答案话术: 主要通过线程组和CSV数据文件配置实现。

首先准备CSV文件,里面存放多个用户的账号密码,比如user1/pass1、user2/pass2等。然后在线程组中设置并发用户数,比如100个线程。添加CSV数据文件配置元件,引用刚才的CSV文件,配置变量名username和password。在登录接口中引用${username}和${password}变量。

这样每个线程就会从CSV文件读取不同的用户数据进行登录,实现了多用户并发场景。


# 3. JMeter中的断言有哪几种?你常用哪种?

答案话术: JMeter常用的断言主要有响应断言、JSON断言、持续时间断言、大小断言等。

我最常用的是响应断言和JSON断言。响应断言主要用来校验返回的状态码、返回文本是否包含特定内容;JSON断言用来校验返回的JSON数据中某个字段的值是否符合预期。

比如电商项目压测下单接口,我会用JSON断言验证返回的订单状态是否为"success",用响应断言验证响应码是否为200,确保接口正常。


# 4. JMeter如何实现集合点(并发集合)?

答案话术: JMeter通过Synchronizing Timer同步定时器实现集合点。

具体做法是:在需要集合的请求上添加Synchronizing Timer,设置集合的用户数,比如100个用户。当达到指定用户数时,这些线程会同时释放,实现真正的瞬时并发。

这个功能特别适合压测秒杀、抢购等场景,能模拟大量用户同一时刻点击下单按钮的情况。


# 5. JMeter中的线程组有哪几种?有什么区别?

答案话术: JMeter主要有三种线程组:普通线程组、setUp线程组、tearDown线程组。

普通线程组是最常用的,用来模拟并发用户执行测试场景。setUp线程组在测试开始前执行,一般用来做数据初始化准备。tearDown线程组在测试结束后执行,用来清理测试数据。

我在电商项目中,会用setUp线程组提前创建测试订单数据,用普通线程组执行压测,用tearDown线程组清理测试产生的脏数据。


# 6. JMeter如何实现阶梯式加压?

答案话术: JMeter阶梯式加压主要通过线程组的Ramp-Up时间配置实现。

比如我要压测订单接口,目标是从50并发逐步加到500并发。我会设置线程数为500,Ramp-Up时间设为450秒,循环次数根据需求设置。这样JMeter会在450秒内逐步启动500个线程,平均每秒增加约1个线程,实现平滑加压。

也可以用Stepping Thread Group插件,更灵活地设置每个阶段的并发数和持续时间。


# 7. JMeter如何查看实时压测结果?

答案话术: JMeter主要通过几个监听器查看实时结果:

聚合报告可以看到TPS、响应时间、错误率等汇总数据;图形结果可以看到响应时间的波动趋势;活动线程数可以看到当前有多少线程在运行。

我一般会同时添加聚合报告和图形结果两个监听器,实时观察TPS是否达标、响应时间是否正常、有没有错误。不过监听器会消耗性能,正式压测时我会关闭监听器,用命令行模式执行。


# 8. JMeter命令行模式怎么用?有什么优势?

答案话术: JMeter命令行模式通过jmeter -n -t命令执行。

基本语法是:jmeter -n -t 脚本.jmx -l result.jtl -e -o report目录

其中-n表示非GUI模式,-t指定脚本文件,-l保存结果文件,-e -o生成HTML报告。

命令行模式的优势是不消耗图形界面资源,性能更好,能压出更高的TPS。而且方便集成到Jenkins做持续集成,可以定时自动化执行压测。我在电商项目做性能回归测试时,都是用命令行模式跑的。


# 9. JMeter如何模拟弱网环境?

答案话术: JMeter主要通过Constant Throughput Timer恒定吞吐量定时器来限制吞吐量,模拟弱网。

具体做法是添加Constant Throughput Timer,设置目标吞吐量,比如设置为600,表示每分钟最多60个请求,相当于每秒1个请求,就能模拟网络很慢的情况。

也可以用Uniform Random Timer添加随机延迟,模拟网络不稳定的场景。这在电商APP测试中很有用,能验证弱网环境下用户下单是否会超时或报错。


# 10. JMeter如何处理Cookie和Session?

答案话术: JMeter通过HTTP Cookie管理器自动处理Cookie和Session。

在线程组下添加HTTP Cookie管理器后,JMeter会自动保存服务器返回的Cookie,并在后续请求中自动携带。不需要手动提取和设置,非常方便。

比如电商项目压测,用户登录后服务器会返回Session ID的Cookie,添加了Cookie管理器后,后续的浏览商品、加购物车、下单等请求都会自动带上这个Cookie,保持登录状态。


# 11. JMeter如何实现动态参数,比如随机生成手机号?

答案话术: JMeter主要通过函数助手实现动态参数生成。

常用的函数有__Random生成随机数、__RandomString生成随机字符串、__time生成时间戳等。

比如要生成随机手机号,我会用${__Random(13000000000,13999999999)}生成13开头的11位手机号。或者用BeanShell取样器编写Java代码生成更复杂的数据。

在电商项目压测注册接口时,我就用这种方式生成大量不重复的测试账号。


# 12. JMeter的聚合报告中各项指标含义是什么?

答案话术: 聚合报告主要包含这些关键指标:

Samples是请求总数;Average是平均响应时间;Median是中位数响应时间;90% Line表示90%的请求响应时间;Min/Max是最小最大响应时间;Error%是错误率;Throughput是吞吐量即TPS。

我最关注的是Throughput看TPS是否达标,Average看平均响应时间是否在500ms以内,Error%看错误率是否低于0.1%,90% Line看是否有长尾请求。


# 13. JMeter如何实现接口加密?比如MD5签名?

答案话术: JMeter通过BeanShell预处理器实现接口加密。

具体做法是在请求前添加BeanShell PreProcessor,编写Java代码进行加密。比如MD5签名,我会导入java.security.MessageDigest类,对请求参数进行MD5加密,然后把签名结果设为变量,在请求中引用。

在电商项目中,支付接口需要MD5签名验证,我就用BeanShell实现了自动签名,避免每次手动计算。


# 14. JMeter分布式压测中Controller和Agent的区别?

答案话术: Controller是控制机,负责管理和分发任务;Agent是压力机,负责执行压测。

在分布式架构中,Controller将测试脚本分发给多个Agent,Agent执行压测后把结果回传给Controller汇总。Controller可以不参与压测只做管理,也可以同时作为一台Agent执行压测。

我们电商项目做大促压测时,用1台Controller控制5台Agent同时施压,模拟几万用户并发下单,单台机器压不出这个量级。


# 15. JMeter如何限制每秒请求数TPS?

答案话术: JMeter通过Constant Throughput Timer恒定吞吐量定时器限制TPS。

添加这个定时器后,设置目标吞吐量,单位是每分钟请求数。比如我想限制TPS为100,就设置6000(100*60)。JMeter会自动控制请求速度,不让TPS超过这个值。

这个功能在容量规划测试中很有用,可以逐步提高TPS,观察在什么并发量下系统开始出现瓶颈。


# 16. JMeter中如何处理HTTPS请求?

答案话术: JMeter处理HTTPS请求很简单,默认就支持。

如果遇到证书验证问题,可以在HTTP请求中勾选"使用KeepAlive",或者在系统属性中设置忽略证书验证。也可以导入SSL证书到JMeter的密钥库。

我在电商项目压测支付接口时,都是HTTPS协议,直接在URL填https://开头的地址就可以了,没遇到什么问题。


# 17. JMeter如何实现数据库压测?

答案话术: JMeter通过JDBC请求实现数据库压测。

首先在测试计划中添加JDBC Connection Configuration配置数据库连接信息,包括数据库URL、用户名密码、驱动类等。然后添加JDBC Request,编写SQL语句执行查询或更新操作。

我在电商项目中,用这个功能压测过订单查询接口,直接对数据库发起SQL查询,跳过应用层,测试纯数据库的性能瓶颈在哪。


# 18. JMeter的Debug Sampler和View Results Tree有什么用?

答案话术: Debug Sampler用来查看变量和属性的值,方便调试脚本。View Results Tree用来查看每个请求的详细信息,包括请求参数、返回结果等。

调试脚本时我会用Debug Sampler查看参数关联是否成功,变量值是否正确提取。用View Results Tree查看接口返回的完整JSON数据,确认断言是否准确。

但是正式压测时要删除这些元件,因为会影响性能消耗额外资源。


# 19. JMeter如何处理返回的乱码问题?

答案话术: JMeter乱码问题主要通过设置编码格式解决。

在HTTP请求中,可以在"内容编码"中设置UTF-8。如果还是乱码,可以在jmeter.properties配置文件中设置sampleresult.default.encoding=UTF-8。

我在电商项目压测时,有些商品描述返回中文乱码,就是通过这种方式解决的。


# 20. JMeter压测时发现TPS上不去,响应时间很长,如何排查?

答案话术: 我会从三个方面排查:

第一是检查JMeter自身,看压力机的CPU、内存是否打满,线程数设置是否合理,脚本中是否有监听器消耗性能。

第二是检查网络,看带宽是否打满,压力机到服务器的网络延迟是否正常。

第三是检查服务端,配合开发查看服务器CPU、内存、数据库等资源使用情况,看是否有慢查询、线程阻塞等问题。

一般都是通过监控工具定位到具体瓶颈点,然后针对性优化。

# 二、性能测试基础理论

# 1. 什么是性能测试?性能测试的目的是什么?

答案话术: 性能测试是通过模拟用户并发访问,测试系统在特定负载下的响应速度、吞吐量、稳定性等性能指标的测试活动。

主要目的有三个:第一是验证系统是否满足性能需求,比如电商大促时能否支撑10万用户同时下单;第二是发现性能瓶颈,定位是数据库慢、CPU高还是其他问题;第三是为容量规划提供依据,评估需要多少台服务器才能支撑业务峰值。


# 2. 性能测试和功能测试有什么区别?

答案话术: 区别主要有三点:

第一是测试目标不同,功能测试验证功能是否正确,性能测试验证系统能否承受预期负载。

第二是测试方法不同,功能测试模拟单用户操作,性能测试模拟大量并发用户。

第三是关注指标不同,功能测试关注功能是否可用,性能测试关注响应时间、TPS、资源使用率等指标。

比如电商下单功能,功能测试验证能否成功下单,性能测试验证1万人同时下单系统是否稳定。


# 3. 性能测试的主要类型有哪些?

答案话术: 性能测试主要包括四种类型:

基准测试,用小并发验证脚本和数据正确性;负载测试,逐步加压找到系统承载能力上限;压力测试,超过正常负载测试系统极限和恢复能力;稳定性测试,长时间持续压测验证系统是否有内存泄漏等问题。

我在电商项目中,会先做基准测试验证脚本,再做负载测试找性能拐点,然后做压力测试验证极限,最后做稳定性测试跑6小时确保无内存泄漏。


# 4. 什么是TPS?什么是QPS?有什么区别?

答案话术: TPS是每秒事务处理数,表示系统每秒能处理多少笔完整的业务事务。QPS是每秒查询数,表示系统每秒能处理多少次查询请求。

区别在于TPS通常包含多个接口调用,是业务维度的;QPS是单个接口的请求数,是接口维度的。

比如电商下单这个事务,可能包括库存查询、订单创建、支付调用三个接口,这算1个TPS但是3个QPS。

一般压测时我们更关注TPS,因为它更贴近实际业务场景。


# 5. 什么是响应时间?90%响应时间是什么意思?

答案话术: 响应时间是从发送请求到收到完整响应的时间间隔,通常以毫秒为单位。

90%响应时间又叫90分位值,表示90%的请求响应时间都在这个值以内。比如90%响应时间是500ms,说明有90%的用户请求在500ms内得到响应,只有10%超过500ms。

这个指标比平均响应时间更能反映用户体验,因为平均值会被少数慢请求拉高。我在电商项目中,要求核心接口90%响应时间小于500ms。


# 6. 什么是并发用户数?和线程数是一个概念吗?

答案话术: 并发用户数是指同一时刻同时向系统发起请求的用户数量。

并发用户数和线程数在压测工具中通常是等价的,一个线程模拟一个并发用户。但在实际业务中,并发用户数要考虑思考时间,比如用户浏览商品、填写表单的时间,所以真实并发会比在线用户数少。

我在电商项目压测时,如果业务场景是1000个用户每分钟下单一次,考虑60秒思考时间,实际并发可能只有50-100。


# 7. 什么是性能瓶颈?常见的性能瓶颈有哪些?

答案话术: 性能瓶颈是指限制系统性能提升的关键因素,是系统资源或设计上的短板。

常见瓶颈包括:数据库层面的慢查询、缺少索引、连接池不够;应用层面的线程阻塞、死锁、内存泄漏;硬件层面的CPU过高、内存不足、磁盘IO慢;网络层面的带宽打满。

我在电商项目中遇到过订单查询接口TPS上不去,定位发现是数据库全表扫描,加了索引后TPS从200提升到2000。


# 8. 什么是思考时间?为什么要设置思考时间?

答案话术: 思考时间是模拟用户在操作之间的停顿时间,比如浏览商品页面、阅读详情的时间。

设置思考时间主要有两个原因:第一是更真实地模拟用户行为,用户不会连续不停地点击;第二是控制系统负载,如果不设置思考时间,压测出来的TPS会虚高,不符合实际情况。

我在电商项目压测时,会根据生产日志分析用户平均操作间隔,设置合理的思考时间,通常在2-5秒之间。


# 9. 什么是吞吐量?吞吐量和TPS有什么关系?

答案话术: 吞吐量是指单位时间内系统处理的数据量或事务数,是衡量系统处理能力的重要指标。

吞吐量和TPS是等价的,都表示每秒处理的事务数。有时候吞吐量也指网络带宽,表示每秒传输的字节数。

在性能测试中,吞吐量越高说明系统处理能力越强。我在电商项目中,通过优化把下单接口TPS从800提升到1200,吞吐量提升了50%。


# 10. 什么是性能拐点?如何找到性能拐点?

答案话术: 性能拐点是指系统性能从平稳上升转为下降或不再增长的临界点,是系统承载能力的上限。

找性能拐点的方法是阶梯式加压,从小并发逐步增加,观察TPS和响应时间的变化。当TPS不再增长或开始下降,响应时间急剧上升,错误率增加时,就到了性能拐点。

我在电商项目压测订单接口时,发现并发从200增加到400时TPS从750涨到800就不再增长,响应时间从100ms涨到500ms,这就是性能拐点,说明系统极限TPS在800左右。


# 11. 什么是容量规划?如何进行容量规划?

答案话术: 容量规划是根据性能测试结果,评估系统需要多少硬件资源才能满足业务需求。

进行容量规划的步骤是:第一步明确业务峰值,比如电商大促预计10万笔订单/小时;第二步通过压测得到单台服务器的TPS上限,比如单台800 TPS;第三步计算需要的服务器数量,10万/3600≈28 TPS,但考虑3倍冗余,至少需要4台服务器。

我在电商项目中,通过容量规划为618大促提供了资源评估方案。


# 12. 什么是性能基线?为什么要建立性能基线?

答案话术: 性能基线是系统在特定配置和负载下的性能指标参考值,是后续性能对比的基准。

建立性能基线的目的是:第一,为后续版本迭代提供对比依据,评估新功能是否影响性能;第二,发现性能劣化问题,如果新版本TPS下降明显就要排查原因;第三,为线上问题提供参考,快速判断是否性能异常。

我在电商项目中,每个版本上线前都会做性能回归测试,与基线对比确保性能不劣化。


# 13. 什么是混合场景压测?和单接口压测有什么区别?

答案话术: 混合场景压测是模拟用户真实业务流程,按一定比例同时压测多个接口。单接口压测只压测一个接口。

区别在于混合场景更接近生产环境,能发现接口间的相互影响和资源竞争。比如电商场景,用户会浏览商品、加购物车、下单、支付,这是一个完整流程。单接口压测可能下单接口TPS达到1000,但混合场景可能只有600,因为其他接口占用了资源。

我在电商项目做性能测试时,会先做单接口找极限,再做混合场景模拟真实负载。


# 14. 性能测试报告应该包含哪些内容?

答案话术: 性能测试报告主要包含七个部分:

第一是测试目的和测试范围;第二是测试环境和配置信息;第三是测试场景设计,包括并发数、压测时长等;第四是性能指标要求,比如TPS、响应时间目标;第五是测试结果数据,包括各项指标的实际值;第六是性能瓶颈分析,发现的问题和原因;第七是优化建议和结论。

我在电商项目中编写的性能测试报告都会包含这些内容,并附上监控截图和数据分析图表。


# 15. 什么是长尾请求?长尾请求对系统有什么影响?

答案话术: 长尾请求是指响应时间特别长的少数请求,在响应时间分布图中呈现长尾状。

长尾请求会严重影响用户体验,虽然占比小但影响大。比如90%的请求200ms响应,但5%的请求需要5秒,这些用户就会感觉系统很慢。

长尾请求通常是因为数据库慢查询、缓存失效、GC停顿等原因。我在电商项目中,通过优化慢查询SQL、增加缓存,把95%响应时间从3秒降到500ms,消除了长尾。


# 16. 什么是全链路压测?和普通压测有什么区别?

答案话术: 全链路压测是在生产环境对真实系统进行压测,通过流量染色和影子库技术避免影响真实用户数据。普通压测在测试环境进行。

区别在于全链路压测更真实,能发现测试环境发现不了的问题,比如生产环境的网络延迟、第三方服务的影响等。但全链路压测技术复杂度高,需要数据隔离和流量染色。

我了解全链路压测的原理,电商大厂在大促前都会做全链路压测验证容量。


# 17. 性能测试中如何准备测试数据?

答案话术: 测试数据准备主要有三种方式:

第一是从测试环境数据库捞取真实数据,优点是数据真实可靠。

第二是通过自动化脚本调用业务接口生成数据,比如批量注册用户、创建订单,优点是数据完整符合业务规则。

第三是用数据库存储过程批量造数据,速度快但只适合简单表结构。

我在电商项目压测时,会用自动化脚本提前生成1万个测试用户和10万条商品数据,确保压测时数据充足。


# 18. 什么是预热?为什么性能测试需要预热?

答案话术: 预热是在正式压测前,先用小并发跑一段时间,让系统进入稳定状态。

需要预热的原因有三个:第一是让应用预加载数据和类到内存;第二是让数据库缓存热数据;第三是让JVM完成初始化和JIT编译。

如果不预热直接大并发压测,前期数据会不准确,响应时间虚高。我在电商项目中,会先用50并发预热5-10分钟,再正式加压。


# 19. 性能测试什么时候做?是在功能测试之前还是之后?

答案话术: 性能测试一般在功能测试基本完成之后进行,因为性能测试需要功能稳定的系统作为基础。

但也可以在项目早期做性能摸底测试,提前发现架构层面的性能风险。大的版本迭代或重要促销活动前,都要做性能测试验证容量。

我在电商项目中,每个迭代版本功能测试完成后会做性能回归测试,618、双11大促前1-2周会做全面的性能压测和容量评估。


# 20. 性能测试和压力测试是一回事吗?有什么区别?

答案话术: 不是一回事,压力测试是性能测试的一种类型。

性能测试是一个统称,包括负载测试、压力测试、稳定性测试等多种类型。负载测试是逐步加压找到系统承载能力;压力测试是超负荷运行测试系统极限和恢复能力;稳定性测试是长时间持续压测。

简单说,负载测试是找正常上限,压力测试是找崩溃极限。我在电商项目中,通常先做负载测试找到最佳TPS,再做压力测试验证极限场景下系统表现。

# 三、性能测试监控

# 1. 性能测试中主要监控哪些指标?

答案话术: 性能测试主要监控四个层面的指标:

第一是应用层指标,包括TPS、响应时间、并发数、错误率等业务指标。

第二是服务器资源指标,包括CPU使用率、内存占用、磁盘IO、网络带宽等。

第三是数据库指标,包括数据库连接数、慢查询、锁等待、QPS等。

第四是中间件指标,包括Redis命中率、消息队列堆积量、线程池使用情况等。

我在电商项目压测时,会同时监控这四个层面,全方位掌握系统状态。


# 2. Grafana+Prometheus+Exporter监控原理是什么?

答案话术: 这是一套完整的监控体系,工作原理是这样的:

Exporter是数据采集器,部署在被监控的服务器上,负责收集系统指标如CPU、内存、磁盘等数据。Prometheus是时序数据库,定期从Exporter拉取数据并存储。Grafana是可视化展示工具,从Prometheus查询数据生成监控大盘和图表。

我在电商项目中,就是用这套方案实时监控20多台服务器的性能指标,可以快速发现哪台机器出现瓶颈。


# 3. Linux中常用的性能监控命令有哪些?

答案话术: 我常用的Linux性能监控命令有这些:

top命令查看CPU使用率和进程资源占用;free -h查看内存使用情况;df -h查看磁盘空间使用率;iostat查看磁盘IO读写情况;netstat或ss查看网络连接状态;vmstat综合查看系统资源;dstat可以同时看CPU、内存、磁盘、网络。

如果需要持续监控,我会用watch命令每秒刷新,比如watch -n 1 free -h实时看内存变化。


# 4. 如何监控Java应用的JVM性能?

答案话术: 监控JVM主要用这几个工具:

jvisualvm可视化工具,可以实时查看堆内存使用、线程状态、GC情况,还能做线程dump和堆dump分析。

jstat命令行工具,用jstat -gcutil查看GC统计信息,包括年轻代、老年代使用率、GC次数和耗时。

jmap用来查看堆内存对象分布,jmap -histo可以看哪些对象占用内存最多。

我在电商项目压测时,如果发现响应时间突然变长,会用jvisualvm查看是不是Full GC频繁导致的。


# 5. 如何判断CPU使用率是否正常?多少算高?

答案话术: 判断CPU是否正常要结合具体场景:

一般来说,CPU使用率持续在80%以上就算比较高了,需要关注。但也要区分情况,如果是计算密集型应用,压测时CPU高是正常的;如果是IO密集型应用,CPU应该不会太高。

还要看CPU的具体分类,用top命令可以看到user态、system态、iowait等。如果iowait高说明磁盘IO是瓶颈;如果system态高可能是系统调用过多。

我在电商项目压测时,要求正常业务场景下CPU使用率控制在70%以内,留30%余量应对突发流量。


# 6. 如何监控数据库的性能指标?

答案话术: 监控数据库性能主要关注这几个方面:

第一是连接数,用show processlist查看当前连接数,防止连接池耗尽。

第二是慢查询,通过慢查询日志找出执行时间超过阈值的SQL。

第三是QPS/TPS,用show global status like 'Questions'查看数据库每秒查询数。

第四是锁等待,用show engine innodb status查看是否有锁冲突。

第五是缓存命中率,查看buffer pool命中率是否够高。

我在电商项目中,会用Grafana+Prometheus+MySQL Exporter实时监控这些指标,设置告警阈值。


# 7. 什么是慢查询?如何定位慢查询?

答案话术: 慢查询是指执行时间超过设定阈值的SQL语句,MySQL可以配置long_query_time参数,比如设置为1秒,超过1秒的查询就会记录到慢查询日志。

定位慢查询主要两步:第一步用mysqldumpslow工具分析慢查询日志,找出耗时最长、出现次数最多的SQL。第二步用EXPLAIN分析这些SQL的执行计划,看type类型,如果是ALL表示全表扫描,说明没走索引。

我在电商项目压测时,发现订单查询TPS上不去,通过慢查询日志定位到一条SQL没加索引,加上后TPS从200提升到2000。


# 8. 如何监控Redis的性能?

答案话术: 监控Redis主要关注这几个指标:

第一是命中率,用info stats查看keyspace_hits和keyspace_misses,计算命中率,正常应该在90%以上。

第二是内存使用情况,用info memory查看已用内存和最大内存,防止OOM。

第三是连接数,用info clients查看当前连接数,防止连接数耗尽。

第四是慢查询,用slowlog get查看执行时间较长的命令。

我在电商项目中,会监控Redis的命中率和内存使用,如果命中率低于80%就要优化缓存策略。


# 9. 压测时发现数据库CPU很高,如何排查?

答案话术: 数据库CPU高我会这样排查:

第一步用top查看是不是mysqld进程占用CPU最高。

第二步查看慢查询日志,用mysqldumpslow分析是哪些SQL执行慢、频率高。

第三步对慢SQL用EXPLAIN分析执行计划,看是否全表扫描、是否走索引。

第四步检查是否有锁等待,用show engine innodb status查看锁情况。

第五步查看数据库连接数是否过多,连接池配置是否合理。

我在电商项目遇到过订单查询导致数据库CPU 95%,最后发现是SQL没加索引,加上联合索引后CPU降到20%。


# 10. 如何监控线程状态?什么是线程阻塞?

答案话术: 监控Java应用线程状态主要用jvisualvm或jstack工具。

jvisualvm可以看到线程的运行状态,包括Runnable运行中、Waiting等待、Blocked阻塞等。jstack可以导出线程堆栈快照,分析线程在做什么。

线程阻塞是指线程处于Blocked状态,通常是在等待获取锁。如果大量线程阻塞,说明有锁竞争或死锁问题。

我在电商项目压测时,发现TPS上不去,用jvisualvm看到50多个线程都是Blocked状态,做线程dump分析后发现是日志打印导致的锁竞争,优化后问题解决。


# 11. 什么是GC?如何监控GC情况?

答案话术: GC是垃圾回收机制,JVM自动回收不再使用的内存对象。GC分为Minor GC回收年轻代和Full GC回收整个堆。

监控GC主要用jstat命令,jstat -gcutil可以看到年轻代、老年代使用率、GC次数和耗时。

重点关注Full GC的频率和耗时,Full GC会导致STW停顿影响性能。如果Full GC频繁,可能是内存泄漏或堆内存设置太小。

我在电商项目压测时,发现响应时间有尖刺,监控GC后发现每5分钟一次Full GC耗时2秒,优化后Full GC降到2小时一次。


# 12. 如何判断是否发生了内存泄漏?

答案话术: 判断内存泄漏主要看这几个现象:

第一是老年代内存持续上升,长时间不下降,用jstat -gcutil看Old区使用率。

第二是Full GC频率越来越高,但回收效果越来越差。

第三是应用最终抛出OutOfMemoryError异常。

定位内存泄漏的方法是用jmap做堆dump,然后用jvisualvm或MAT工具分析,看哪些对象占用内存最多、是否被正常释放。

我在电商项目遇到过内存泄漏,通过堆dump分析发现是订单对象被静态Map引用没释放,改用Guava Cache后解决。


# 13. 压测时如何实时查看应用日志?

答案话术: 实时查看应用日志主要用Linux命令:

tail -f命令可以实时查看日志文件末尾新增内容,比如tail -f /var/log/app.log。

如果日志量大,可以配合grep过滤关键字,比如tail -f app.log | grep ERROR只看错误日志。

如果要查看历史日志,用grep -n关键字 日志文件搜索,-n显示行号方便定位。

我在电商项目压测时,会同时开几个终端窗口,分别tail应用日志、数据库日志、nginx日志,实时监控有没有报错。


# 14. 什么是线程池?如何监控线程池状态?

答案话术: 线程池是预先创建一定数量线程处理任务的池子,避免频繁创建销毁线程的开销。

监控线程池主要关注这几个指标:活跃线程数、队列长度、拒绝任务数。可以通过JMX暴露线程池指标,用Grafana展示;或者用jstack查看线程状态。

如果活跃线程数接近最大线程数,队列很长,说明线程池不够用。如果有拒绝任务,说明线程池已满载。

我在电商项目压测时,发现大量请求超时,监控线程池后发现Tomcat线程池只设了50,改成200后问题解决。


# 15. 如何监控网络带宽使用情况?

答案话术: 监控网络带宽主要用这几个命令:

ifstat命令可以实时查看网卡的入站和出站流量,单位是KB/s或MB/s。

iftop命令可以看到每个连接的实时流量,类似网络版的top。

nload命令可以图形化展示网络流量曲线。

如果发现网络流量接近带宽上限,比如千兆网卡接近125MB/s,说明网络是瓶颈。

我在电商项目压测时,遇到过响应时间突然变慢,查看网络流量发现接近带宽上限,优化返回数据大小后解决。


# 16. 压测时发现磁盘IO很高,如何排查?

答案话术: 磁盘IO高我会这样排查:

第一步用iostat -x查看磁盘使用率,如果util接近100%说明磁盘繁忙。

第二步用iotop查看是哪个进程在读写磁盘,定位到具体应用。

第三步分析应用日志,看是不是日志写入过于频繁。

第四步检查数据库,是否有大量磁盘读写操作,数据库缓存是否太小。

我在电商项目遇到过磁盘IO 100%,排查后发现是应用把日志级别设成DEBUG,每秒写几万行日志,改成INFO后IO降到10%。


# 17. 什么是负载均衡?如何监控负载均衡效果?

答案话术: 负载均衡是将请求分发到多台服务器,避免单台服务器过载。常见的有Nginx、LVS等。

监控负载均衡效果主要看两个方面:第一是请求分发是否均匀,用Nginx的access日志或监控工具查看每台服务器的请求量是否接近。第二是每台服务器的资源使用率是否均衡,如果某台CPU特别高说明负载不均。

我在电商项目中,用Grafana监控5台应用服务器,发现有一台CPU 80%其他只有30%,排查后发现是Session粘滞导致,改用Redis共享Session后负载均衡了。


# 18. 如何监控消息队列MQ的性能?

答案话术: 监控MQ主要关注这几个指标:

第一是消息堆积量,如果消息积压严重说明消费能力不足。

第二是消费延迟,消息从生产到消费的时间间隔,正常应该在秒级。

第三是消费者数量和状态,是否有消费者宕机或消费异常。

第四是吞吐量,每秒生产和消费的消息数。

我在电商项目中,会监控Kafka的消息堆积量,如果超过10万条就告警,说明要增加消费者或优化消费逻辑。


# 19. 压测过程中如何设置监控告警?

答案话术: 设置监控告警主要在Grafana或Prometheus中配置:

根据性能指标设置阈值,比如CPU超过80%、响应时间超过1秒、错误率超过1%就告警。

配置告警通知方式,可以邮件、钉钉、企业微信等多种渠道。

设置告警级别,比如CPU 80%是Warning,90%是Critical。

还可以设置告警恢复通知,当指标恢复正常时发送消息。

我在电商项目压测时,设置了10多个监控指标的告警,一旦超过阈值立即通知,能快速响应问题。


# 20. 如何生成性能监控报告?

答案话术: 生成性能监控报告主要包含这些内容:

第一是监控指标汇总,包括TPS、响应时间、CPU、内存等关键指标的最大值、平均值、趋势图。

第二是监控截图,把Grafana大盘、JMeter聚合报告等截图放到报告中。

第三是异常分析,压测过程中出现的性能问题、告警记录。

第四是监控数据对比,与性能基线或历史数据对比,评估性能变化。

我在电商项目中,用Grafana可以直接导出PDF格式的监控报告,也会手工整理Word文档包含更详细的分析。

# 四、性能测试瓶颈分析

# 1. 压测时TPS上不去可能是什么原因?如何排查?

答案话术: TPS上不去的原因比较多,我会从这几个方面排查:

第一是压力机本身,检查压力机CPU、内存是否打满,脚本是否有问题,如果单台压不够就用分布式压测。

第二是网络带宽,查看网络流量是否达到上限,压力机到服务器的网络是否正常。

第三是服务器资源,用top、free查看CPU、内存使用率是否达到瓶颈。

第四是数据库,查看慢查询、连接池、索引是否有问题。

第五是应用代码,用jstack查看是否有线程阻塞、死锁。

我在电商项目遇到过订单接口TPS只有200,排查后发现是数据库全表扫描,加索引后TPS提升到2000。


# 2. 压测时CPU使用率很高怎么办?如何定位分析?

答案话术: CPU高分两种情况:一种是响应时间短TPS高,这是正常的;另一种是响应时间长TPS低,这需要优化。

定位分析CPU高的方法是:第一步用top命令找到占用CPU最高的Java进程PID。第二步用top -Hp PID查看该进程下哪个线程占用CPU最高。第三步把线程ID转成16进制。第四步用jstack命令导出线程堆栈,搜索16进制线程ID定位到具体代码。

我在电商项目遇到过CPU 95%的问题,通过这个方法定位到是日志打印导致的线程阻塞,优化日志框架后CPU降到30%。


# 3. 压测时响应时间很长怎么分析?

答案话术: 响应时间长我会从六个方面分析:

第一是服务器硬件资源,CPU、内存、磁盘是否达到瓶颈。

第二是网络问题,网络延迟、丢包、带宽不够。

第三是线程问题,用jstack查看是否有线程死锁、阻塞。

第四是中间件问题,MQ消息堆积、Redis缓存失效。

第五是数据库问题,慢查询、缺少索引、连接数不够。

第六是应用代码问题,用JProfiler分析哪个方法耗时最长。

我在电商项目遇到过订单接口响应时间3秒,通过慢查询日志定位到SQL全表扫描,加索引后降到50ms。


# 4. 如何定位线程阻塞问题?

答案话术: 定位线程阻塞主要用jvisualvm或jstack工具。

第一步用jvisualvm连接应用,点击线程标签,查看有多少线程处于Blocked状态。

第二步做线程dump生成快照文件,在文件中搜索"blocked"关键字,统计有多少blocked线程。

第三步查看这些线程的堆栈信息,找到是在等待什么锁、哪行代码导致的阻塞。

第四步分析业务代码,看是否锁粒度太大、是否有不必要的同步操作。

我在电商项目压测时,发现50个线程都blocked,线程dump后发现都在等待日志打印的锁,优化后问题解决。


# 5. 如何定位数据库慢查询问题?

答案话术: 定位数据库慢查询分五步:

第一步开启慢查询日志,配置long_query_time阈值比如1秒。

第二步用mysqldumpslow工具分析慢查询日志,找出耗时最长、出现次数最多的SQL。

第三步对慢SQL用EXPLAIN分析执行计划,重点看type字段,如果是ALL说明全表扫描。

第四步检查相关字段是否有索引,联合索引是否失效。

第五步优化SQL,加索引或改写查询语句,再次EXPLAIN验证。

我在电商项目中,发现订单查询SQL扫描10万行数据,加了product_id和status的联合索引后,扫描行数降到100行,响应时间从3秒降到50ms。


# 6. 什么是性能拐点?如何找到性能拐点?

答案话术: 性能拐点是指系统性能从平稳上升转为下降或不再增长的临界点。

找性能拐点的方法是阶梯式加压:从50并发开始,逐步加到100、200、300、400,每个阶段持续5-10分钟。

观察三个现象判断拐点:第一是TPS不再增长或开始下降;第二是响应时间急剧上升;第三是错误率开始增加。

我在电商项目压测支付接口时,发现并发从200加到400时,TPS从750只涨到800就不增长了,响应时间从100ms突增到500ms,这就是性能拐点,说明极限TPS在800左右。


# 7. 压测时发现内存持续增长怎么办?

答案话术: 内存持续增长可能是内存泄漏,我会这样排查:

第一步用jstat -gcutil监控GC情况,查看老年代使用率是否持续上升。

第二步观察Full GC频率,如果越来越频繁但内存回收越来越少,基本确定是泄漏。

第三步用jmap -histo查看哪些对象占用内存最多。

第四步做堆dump,用jmap -dump命令生成.hprof文件。

第五步用jvisualvm或MAT工具分析堆dump,查看对象引用链,找到为什么没被回收。

我在电商项目遇到过订单对象被静态Map引用导致内存泄漏,改用Guava Cache设置过期时间后解决。


# 8. 如何分析Full GC频繁的问题?

答案话术: Full GC频繁主要有三个原因:

第一是堆内存设置太小,老年代很快就满了。可以通过-Xms -Xmx调大堆内存。

第二是内存泄漏,对象无法被回收导致老年代持续增长。需要做堆dump分析具体对象。

第三是代码问题,创建大量临时对象或大对象直接进入老年代。需要优化代码减少对象创建。

判断方法是用jstat -gcutil查看GC统计,如果Full GC每次回收的内存越来越少,说明是内存泄漏;如果能回收但频率高,说明是内存不够或对象过多。

我在电商项目优化后,Full GC从5分钟一次降到2小时一次。


# 9. 如何定位接口响应慢的具体代码位置?

答案话术: 定位慢代码主要用JProfiler或JVisualVM性能分析工具。

第一步在压测时启动JProfiler连接到应用。

第二步查看CPU Profiling,可以看到每个方法的执行时间和调用次数。

第三步按照耗时排序,找到耗时最长的方法。

第四步查看调用树Call Tree,分析方法的调用链路,定位到具体哪行代码慢。

我在电商项目中,用JProfiler发现订单计算方法耗时2秒,深入分析后发现是循环调用数据库查询,优化成批量查询后降到50ms。


# 10. 压测时错误率突然升高怎么分析?

答案话术: 错误率升高我会从三个方面分析:

第一是查看错误类型,是超时、连接失败还是业务错误。在JMeter的View Results Tree查看具体错误信息。

第二是查看应用日志,搜索ERROR关键字,看是什么异常,比如数据库连接超时、线程池满等。

第三是查看监控指标,看是不是服务器资源耗尽、数据库连接池满、线程池满导致的。

我在电商项目压测时,错误率从0%突然涨到5%,查日志发现是数据库连接池只设了50,并发高时连接不够,改成200后错误率降到0%。


# 11. 如何分析数据库连接池不够的问题?

答案话术: 数据库连接池不够的现象是:应用日志报"Could not get JDBC Connection"或"Connection pool exhausted"错误。

分析方法是:第一步用show processlist查看当前数据库连接数,如果接近最大值说明连接池不够。

第二步检查应用的连接池配置,比如Druid或HikariCP的maxActive设置。

第三步分析是否有连接泄漏,连接使用后没有正常释放。

第四步评估是否需要增加连接数,根据压测并发量和业务特点调整。

我在电商项目中,把连接池从50改成200,同时设置了连接超时时间和空闲回收,解决了连接池不够的问题。


# 12. 如何判断是前端问题还是后端问题?

答案话术: 判断前后端问题主要通过抓包分析:

Web项目用浏览器F12开发者工具,查看Network标签,看接口请求的时间。如果Waiting时间长说明后端处理慢,是后端问题;如果Content Download时间长说明是网络或前端渲染慢。

App项目用Fiddler或Charles抓包,同样分析接口响应时间。

也可以直接用JMeter压测后端接口,如果接口本身很快说明是前端问题;如果接口慢说明是后端问题。

我在电商项目中,发现页面加载慢,F12查看后发现是前端请求了20多个接口,每个接口都很快,但总时间长,最后优化成批量接口解决。


# 13. Redis缓存命中率低怎么优化?

答案话术: Redis命中率低说明大量请求穿透到数据库,影响性能。

优化方法有四个:第一是优化缓存key的设计,确保能准确命中。

第二是调整缓存过期时间,如果过期太快会导致频繁缓存失效。

第三是预热缓存,在压测前把热点数据提前加载到Redis。

第四是分析哪些数据命中率低,是否适合缓存,对于频繁变化的数据可能不适合缓存。

我在电商项目中,发现商品详情缓存命中率只有60%,分析后发现过期时间设置太短,改成1小时后命中率提升到95%。


# 14. 如何定位网络瓶颈问题?

答案话术: 定位网络瓶颈主要查看网络流量和延迟:

第一步用ifstat或iftop查看网卡流量,如果接近带宽上限说明网络是瓶颈。比如千兆网卡接近125MB/s就满了。

第二步用ping测试网络延迟,如果延迟很高或丢包严重说明网络有问题。

第三步检查网络设备,路由器、交换机是否有瓶颈。

第四步分析数据传输量,是否返回数据太大,可以优化压缩或减少返回字段。

我在电商项目压测时,发现响应时间突然变慢,查看网络流量发现接近带宽上限,优化返回数据大小后解决。


# 15. 消息队列MQ堆积怎么处理?

答案话术: MQ消息堆积说明生产速度大于消费速度,处理方法有:

第一是增加消费者数量,提高消费能力。比如从5个消费者增加到10个。

第二是优化消费逻辑,看是否有慢SQL、外部调用等耗时操作,能并行的改成并行处理。

第三是检查消费者状态,是否有消费者宕机或消费异常。

第四是评估生产速度,是否可以限流或削峰。

我在电商项目中,发现订单消息堆积10万条,排查后发现是消费逻辑中有同步调用外部接口很慢,改成异步后堆积很快消化。


# 16. 如何分析线程池配置不合理的问题?

答案话术: 线程池配置不合理的现象是:大量请求超时或被拒绝,但服务器资源CPU、内存都不高。

分析方法是:第一步查看应用日志,看是否有"线程池已满"或"RejectedExecutionException"错误。

第二步用jvisualvm查看活动线程数,如果线程数一直在上限波动说明线程池不够。

第三步分析业务特点,如果是IO密集型任务,线程数应该设置得大一些;如果是CPU密集型,线程数接近CPU核心数即可。

我在电商项目中,Tomcat线程池只设了50,压测时大量超时,改成200后解决。核心线程200,最大线程500,队列1000是比较合理的配置。


# 17. 如何排查磁盘IO瓶颈?

答案话术: 排查磁盘IO瓶颈分五步:

第一步用iostat -x查看磁盘使用率,如果util接近100%说明磁盘很忙。

第二步用iotop查看是哪个进程在频繁读写磁盘。

第三步检查应用日志,是否日志级别设置太低,写入过于频繁。

第四步检查数据库,是否数据库缓存不够导致频繁磁盘读写。

第五步考虑优化方案,比如提升日志级别、使用SSD硬盘、增加数据库缓存。

我在电商项目遇到过磁盘IO 100%,排查后发现是日志设成DEBUG级别,每秒写几万行,改成INFO后IO降到10%。


# 18. 压测时如何定位是哪个系统的瓶颈?

答案话术: 电商系统通常是微服务架构,涉及多个系统交互,定位瓶颈需要逐层排查:

第一步看整体链路,用链路追踪工具如Skywalking查看每个系统的耗时。

第二步看监控数据,对比各系统的CPU、内存、TPS,找出资源使用率最高的系统。

第三步分析日志,看哪个系统报错最多或日志显示处理慢。

第四步用模块隔离法,把某个系统mock掉单独测试,确定是否该系统的问题。

我在电商项目中,下单流程涉及订单、库存、支付三个系统,通过链路追踪发现库存服务耗时2秒,定位后优化了库存查询接口。


# 19. 如何分析JVM参数配置不合理的问题?

答案话术: JVM参数配置不合理主要表现在GC频繁或内存溢出。

分析方法是:第一步用jstat -gcutil查看堆内存各区域使用情况和GC统计。

第二步评估堆内存大小是否合理,一般设置为物理内存的70-80%。

第三步评估年轻代和老年代比例,一般年轻代占堆的1/3。

第四步选择合适的GC策略,高并发系统推荐G1或ZGC。

我在电商项目中,服务器32G内存但堆只设了4G,导致频繁Full GC。调整为-Xms16g -Xmx16g后,Full GC从5分钟一次降到2小时一次。


# 20. 如何综合分析定位性能瓶颈?

答案话术: 综合定位性能瓶颈我的思路是从前到后、从表象到内部:

第一层压力机本身,排除脚本、网络等问题。

第二层中间件,查看Nginx、网关的日志和响应时间分布。

第三层应用服务器,监控CPU、内存、线程状态、GC情况。

第四层数据库和缓存,查看慢查询、连接数、Redis命中率。

第五层代码层面,用JProfiler分析具体方法耗时。

通过逐层排查,结合监控工具和日志分析,最终定位到真正的瓶颈点。我在电商项目中,通过这个思路成功定位并解决了多个性能瓶颈,TPS从800提升到1200。

# 五、性能测试调优

# 1. 数据库慢查询如何优化?

答案话术: 数据库慢查询优化主要有五个方向:

第一是添加索引,对WHERE、JOIN、ORDER BY用到的字段建索引,优先使用联合索引。

第二是优化SQL语句,避免SELECT *,只查询需要的字段;避免在WHERE中使用函数导致索引失效。

第三是分页优化,大数据量分页用延迟关联或记录上次查询的最大ID。

第四是读写分离,查询走从库减轻主库压力。

第五是分库分表,单表数据量超过500万考虑分表。

我在电商项目中,订单查询SQL扫描10万行,加了product_id和status的联合索引后,扫描降到100行,响应时间从3秒降到50ms。


# 2. 如何优化线程阻塞问题?

答案话术: 线程阻塞优化主要有四个方向:

第一是减小锁粒度,不要锁整个方法或大对象,只锁必要的代码块。

第二是减少锁持有时间,在锁内部不要做耗时操作,比如不要在锁里打日志、调用远程接口。

第三是更换锁机制,把synchronized改成ReentrantLock,或者用读写锁ReadWriteLock。

第四是异步化处理,能异步的改成异步,减少同步等待。

我在电商项目遇到过日志打印导致50个线程blocked,优化方案是把同步日志框架log4j换成异步的log4j2,同时减少不必要的日志输出,TPS从700提升到800。


# 3. Redis缓存如何优化提高命中率?

答案话术: Redis缓存优化主要有五个方向:

第一是调整过期时间,根据数据变化频率设置合理的过期时间,热点数据可以设置更长。

第二是预热缓存,在高峰期前把热点数据提前加载到Redis。

第三是优化缓存key设计,确保key能精确匹配,避免查询不到。

第四是防止缓存穿透,对空值也缓存或使用布隆过滤器。

第五是防止缓存雪崩,设置随机过期时间避免大量key同时失效。

我在电商项目中,商品详情缓存命中率只有60%,调整过期时间从5分钟到1小时,同时做预热,命中率提升到95%,数据库查询量减少70%。


# 4. 如何优化JVM参数提升性能?

答案话术: JVM参数优化主要关注堆内存和GC策略:

第一是调整堆内存大小,-Xms和-Xmx设置相同值避免动态扩容,一般设置为物理内存的70-80%。

第二是调整年轻代和老年代比例,-XX:NewRatio设置老年代和年轻代比例,一般2:1。

第三是选择合适的GC策略,高并发推荐G1GC:-XX:+UseG1GC。

第四是设置GC日志方便问题排查,-Xloggc。

第五是调整线程栈大小-Xss,默认1M可以适当减小节省内存。

我在电商项目中,服务器32G内存但堆只设了4G,调整为-Xms16g -Xmx16g,使用G1GC,Full GC从5分钟一次降到2小时一次。


# 5. 数据库连接池如何优化?

答案话术: 数据库连接池优化主要四个方面:

第一是调整连接数,根据并发量设置合理的最大连接数。计算公式:核心数2到核心数4之间。比如8核CPU可以设置20-30个连接。

第二是设置合理的超时时间,连接获取超时、查询超时避免长时间等待。

第三是配置空闲连接回收,避免连接浪费,比如空闲30分钟回收。

第四是开启连接检测,定期检测连接有效性,剔除无效连接。

我在电商项目中,连接池从50改成200,设置获取超时3秒、空闲回收30分钟,解决了高并发时连接不够的问题。


# 6. 如何优化Tomcat性能?

答案话术: Tomcat优化主要四个方向:

第一是调整线程池,修改server.xml的Connector配置,maxThreads设置200-500,minSpareThreads设置50,acceptCount设置队列长度。

第二是调整JVM参数,给Tomcat分配足够的堆内存。

第三是启用NIO或APR连接器,提升IO性能。

第四是禁用AJP连接器,如果不用就注释掉减少资源占用。

我在电商项目中,Tomcat默认maxThreads只有50,高并发时大量请求超时。调整为maxThreads=200、acceptCount=1000后,能稳定支撑更高并发。


# 7. 如何优化MySQL数据库性能?

答案话术: MySQL优化主要六个方向:

第一是索引优化,给常用查询字段加索引,注意索引失效场景。

第二是配置优化,调整buffer pool大小,一般设置为物理内存的60-70%。

第三是连接数优化,增加max_connections避免连接不够。

第四是查询优化,避免全表扫描,优化JOIN查询。

第五是表结构优化,选择合适的数据类型,varchar够用就不要用text。

第六是读写分离和分库分表,分担压力。

我在电商项目中,通过加索引、调整buffer pool从2G到8G、优化慢SQL,数据库QPS从2000提升到8000。


# 8. 如何优化网络性能?

答案话术: 网络性能优化主要四个方向:

第一是升级带宽,如果网络流量接近带宽上限,考虑升级网络设备。

第二是数据压缩,对返回数据启用Gzip压缩,减少传输量。

第三是减少数据传输,优化接口返回字段,只返回必要数据,避免大量冗余字段。

第四是CDN加速,静态资源走CDN减轻服务器压力。

我在电商项目中,发现网络流量接近带宽上限,通过开启Gzip压缩、优化返回数据去掉不必要字段,网络流量减少40%。


# 9. 如何优化接口响应时间?

答案话术: 接口响应时间优化主要五个方向:

第一是数据库优化,加索引、优化SQL、增加缓存。

第二是并行处理,多个查询改成并行执行而不是串行。

第三是减少远程调用,能批量调用就批量,能本地缓存就缓存。

第四是异步处理,非核心流程改成异步MQ处理。

第五是代码优化,减少循环查询数据库,改成批量查询。

我在电商项目中,订单详情接口响应2秒,优化后:加Redis缓存、多个查询改并行、批量查询替代循环查询,响应时间降到80ms。


# 10. 消息队列如何优化提升吞吐量?

答案话术: 消息队列优化主要四个方向:

第一是增加消费者数量,提高并行消费能力。

第二是批量消费,一次拉取多条消息批量处理,减少网络开销。

第三是优化消费逻辑,去掉不必要的同步等待,能异步就异步。

第四是合理设置线程数,消费者线程数根据CPU核数设置。

我在电商项目中,订单消息消费慢导致堆积,优化方案:消费者从5个增加到10个,改成批量消费每次50条,消费逻辑中的外部接口调用改异步,吞吐量提升3倍。


# 11. 如何优化Full GC频繁的问题?

答案话术: Full GC频繁优化主要四个方向:

第一是增加堆内存,如果堆内存太小会频繁Full GC。

第二是调整年轻代大小,年轻代太小会导致对象过早进入老年代。

第三是优化代码,减少大对象创建,避免内存泄漏。

第四是更换GC策略,从CMS改成G1GC性能更好。

我在电商项目中,Full GC每5分钟一次严重影响性能。优化方案:堆内存从4G调到16G,使用G1GC,修复了一个对象缓存没释放的内存泄漏,Full GC降到2小时一次,响应时间稳定。


# 12. 如何优化高并发下的库存扣减问题?

答案话术: 高并发库存扣减优化主要三个方向:

第一是Redis预扣库存,先在Redis扣减,成功后异步更新数据库,避免直接操作数据库。

第二是使用分布式锁,Redis或Zookeeper实现分布式锁保证扣减准确性。

第三是消息队列削峰,把扣减请求放到队列慢慢消费,避免瞬时压力过大。

我在电商项目秒杀场景中,原来直接操作数据库,并发500就出现超卖。优化后改用Redis+Lua脚本原子扣减,配合消息队列异步更新数据库,支撑5000并发无超卖。


# 13. 如何优化日志打印对性能的影响?

答案话术: 日志打印优化主要四个方向:

第一是提升日志级别,生产环境用INFO或WARN,不要用DEBUG。

第二是减少不必要日志,不要在循环里打日志,不要打印大对象。

第三是异步日志,把log4j改成log4j2异步日志,避免同步写日志阻塞线程。

第四是日志轮转和压缩,避免单个日志文件过大影响IO。

我在电商项目中,发现大量线程blocked,定位后是日志打印导致。优化方案:日志级别从DEBUG改INFO,log4j换log4j2,移除循环中的日志,TPS从700提升到800,线程阻塞消失。


# 14. 如何优化大数据量分页查询?

答案话术: 大数据量分页优化主要三个方向:

第一是延迟关联,先查主键ID再关联查详情。比如:SELECT * FROM orders WHERE id IN (SELECT id FROM orders LIMIT 10000,10)。

第二是记录上次查询位置,用WHERE id > last_id LIMIT 10避免深度分页。

第三是使用搜索引擎,数据量特别大时用ElasticSearch做分页。

我在电商项目中,订单列表分页到1万页时查询超过5秒。优化后改用延迟关联,响应时间降到200ms。


# 15. 如何优化接口加解密性能?

答案话术: 接口加解密优化主要三个方向:

第一是选择高效算法,RSA加解密慢,可以用AES对称加密性能更好。

第二是减少加解密次数,不是所有字段都需要加密,只加密敏感信息。

第三是缓存加密结果,相同内容的加密结果可以缓存避免重复计算。

我在电商项目支付接口中,原来用RSA加密整个报文,QPS只有100。优化后改用AES对称加密,只加密敏感字段,QPS提升到800。


# 16. 如何优化线程池配置?

答案话术: 线程池配置优化主要四个方面:

第一是核心线程数,CPU密集型设置为CPU核数+1,IO密集型设置为CPU核数*2。

第二是最大线程数,一般是核心线程数的2-3倍。

第三是队列长度,根据业务特点设置,可以设置1000-5000。

第四是拒绝策略,建议用CallerRunsPolicy让调用线程执行任务。

我在电商项目中,Tomcat线程池核心50最大75队列100,高并发时大量拒绝。优化为核心200最大500队列1000,支撑能力提升5倍。


# 17. 如何优化静态资源加载性能?

答案话术: 静态资源优化主要四个方向:

第一是使用CDN,把图片、CSS、JS等静态资源放CDN,就近访问加速。

第二是开启浏览器缓存,设置合理的Cache-Control减少重复请求。

第三是资源压缩,对CSS、JS进行压缩合并,减少文件大小。

第四是图片优化,使用WebP格式,压缩图片大小,懒加载图片。

我在电商项目中,商品详情页加载慢,优化后图片走CDN、开启Gzip压缩、图片懒加载,页面加载时间从5秒降到1秒。


# 18. 如何优化代码层面的性能问题?

答案话术: 代码层面优化主要五个方向:

第一是减少循环查询数据库,改成批量查询。比如循环查100次改成一次查100条。

第二是避免在循环中创建对象,对象复用减少GC压力。

第三是使用合适的数据结构,查找操作多用HashMap,有序用TreeMap。

第四是字符串拼接用StringBuilder,不要用+号拼接。

第五是合理使用缓存,频繁计算的结果缓存起来。

我在电商项目中,订单详情接口循环查询商品信息100次,改成一次批量查询后,响应时间从2秒降到50ms。


# 19. 如何优化服务间调用性能?

答案话术: 服务间调用优化主要四个方向:

第一是减少调用次数,能批量调用就批量,能合并接口就合并。

第二是并行调用,多个独立调用改成并行而不是串行。

第三是设置合理超时时间,避免一个慢服务拖垮整个链路。

第四是使用缓存,对变化不频繁的数据缓存起来。

我在电商项目中,订单接口串行调用用户、商品、库存三个服务,总耗时1.5秒。改成并行调用+Redis缓存用户和商品信息,响应时间降到300ms。


# 20. 性能优化的整体思路和优先级是什么?

答案话术: 性能优化我的整体思路是先易后难、先外后内:

第一优先级是数据库优化,加索引、优化SQL,这是见效最快的。

第二优先级是缓存优化,Redis缓存减少数据库查询。

第三优先级是代码优化,消除循环查询、批量处理、并行调用。

第四优先级是架构优化,读写分离、分库分表、消息队列削峰。

第五优先级是硬件优化,升级CPU、内存、更换SSD硬盘。

每次优化后都要压测验证效果,确保优化有效。我在电商项目中,通过这个思路系统性优化,TPS从800提升到1500,响应时间从500ms降到100ms,满足了业务需求。


🔗测试开发训练营 (opens new window):针对面试求职的测试开发训练营,大厂导师 1v1 私教,帮助学员从 0 到 1 拿到测开满意的 offer

  • ✅直播授课+实时互动答疑,课程到就业贯穿企业级案例,由测试开发导师全程主讲,绝无其他助理老师代课。
  • ✅大厂测试开发导师一对一求职陪跑,覆盖课程答疑+简历打磨+面试模拟面试+面试复盘等求职辅导

最新的图解文章都在公众号首发,别忘记关注哦!!如果你想加入百人技术交流群,扫码下方二维码回复「加群」。

img

上次更新: 12/2/2025