“Hello world”Rust 网络服务器从 Chrome 测量而不是从 curl 测量时比 Node 慢

Posted

技术标签:

【中文标题】“Hello world”Rust 网络服务器从 Chrome 测量而不是从 curl 测量时比 Node 慢【英文标题】:"Hello world" Rust webserver is slower than Node when measured from Chrome but not from curl 【发布时间】:2021-05-08 05:19:50 【问题描述】:

我创建了一个存储库,其中包含一个 Node.js based 和一个 Rocket.rs based 网络服务器。

考虑以下步骤:

    通过cargo run --release启动Rocket.rs服务器 通过node server.js启动Node.js服务器 在 Chrome 中并排打开 http://localhost:8000/ (Rocket) 和 http://localhost:8090/ (Node)。 在开发者控制台打开的情况下,我不断刷新两个选项卡并观察到 ​​Node 选项卡总是在 5 毫秒内完成,而 Rocket 选项卡有时需要超过 300 毫秒才能完成:

我在 actix-web 上也观察到了类似的情况,但程度较轻:在这种情况下,如果我大约 5 秒没有刷新选项卡,我只会得到约 300 毫秒的延迟。如果我不断刷新它,那么请求会在 5 毫秒内完成。

有趣的是,如果我像 this 和 this 这样通过 curl 进行测量,似乎不会出现延迟。两台服务器都有大约 4 毫秒的延迟。

我注意到 Rocket 和 actix-web 不会在响应中发送 Keep-Alive 标头。如果我理解正确的话,这对于 HTTP 1.1 请求应该无关紧要。

我正在使用安装了 Ubuntu 的 WSL 2。 Chrome 正在宿主 Windows 中运行。

有人可以解释一下这里发生了什么吗?

更新:忘了说我是在使用 nightly 编译器来构建火箭服务器(Rocket v0.4.6 似乎需要它)。直接从主分支更改为稳定并构建消除了延迟。不过,actix-web 的延迟仍然有点令人担忧,因为我使用了稳定的编译器。

【问题讨论】:

您是否尝试过一次运行一个应用程序而不是同时运行两个应用程序来衡量这一点?这些应用程序是否仍具有相同的性能特征? @TedKleinBergman 是的,同样的行为。 “反正网络很慢”将是我的答案:p 我怀疑有些地方出了问题,因为这看起来像是一个很大的差距。 您应该使用some CLI tools built specifically for benchmarking web servers,而不是使用 chrome/curl 手动和非正式地进行这些基准测试。如果基准测试的结果仍然是 Rocket 和 actix-web 比 node.js 慢,你应该在 Rocket 和 actix-web Github 存储库上打开问题。 @pretzelhammer 感谢您的链接。无法用 ApacheBench 重现它;正如预期的那样,Rust 服务器的性能始终优于 Node 一。 【参考方案1】:

全部从 Windows 运行,在节点中响应时间在 2-4 ms 左右,在火箭中 1-2 ms。你的环境发生了一些奇怪的事情。

还尝试从 WSL 提供服务,结果相同。

即使在 debug(rust) 上,+1ms 的平均花费也比在发布时多,这可能是一些奇怪的浏览器问题。

【讨论】:

以上是关于“Hello world”Rust 网络服务器从 Chrome 测量而不是从 curl 测量时比 Node 慢的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rust 语言编译问题:从“Hello World”开始

rust 编写hello world redis

rust 编写hello world redis

rust 编写hello world redis

Rust hello world !

Rust hello world 语法讲解