如何用limit_req_zone和$binary_remote_addr节省50%内存空间?
- 内容介绍
- 相关推荐
本文共计748个文字,预计阅读时间需要3分钟。
直接使用 `$binary_remote_addr` 替代 `$remote_addr` 作为 `limit_req_zone` 的 key,可以在共享内存中节省超过 50% 的空间——这不是优化技巧,而是 Nginx 底层数据存储机制决定的固有优势。
为什么 $binary_remote_addr 更省内存
Nginx 的限流状态(每个客户端的计数、时间戳、哈希指针等)都存在共享内存 zone 中。真正吃内存的,是 key 字段本身:
-
$remote_addr是字符串,IPv4 如"192.168.1.1"占 11 字节,IPv6 如"2001:db8::1"最长可达 39 字节;Nginx 需按最大长度预留缓冲 + 字符串管理开销 -
$binary_remote_addr是二进制值:IPv4 固定 4 字节,IPv6 固定 16 字节;无编码、无终止符、无动态分配,直接 memcpy 到哈希节点 - 实测单个 key 在 IPv4 环境下,从平均 32–40 字节降至约 12–16 字节(含结构体头),综合节省超 50%
真实内存占用怎么算
别再信“1MB ≈ 1 万个 IP”这种粗略估算。
本文共计748个文字,预计阅读时间需要3分钟。
直接使用 `$binary_remote_addr` 替代 `$remote_addr` 作为 `limit_req_zone` 的 key,可以在共享内存中节省超过 50% 的空间——这不是优化技巧,而是 Nginx 底层数据存储机制决定的固有优势。
为什么 $binary_remote_addr 更省内存
Nginx 的限流状态(每个客户端的计数、时间戳、哈希指针等)都存在共享内存 zone 中。真正吃内存的,是 key 字段本身:
-
$remote_addr是字符串,IPv4 如"192.168.1.1"占 11 字节,IPv6 如"2001:db8::1"最长可达 39 字节;Nginx 需按最大长度预留缓冲 + 字符串管理开销 -
$binary_remote_addr是二进制值:IPv4 固定 4 字节,IPv6 固定 16 字节;无编码、无终止符、无动态分配,直接 memcpy 到哈希节点 - 实测单个 key 在 IPv4 环境下,从平均 32–40 字节降至约 12–16 字节(含结构体头),综合节省超 50%
真实内存占用怎么算
别再信“1MB ≈ 1 万个 IP”这种粗略估算。

