网站性能测试的目的,是在上线前后摸清系统的响应速度、稳定性和并发承载能力。只有通过科学测试找到真实的瓶颈,后续的优化动作才不会是无的放矢。这篇文章将围绕加载测试、压力测试、稳定性测试三条主线,讲清常用工具、关键判断数据以及可供直接复用的优化思路。
加载性能是用户对网站的第一感知,直接左右跳出率。目前主流的测试手段包括 Lighthouse、WebPageTest 以及 Chrome DevTools 自带的性能面板。测试时建议在 DevTools 中开启 CPU 降速和网络节流,模拟中低端移动设备的真实环境。
拿到 Lighthouse 报告后,不要只看总分,而要逐项核对关键指标。首次内容绘制(FCP)应控制在 1.8 秒内,最大内容绘制(LCP)则是 2.5 秒的及格线。如果 LCP 超标,优先排查服务器首包时间(TTFB)和主图片的加载方式;如果累积布局偏移(CLS)高于 0.1,通常是因为图片或广告位没有预留尺寸,导致文字在加载过程中被挤动。
实验室测试(如 Lighthouse)环境固定,结果的可比性强,适合开发阶段反复验证代码改动。但它的局限性在于无法覆盖真实用户的网络波动和设备差异。因此,线上站点应接入真实用户监控(RUM)工具,长期采集 LCP、CLS、交互延迟(INP)等现场指标。推荐的做法是:每次发版前用 Lighthouse 做回归,发版后用 RUM 持续观察一周,将两者数据对照来看,才能确认优化是否真正改善了用户体验。
压力测试要回答的核心问题是:系统到底能扛住多少并发请求而不崩溃。Apache JMeter、k6 和 Locust 是使用最广的三款工具。测试前最重要的一步是定义业务场景,不能只压测一个静态首页接口。
建议把用户的核心操作路径串联起来,例如"搜索商品→查看详情→加入购物车→发起结算"。同时要对请求参数做变量化处理,比如使用随机生成的用户 ID 和商品编号,避免因缓存命中导致测试结果虚高。并发目标可以参考日活峰值的 2 到 3 倍进行设定,这样能为大促或突发流量留出安全余量。
压测过程中需要同时观察应用服务器、数据库、缓存及负载均衡器的状态。一个常见的误区是只盯着应用 CPU,忽略了数据库连接数被打满的情况。如果发现事务错误率超过 5%,或者响应时间出现断崖式上升,应立即停止加压并采集堆栈信息。若数据库连接数率先达到上限,优先考虑调整连接池参数或增加只读副本;若 CPU 持续满载,则需要通过火焰图排查低效的代码逻辑。
稳定性测试又称浸泡测试,目的是让系统在 60% 到 80% 的负载下持续运行数小时甚至数天,重点观察内存占用、垃圾回收频率和响应时间的退化趋势。很多系统在短时压测中表现良好,却在连续运行数小时后因内存泄漏变得卡顿,这正是稳定性测试的价值所在。
利用 Prometheus 搭配 Grafana 持续记录堆内存使用量。如果内存曲线呈现阶梯式上升,而不是周期性的锯齿波动,说明存在明显的内存泄漏。此时应抓取堆转储文件,使用分析工具查看对象引用链,定位是缓存未设置过期时间,还是静态集合类误用了全局变量。测试期间还应开启慢查询日志和 GC 日志,便于事后回溯。
合理的测试节奏应该是:开发阶段每次提交都跑一次 Lighthouse 快速检查;每周做一次完整的压力回归;每次大版本上线前安排至少 24 小时的稳定性测试。测试环境务必与生产环境保持同配置或等比例缩配,否则压力测试得出的结论不具备参考价值。
此外,压测前要检查测试机本身的性能瓶颈。很多团队忽略了施压机(即运行 JMeter 或 k6 的机器)的资源限制,导致压力还没到目标,施压机自己先崩溃了。建议使用分布式压测模式,或将施压机部署在与被测系统不同的机房。
这通常是因为 Lighthouse 运行在高性能本机上,默认网络带宽充足,无法体现中低端手机在弱网环境的真实情况。解决方案是在 DevTools 中手动设置较慢的 CPU 倍率和 3G 网络预设,并配合 RUM 工具收集线上真实用户的分位数数据,重点关注 P75 或 P90 的 LCP 值。
这多见于缓存命中率异常高的场景。如果压测脚本未做参数化,所有请求都命中同一个缓存键,应用服务器负载很低,但底层数据库或分布式缓存的单点压力会被掩盖。正确的做法是使用多个参数组合排除缓存影响,并单独对用户登录态、鉴权等不可缓存的接口进行专项压测。
没有统一的固定时长,但至少应覆盖一个完整的业务周期。例如电商平台应覆盖一次日常促销活动的全天流量高峰。就经验而言,连续运行 8 小时是底线,24 小时以上更能暴露慢速泄漏问题。判断有效性的标准是:内存曲线保持平稳或周期性波动,且平均响应时间与测试开始时相比无明显劣化。
性能优化不是一次性项目,而是一套持续迭代的流程。建议先从加载性能测试入手,借助 Lighthouse 快速定位前端资源的优化空间;随后通过压力测试摸清系统的并发上限并解决代码层瓶颈;最后用稳定性测试确保长跑不掉链子。每完成一轮优化,都要重新执行测试并记录数据用于前后对比。把性能指标纳入日常开发的门禁检查,比事后补救要省力得多。