64位平台下Nginx存储TCP连接状态的内存占用大小是多少?
关于Nginx两个限流模块状态内存占用差异的说明
这不属于文档错误,两个模块标注的内存占用差异,本质是二者存储的状态数据结构完全不同,和共享键$binary_remote_addr无关。
差异来源说明
limit_conn_zone是连接数限流模块,它的状态条目只需要存储对应客户端IP的当前活跃连接计数,需要保存的元数据极少,算上哈希表节点开销、键存储开销,64位平台下单条状态固定占用64字节内存。limit_req_zone是请求频率限流模块,它的状态条目需要存储漏桶算法运行所需的全部参数:包括客户端IP键、上次请求到达的精确时间戳、当前桶内剩余可用请求数、突发请求相关统计值等,元数据字段更多,算上哈希表节点开销后,64位平台下单条状态固定占用128字节内存。
常见认知误区澄清
两个文档中提到的状态占用大小,是「键存储+模块业务状态数据+共享内存哈希表结构开销」的总和,其中作为键的$binary_remote_addr长度是固定的:存储IPv4地址占4字节,存储IPv6地址占16字节,这部分在两个模块中完全一致,内存占用差完全来自模块自身业务数据的存储需求差异。
另外文档中提到不推荐用$remote_addr做键,是因为这个变量存的是字符串格式的IP地址,长度在7-15字节之间浮动,还要额外存储字符串长度、指针等元数据,内存开销比二进制格式的$binary_remote_addr高很多,相同大小的共享内存能存储的条目数更少。
64位平台下的状态占用结论
不存在统一的TCP连接状态内存占用值,要对应到具体模块判断:
- 对
limit_conn_zone的连接计数状态:单条固定占64字节 - 对
limit_req_zone的请求限流状态:单条固定占128字节
内容的提问来源于stack exchange,提问作者Lorraine1996
相关产品推荐
相关产品推荐

