性能比拼: HTTP/2 vs. HTTP/3

本内容是对知名性能评测博主 Anton Putra HTTP/2 vs. HTTP/3 performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

在本内容中,我们将比较 HTTP/2 和 HTTP/3 协议。

我们将使用 Terraform 和 Ansible 在 Google Cloud Platform (GCP) 中创建基础设施,然后从源代码配置和编译 Nginx。

对于第一个测试,我们将使用一个包含大量图片的普通 HTML 页面。

对于第二个更贴近现实的测试,我使用了我自己的网站,该网站包含大量图片且 JavaScript 较重。

为了自动化测试,我们将使用 Playwright Node.js 框架和 Chromium 无头浏览器。当然,我们还会从测试中将指标推送到 Prometheus Pushgateway。

现在,您可以使用例如 Lighthouse 来测量很多东西,但为了简化这个测试并使其简短,我们将使用 PerformanceNavigationTiming API 接口,并且只测量页面加载时间(从 startTimeloadEventEnd)。通过使用相同的 API,您可以获取浏览器加载过程中不同事件的更详细指标。

当然,为了并排可视化指标,我们将使用 Grafana 并从 Prometheus 拉取指标。

这两种协议之间的主要区别在于 HTTP/3 使用 QUIC 传输协议,该协议基于 UDP。因此,当您创建防火墙时,不要忘记打开 443 UDP 端口,而不仅仅是 TCP 端口。

对于 GCP 中或多或少较大的项目,您通常会在一个专用的宿主项目(host project)中创建共享 VPC(Shared VPC),并将其与其他服务项目(service projects)共享。要配置防火墙,您可以使用 CIDR 范围、网络标签,或者推荐的选项是创建一个专用的服务账户,并将其用作源或目标。

现在,检查协议最简单的方法是点击“检查”(inspect)并打开网络(Network)选项卡。对于 HTTP/3,您应该看到 h3,对于 HTTP/2 则是 h2。

不幸的是,Nginx 的 HTTP/3 实现尚未进入主线(mainline)分支。如果您想尝试一下,需要克隆这个分支或下载相应的 tar 压缩包。如您所见,它正处于积极开发中。

下一步,您需要下载一些用于编译 Nginx 的依赖项,包括其中一个 OpenSSL 实现。在这个案例中,我使用的是 LibreSSL。然后我们配置 Nginx 并运行 make 进行编译。接着复制一些文件并启动 Nginx。

您可以在 我的 GitHub 仓库中 找到源代码。您也可以使用 Ansible 动态清单(dynamic inventory)在 GCP 中运行 Playbook。在 Playbook 中,您可以将虚拟机的标签(labels)用作 Ansible 的主机组(host groups)。

对于 HTTP/2,我们需要显式启用它,并且仅为了测试目的,在浏览器端禁用缓存。在 HTTP/2 和 HTTP/3 中,我们都使用 TLSv1.3,因为 HTTP/3 依赖于它。

对于 HTTP/3,我们使用 http3 指令以及 reuseport。它使得内核可以为每个套接字拥有更多的套接字监听器。升级到 HTTP/3 的主要机制是使用以下头部(headers)。这也取决于具体实现。例如,h3-27 是 HTTP/3 协议的一个草案版本。

正如我提到的,为了运行测试,我们将使用 Playwright 框架和 Prometheus 客户端将指标推送到 Pushgateway。这个测试脚本写得不是很漂亮,但能完成工作。启动一个新的无头 Chrome 浏览器实例,然后加载页面,将指标发送到 Pushgateway 并退出。然后根据需要重复此过程多次。

在这个项目中,我使用的是 GCP 的 us-central-1 区域,而我本人实际位于加利福尼亚州,这只是为了给您提供一个关于延迟的参考。

要记录指标,您还需要有 Prometheus、Pushgateway 和 Grafana。要运行它们,请使用 docker-compose up 命令。

在我们运行测试之前,让我向您展示第一个页面的样子。这是一个包含大量图片的简单页面。

好了,让我们开始运行测试。您可以立即注意到,加载这个简单页面时,HTTP/3 版本比 HTTP/2 花费的时间稍微多一点。

