1.
目标与范围定义
明确测试目标(并发用户数、最大请求率RPS、响应时间SLA、错误率阈值)。列出场景:登录鉴权、列表拉取、图片上传、长连接/Socket、推送(APNs)、后台拉取等。确定测试环境(测试环境应与生产网络拓扑尽量一致),并标注禁用缓存或CDN的情况以便测出真实后端承载力。
2.
指标与观测点
定义关键指标:吞吐量(Req/s)、延迟(p50/p90/p95/p99)、成功率(2xx比例)、并发连接数、CPU/内存/磁盘IO/网卡带宽、TCP TIME_WAIT与连接数、数据库慢查询、队列长度。为每项指标设定告警阈值与SLA。
3.
工具选型与环境准备
推荐工具:k6(轻量脚本化,支持JS)、JMeter(GUI、插件)、locust(Python)、wrk(简单压测)、Fortio。监控:Prometheus+Grafana、node_exporter、cadvisor、vmstat/iostat、ss/netstat、tcpdump。准备多台负载机(AWS/阿里云/腾讯云 EC2/ ECS),保证公网出站带宽足够并配置相同时区与NTP同步。
4.
模拟真实iOS客户端行为
确保脚本包含真实请求头(User-Agent、Accept、Connection、Accept-Encoding)、TLS设置(HTTP/2多路复用)、Keep-Alive、Cookie或JWT刷新逻辑、请求间隙(think time)、断开与重连、上传分片与并发上传。对WebSocket或长连接测试需保留连接并模拟心跳。
5.
测试数据准备
准备可重用账号池、预生成JWT或OAuth token并放入CSV数据文件;避免同一资源写冲突:用参数化的对象ID或创建/销毁逻辑。示例:用脚本预先批量注册1000个测试用户并导出token.csv供压测脚本读取。
6.
编写k6示例脚本并运行
示例流程:在本地写tests.js,使用http.batch模拟并发请求;通过__VU和__ITER做变量区分。运行命令:k6 run --vus 200 --duration 10m tests.js 或分布式在多台机器上分别启动并汇总结果。注意设置 TLS 客户端选项与HTTP/2支持。
7.
分布式压测策略
当单机带宽或CPU成为瓶颈时使用多台负载机。步骤:1) 在控制台生成统一脚本与数据文件;2) 将脚本分发到多台负载机(scp/ansible);3) 同步时间并使用统一启动脚本,按时间窗启动;4) 收集每台的结果到中央(InfluxDB/Grafana或k6 cloud)。
8.
压测流程(阶段化)
1) 基线测试:低速率(RPS)验证功能和数据正确性;2) 递增测试(Ramp-up):每5分钟提升10%-20%负载,观察响应与错误率;3) 稳态浸泡(Soak):在目标并发下运行若干小时检测内存泄漏与资源积累;4) 峰值与突发(Spike):快速增加到峰值并回落;5) 压力到崩溃(Stress):持续提升直到系统失效并记录断点。
9.
监控与日志收集
同时启动服务器端监控采集(Prometheus采集CPU/内存/线程/GC/连接池/DB连接数)、应用日志(带RequestID)和网络抓包(tcpdump在故障时)。用Grafana看面板:请求率、错误率、延迟百分位、系统资源和数据库慢查询。
10.
定位瓶颈与分析方法
结合时间轴比对:请求峰值对应CPU或IO飙升、连接耗尽、数据库慢查询或锁等待。用ss/netstat查看socket状态,用iostat/vmstat看IO与swap,用top/htop看线程阻塞。若是TLS握手成为瓶颈,考虑启用TLS硬件加速或减少握手频次(session resumption)。
11.
压测执行中的常见问题与解决
常见问题:负载机成为瓶颈(检查网卡/CPU)、脚本逻辑有阻塞、测试数据冲突、缓存导致结果不真实。解决方式:增加负载机、调整脚本为无阻塞、采用独立资源、关闭缓存或在测试前清空缓存。
12.
结果报告与优化建议
报告应包含测试场景、配置、时间线、关键指标(p50/p90/p95/p99)、错误明细、瓶颈定位及复现步骤、建议优化(增加连接池、数据库索引、异步化、分片与限流策略、扩容方案)。提供复测计划验证优化效果。
13.
问:如何测量iOS APP在后台状态下的服务器并发承载能力?
答:模拟后台Fetch与静默推送场景,脚本保持低频短连接周期并混入短时高并发拉取。确保使用APNs推送触发逻辑并测量服务端推送并发与响应,监控连接数与短连接频繁建立的影响。
14.
问:如果压测过程中发现大量TCP TIME_WAIT或连接耗尽,怎么处理?
答:调整内核参数(如net.ipv4.tcp_tw_reuse、tcp_tw_recycle在老内核)、增加可用端口范围、开启长连接/HTTP keep-alive或HTTP/2复用,优化应用层连接池,或使用Nginx/Envoy做连接复用和负载分担。
15.
问:如何保证压测结果真实且可复现?
答:保持测试环境与生产一致(网络、数据库规模、缓存策略)、使用真实或接近真实的数据、固定随机种子、记录完整时间序列监控、保存脚本和数据集并在每次测试前重置环境。创建标准化压测报告模板以便对比。
来源:性能测试苹果系统APP的服务器并发承载能力与压测方案