【问题标题】:What is the overhead in nginx to proxy an HTTP/2 request to an HTTP/1.1 request?nginx 中将 HTTP/2 请求代理到 HTTP/1.1 请求的开销是多少?
【发布时间】:2021-12-30 15:21:45
【问题描述】:

我有一个 Nginx 代理服务器。当 HTTP/2 请求到达服务器并且在缓存中没有找到任何内容时,服务器会使用 HTTP/1.1 向源服务器发出出站请求。当从一个协议版本转换到另一个版本时,服务器是否会出现性能下降?这与 HTTP/1.1 到 Nginx 和 HTTP/1.1 到源服务器相比如何?有没有办法测量开销?

【问题讨论】:

    标签: performance nginx networking http2 http-1.1


    【解决方案1】:

    严格来说存在性能下降,因为一种协议是二进制的,另一种是纹理的。所以代理必须转换,这需要资源和时间——默认情况下你可以预期降级。

    然而,一般来说,这可能要复杂得多。假设您的代理被慢速移动连接使用。如果您的应用在转换后获得巨大的破产,谁会在意转换?或者你的代理可能对 http/1.1 进行了 gzip 转换,速度提升不是很大,另一方面,性能下降可能不是那么大?

    你能测量一下吗?可能。问题是为了什么?我会测量尽可能接近真实情况的东西。我会自动执行该测量以查看实际性能在哪里。

    在您的情况下,我唯一担心的是代理的 CPU - 只需测量它以查看随时间的变化,并设置通知 - 例如“如果 cpu 超过 80% 超过 5 分钟”。

    除此之外。 Http2带来了两种通信方式,还有push。我的假设是这不是你的情况,因为你正在比较 1.1 和 2。对我来说,我会随处使用 http2,不幸的是 nginx 不支持 http2 和后端。祈祷很快就会看到!

    【讨论】:

    • 你知道为什么nginx不支持http/2回源/下一跳吗?
    • @Eric 简而言之不知道...我前段时间在使用 SPDY,主题对我来说有些熟悉,但仅此而已。我想,这很复杂,也没有带来太多好处。我会说它类似于 GraphQL - 应该优化与客户端的慢速连接,通过移动到二进制、压缩、多路复用 - 在服务器端 - 连接应该没问题。
    【解决方案2】:

    是的,从 HTTP2 到 HTTP 1.1 会降低性能,这主要是由于协议强加的传输转换。例如,您会丢失以下传输优化:

    • 单连接
    • 请求/响应多路复用
    • 标题压缩

    此外,正如 Michal 所提到的,HTTP 1.1 消息是文本的,而 HTTP2 消息是二进制的。

    HTTP2 通过单个 连接多路复用请求和响应。然而,HTTP 1.1 只提供持久连接和请求/响应管道,这甚至是无法比拟的。例如,流水线强制消息交换的 FIFO 顺序,这会导致阻塞。

    要达到任何类似的吞吐量水平,代理必须为每个后端打开一个连接池。这些池可能很大也可能很小,但考虑到每个连接的资源分配、TCP 握手、TLS 握手等,您就会开始了解我们所讨论的开销。

    衡量缓存命中的“吞吐量输入”和缓存未命中的“吞吐量输出”之间的差异,例如“协议转换吞吐量损失”约为 23 tps。 (您还应该知道平均缓存未命中损失的时间。)

    关键指标

    • 输入吞吐量与输出输出
    • 平均缓存未命中惩罚
    • 缓存命中率和缓存未命中率

    除非你的缓存未命中率很高,否则我不会担心这个。

    【讨论】:

      【解决方案3】:

      我不认为它们会降低性能。衡量影响的一种方法(因为我无法为您测试,所以您必须这样做)是使用 AJAX,发送 http/1.1 请求并测量响应时间。然后将其与发送 http/2 请求所需的时间进行比较。做多次。 这会对你有所帮助。

      但是,请注意,它们可能是一个潜在的安全问题。 也就是说,即使安装 SSL/TLS 证书,它们也毫无意义。之所以如此,是因为 NGINX 服务器将发送的信息将向黑客开放。大概吧。

      【讨论】:

        猜你喜欢
        • 2017-06-17
        • 1970-01-01
        • 2015-04-10
        • 2019-06-28
        • 2018-08-24
        • 2011-05-31
        • 2020-05-03
        • 2020-12-18
        相关资源
        最近更新 更多