近日,Apoxy 团队在为客户升级 Envoy 代理时发现,CPU 使用量异常增加了约 20%。经排查,问题根源在于 Envoy v1.34 版本将默认的 HTTP/2 编解码器从 `nghttp2` 切换到了 Google 的 `oghttp2`。尽管两者功能一致,但在高流量压测下,`oghttp2` 在处理头部解压(HPACK)时出现了显著的性能回退。文章通过火焰图深入剖析,指出问题并非出在霍夫曼解码算法本身,而是 C++ 实现中的“管道开销”。`oghttp2` 在解码过程中过度依赖 `std::string::push_back` 进行逐字节写入,导致频繁的内存分配检查,且头部块处理涉及多层哈希查找和内存拷贝。相比之下,`nghttp2` 采用查表法的有限状态机直接写入预分配缓冲区,避免了不必要的开销。这一差异导致在头部密集型代理流量中,CPU 效率出现了显著的倒退。目前 Envoy 团队已在 v1.37 版本中回滚了默认设置,并承诺待 `oghttp2` 性能对齐后再行切换。
事件分析
💡 核心观点:基础设施升级不仅是依赖库版本号的变化,更是对底层内存管理与代码实现细节的极限审视。
原文链接:Hacker News





