http2_streams_index_size控制每个HTTP/2连接中流索引哈希表的初始桶数量,必须为2的幂,默认32;影响内存占用与哈希查找效率,建议根据平均活跃流数设为64或128。

在 Nginx 中启用 HTTP/2 后,http2_streams_index_size 是一个容易被忽视但对内存使用有显著影响的调优参数。它不直接控制并发流数量,而是影响每个 HTTP/2 连接内部用于快速查找活跃流(stream)的哈希表大小。设置不当会导致内存浪费或哈希冲突上升,间接影响性能。
这个参数到底管什么?
http2_streams_index_size 指定每个 HTTP/2 连接维护的流索引哈希表的初始桶(bucket)数量。Nginx 用这张表高效定位某个 stream ID 对应的内存结构(如 stream 对象、缓冲区等)。该值必须是 2 的幂(如 32、64、128、256),默认为 32。
注意:它不是“最多支持多少个流”,HTTP/2 流上限由 http2_max_concurrent_streams 控制;它也不是全局配置,而是按连接分配——每个客户端 TCP 连接都会独立创建一张这么大的哈希表。
内存开销怎么算?实际影响有多大?
每张哈希表占用内存 ≈ http2_streams_index_size × 8 字节(64 位系统下每个 bucket 是一个指针)。看起来很小,但乘以并发连接数后不可忽略:
- 默认 32 → 单连接约 256 字节
- 设为 256 → 单连接约 2 KB
- 1 万并发连接时,仅这一项就多占约 20 MB 内存(256 − 32)× 8 × 10000
更关键的是:如果值太小,哈希冲突变多,查找 stream 变慢;太大则空桶多,浪费内存且可能增加 cache miss。理想值应略大于平均单连接活跃流数(比如多数连接同时处理 10–20 个请求),通常 64 或 128 已足够。
怎么调?看监控再动手
别盲目改大。先确认是否真有必要:
- 开启
http2_idle_timeout和http2_max_requests防止连接长期滞留 - 用
nginx -V 2>&1 | grep -o http_v2确认已启用 HTTP/2 - 通过
stub_status或nginx-module-vts观察Active connections和Reading/Writing/Waiting分布,估算典型连接的并发请求数 - 压测时用
pstack或perf抽样,若发现ngx_http_v2_lookup_stream占比异常高,可能是哈希查找效率低,值得调优
建议起步值设为 64,观察内存增长和延迟 P95 是否改善;超过 128 很少带来收益,除非你明确看到大量长连接维持上百活跃流。
和其他 HTTP/2 参数协同考虑
单独调 http2_streams_index_size 效果有限,需配合以下设置:
-
http2_max_concurrent_streams 100:限制单连接最大流数,防止恶意客户端耗尽索引空间 -
http2_recv_buffer_size 128k:避免小 buffer 导致频繁拷贝,减轻 stream 处理压力 -
worker_connections 10240且events { use epoll; }:确保底层能支撑高并发连接 - 关闭不必要的 HTTP/2 特性,如不用服务器推送就设
http2_push off
调整后记得用 nginx -t 校验,并 reload 而非 restart,避免连接中断。

















