如何根据业务量精准分配内存配置Nginx proxy_cache_path的keys_zone?
- 内容介绍
- 文章标签
- 相关推荐
本文共计809个文字,预计阅读时间需要4分钟。
keys_zone 分配的内存只存储缓存 key 和元数据(例如访问次数、过期时间),不存在响应实体本身。1MB 共享内存 + 存 8000 个 key。如果您的业务每秒产生 100 个唯一 URL,按 1 小时内不重复计算,就是 36 万 key;按 1 天计算,就是 864 万 key — 此时 keys_zone=my_cache:1m 显然不足,会导致频繁淘汰 key,降低缓存命中率。
怎么算出实际需要的 keys_zone 大小
先确认你最关心的缓存粒度:是按 $uri?还是带完整 query 的 $scheme$host$uri$is_args$args?粒度越细,key 越多。再结合业务日志估算:
- 用
awk '{print $7}' access.log | sort -u | wc -l粗略统计一天内独立 URI 数量 - 若启用了
proxy_cache_key "$scheme$host$uri$is_args$args",再用awk -F'"' '{print $2}' access.log | awk '{print $1,$2}' | sort -u | wc -l估算带参数的唯一请求量 - 把结果除以 8000,向上取整,就是所需 MB 数。
本文共计809个文字,预计阅读时间需要4分钟。
keys_zone 分配的内存只存储缓存 key 和元数据(例如访问次数、过期时间),不存在响应实体本身。1MB 共享内存 + 存 8000 个 key。如果您的业务每秒产生 100 个唯一 URL,按 1 小时内不重复计算,就是 36 万 key;按 1 天计算,就是 864 万 key — 此时 keys_zone=my_cache:1m 显然不足,会导致频繁淘汰 key,降低缓存命中率。
怎么算出实际需要的 keys_zone 大小
先确认你最关心的缓存粒度:是按 $uri?还是带完整 query 的 $scheme$host$uri$is_args$args?粒度越细,key 越多。再结合业务日志估算:
- 用
awk '{print $7}' access.log | sort -u | wc -l粗略统计一天内独立 URI 数量 - 若启用了
proxy_cache_key "$scheme$host$uri$is_args$args",再用awk -F'"' '{print $2}' access.log | awk '{print $1,$2}' | sort -u | wc -l估算带参数的唯一请求量 - 把结果除以 8000,向上取整,就是所需 MB 数。

