nginx 缓存更新并发测试核心是验证过期/刷新/清除场景下是否低延迟响应、不阻塞请求、不引发后端雪崩;需配置proxy_cache_use_stale updating与proxy_cache_background_update on,压测中观察x-cache-status状态流转及后端qps平稳性。

测试缓存更新期间的并发表现,核心是验证 Nginx 在缓存过期、后台刷新(proxy_cache_use_stale updating)、或主动失效(如 proxy_cache_purge)等场景下,是否能持续提供低延迟响应、不阻塞请求、不引发后端雪崩。重点不是“缓存有没有更新”,而是“更新过程中用户和后端是否被妥善保护”。
模拟缓存过期与后台刷新行为
配置中启用 stale 更新机制,是测试并发更新能力的前提:
- 在
location块中添加:proxy_cache_use_stale updating error timeout http_500; - 配合
proxy_cache_background_update on;,确保过期后新请求不等待,由后台 worker 异步回源 - 用压测工具(如
wrk -t4 -c200 -d60s http://your.site/)持续发起请求,同时手动触发缓存过期(例如修改 upstream 返回头中的Cache-Control: max-age=10并 reload 配置,或等待原有缓存自然过期) - 观察响应头中
X-Cache-Status:应出现STALE(返回旧内容)→UPDATING(后台刷新中)→HIT(新内容就绪),且整个过程无 5xx 或明显延迟跳变
压测 purge 操作下的高并发稳定性
当主动清除缓存(如通过 ngx_http_cache_purge_module)时,需验证 purge 不会成为性能瓶颈:
- 配置 purge 路由(如
location ~ /purge(/.*)),并限制访问来源(allow 127.0.0.1;) - 先预热缓存(用 wrk 请求目标 URL 数百次,确保大量
HIT) - 在压测进行中执行
curl -X PURGE http://your.site/api/data - 检查三项指标:① purge 命令返回是否秒级完成(不应卡顿);② 后续请求是否全部转为
MISS并快速重建(而非集体阻塞);③ 后端 QPS 是否平稳上升(避免瞬时打满)
监控关键状态与资源竞争点
缓存更新并发问题常表现为锁竞争或磁盘 I/O 阻塞,需针对性观测:
- 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,留意cache lock failed、cache file busy等提示,说明多请求争抢同一 cache key 的写锁 - 检查磁盘 I/O:用
iostat -x 1观察%util和await,若缓存目录所在磁盘 await 持续 >20ms,可能因inactive时间过短或缓存项过多导致频繁淘汰+写入 - 确认缓存 key 设计合理:避免把用户身份、时间戳等高频变动字段纳入
proxy_cache_key,否则看似“更新”,实则是大量无效MISS冲击后端
对比验证:有无后台更新的延迟差异
构造对照实验,量化后台刷新的实际收益:
- 关闭后台更新:
proxy_cache_background_update off;,同样压测过期场景 → 多数请求将卡在EXPIRED状态,等待首个回源完成,P99 延迟显著升高(如从 15ms 升至 400ms) - 开启后台更新后重测 → P99 应基本维持在
STALE或HIT水平( - 用 access 日志统计不同
$upstream_cache_status的占比,确认UPDATING出现频率与预期一致(通常