不仅仅是我注意到了 Nginx HTTP/3 实现的性能下降。您可以找到其他的基准测试。现在,正如我所说,Nginx 支持 HTTP/3 还处于非常早期的阶段。我相信他们会改进性能并将其移至主线分支。届时我会再次进行测试。

为了确认我们确实使用了 HTTP/3 协议,您可以检查 Nginx 的访问日志。您应该能找到 HTTP/3 版本信息。

对于第二个测试,我使用了我自己的个人网站,其中包含大量的 JavaScript 和图片。让我们开始运行它。不幸的是,页面加载时间的差异甚至更大了。

请记住,由于它正处于积极开发中,每个新的提交(commit)都可能影响性能。如果您想在生产环境中使用它,您应该亲自进行测试,或者等到它成熟并迁移到 Nginx 的主线和稳定分支。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】组件自定义事件 TodoList 自定义事件数据传输

目录 一、绑定 二、解绑 组件自定义事件总结 TodoList案例对数据传输事件的修改 总结不易~ 本章节对我有很大收获, 希望对你也是!!! 本章节素材已上传Gitee:yihaohhh/我爱Vue - Gitee.com 前面我们学习的clikc、…

Windows远程连接MySQL报错,本地navicat能连接MySQL

一、报错 telnet 119.87.111.79 3306​​“无法打开到主机的连接。在端口 3306: 连接失败”​​ 表明无法通过 TCP 协议连接到目标服务器的 3306 端口。 二、目的 (1)​​Telnet 测试的目的​​ Telnet 仅用于测试 ​​TCP 端口是否开放​​&#xff…

电池管理系统BMS三级架构——BMU、BCU和BAU详解

储能电站的电池管理系统(BMS)通常采用三级架构:从控(BMU)、主控(BCU)、总控(BAU)。这种分层设计实现了电池模组、簇、堆的分级管理和控制,确保系统运行的安全…

C++ 基础复习

基础复习 1.const引用为什么能引用临时对象2.内联函数的额外作用3. nullptr 1.const引用为什么能引用临时对象 临时对象(Temporary Object)是在表达式求值过程中隐式创建的对象,例如: 函数返回非引用类型的值 类型转换&#xff0…

AI的出现,是否能替代IT从业者?

阐述观点:AI 的出现不会完全替代 IT 从业者,但会深刻改变 IT 行业的工作方式和岗位结构。 AI 不会完全替代 IT 从业者的原因 AI 本身需要人来开发与维护 AI 模型、系统架构、数据管道等都需要 IT 专业人员来构建和优化。 例如:AI 工程师、M…

【服务器通信-socket】——int socket(int domain, int type, int protocol);

#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&#xff0c;用IPv4的地址 AF_INET6 与上面类似&#xff0c;不过是来用IPv6的地…

Python基本环境搭配

Python3 环境搭建 | 菜鸟教程 里面有直接跳转 Fitten Code 按下 Tab 键接受所有补全建议&#xff1a; 按下 Ctrl→ 键(mac系统为Command→)接收单个词补全建议&#xff1a; 用户可通过点击左上角工具栏中的Fitten Code – 开始对话或者使用快捷键CtrlAltC(mac系统为Contr…

C++负载均衡远程调用学习之HOOK注册机制

目录 1.larV0.7-hook流程的说明 2.larV0.7-TCP_server集成链接HOOK函数 3.larV0.7-TCP_client集成链接HOOK注册功能 1.larV0.7-hook流程的说明 ### 7.1 数据库表相关查询方法实现 ​ 我们先实现一些基本的数据表达查询方法&#xff1a; > lars_dns/src/dns_rout…

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

一、引言 在软件开发的快速发展浪潮中&#xff0c;Rust 和 Golang&#xff08;Go 语言&#xff09;脱颖而出&#xff0c;成为开发者热议的编程语言。Rust 凭借强大的内存安全性与卓越的性能备受赞誉&#xff0c;Golang 则以简洁的语法和出色的并发处理能力赢得开发者青睐。本文…

C++负载均衡远程调用学习之订阅功能与发布功能

目录 1.lars-DnsV0.1回顾 2.Lars-DnsV0.2-订阅功能的订阅模块分析 3.Lars-DnsV0.2-订阅模块的类的单例创建及方法属性初始化 4.Lars-DnsV0.2-发布功能的实现 5.Lars-DnsV0.2-发布功能的总结 6.Lars-DnsV0.2-订阅流程复习 7.Lars-DnsV0.2-订阅模块的集成 8.Lars-DnsV0.2订…

SurfSense开源程序是NotebookLM / Perplexity / Glean的开源替代品,连接到外部来源,如搜索引擎

​一、软件介绍 文末提供程序和源码下载 虽然 NotebookLM 和 Perplexity 等工具令人印象深刻&#xff0c;并且对于对任何主题/查询进行研究都非常有效&#xff0c;但 SurfSense 通过与你的个人知识库集成来提升这种能力。它是一个高度可定制的 AI 研究代理&#xff0c;连接到外…

基于OpenTelemetry的分布式链路追踪Trace‌实现(PHP篇)

目录 引言一、OpenTelemetry是一套可观测性标准协议二、分布式追踪&#xff08;‌Trace‌&#xff09;是OpenTelemetry的核心功能之一三、OpenTelemetry的架构原理四、OpenTelemetry的分布式追踪&#xff08;‌Trace‌&#xff09;实践1、准备PHP环境2、下载SDK3、编写实例代码…

探索智能体的记忆:类型、策略和应用

AI Agent 中的记忆&#xff1a;类型、策略和应用 记忆实现是使智能体能够保持上下文、从过去的交互中学习并做出明智决策的关键组成部分。与人类记忆非常相似&#xff0c;智能体记忆允许 AI 系统随时间存储、检索和利用信息&#xff0c;从而为用户创造更连贯和个性化的体验。 …

leetcode 2395. Find Subarrays With Equal Sum

题目描述 代码&#xff1a; class Solution { public:bool findSubarrays(vector<int>& nums) {int len nums.size();if(len <2)return false;unordered_set<int> table;int sum 0;for(int i 1;i < len;i){sum nums[i-1]nums[i];if(table.contains(…

Kubernetes(k8s)学习笔记(七)--KubeSphere 最小化安装

前情提要 可视化操作面板对于开发、运维绝对是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可视化操作来管理Kubernetes。 可视化面板有多种&#xff1a; 1.Kubernetes官方提供的默认面板&#xff1a;dashboard&#xff0c;用处不大&#xff0c;放弃&#xff1b…

MCP连接Agent:AI时代的TCP/IP

介绍 2023年&#xff0c;生成式AI爆发。2024年&#xff0c;智能体&#xff08;Agent&#xff09;接棒成为AI新焦点。2025年&#xff0c;智能体似乎已经要开始爆发了。目前的智能体更像一个“单机App”&#xff1a;彼此不了解、无法通信&#xff0c;更不能协作。类似互联网早期…

交换机工作原理(MAC地址表、VLAN)

目录 一、交换机的基本工作原理 数据帧的转发 MAC地址表的作用 交换机的转发方式 二、VLAN&#xff08;虚拟局域网&#xff09; VLAN的定义 VLAN的作用 VLAN的实现方式 VLAN的帧标记 VLAN的通信 三、交换机与VLAN的结合 四、交换机与VLAN的实际应用场景 交换机是局…

eFish-SBC-RK3576工控板外部RTC测试操作指南

备注&#xff1a; 1&#xff09;测试时一定要接电池&#xff0c;否则外部RTC断电后无法工作导致测试失败&#xff1b; 2&#xff09;如果连接了网络&#xff0c;系统会自动同步NTP时钟&#xff0c;所以需要关闭自动同步时钟。 关闭自动同步NTP时钟方法&#xff1a; 先查看是…

淘宝按图搜索商品(拍立淘)Java 爬虫实战指南

在电商领域&#xff0c;按图搜索商品功能为用户提供了更直观、便捷的购物体验。淘宝的拍立淘功能更是凭借其强大的图像识别技术&#xff0c;成为许多开发者和商家关注的焦点。本文将详细介绍如何利用 Java 爬虫技术实现淘宝按图搜索商品功能&#xff0c;包括注册账号、上传图片…

【Redis】List类型

文章目录 List的特点介绍lpush&#xff0c;lpushx&#xff0c;rpush&#xff0c;rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小结list的内部编码List的应用场景 List的特点介绍 列表相当于一个数…