性能比拼: Node.js vs Go
本内容是对知名性能评测博主 Anton Putra Node.js vs Go (Golang): Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相干指标和结论以原作为准在本篇内容中,我们将比力 Node.js 和 Golang。我会利用标准库在 Golang 中创建一个 Web 应用程序;而在 Node.js 中,我会利用非经常见的 Web 框架 --- Express。
为了运行这些测试,我将两个应用程序都部署到了 AWS 上一个面向生产环境的 Kubernetes 集群中,并利用最新一代的 EC2 实例作为 Kubernetes 节点。
我们首先会丈量 CPU 利用率、内存利用率、应用程序可用性、Kubernetes 的 CPU 限流情况以及网络压力。我们还会追踪每个应用程序接收和发送的字节数。这一数值可能会有很大差别,取决于哀求头的数量以及应用程序是否启用了 KeepAlive(KeepAlive 允许一个 TCP 连接处置惩罚多个 HTTP 哀求)。
第二个测试介绍
在第二个测试中,我引入了持久化层,因为大多数应用程序都需要以某种方式存储状态。例如,一个博客网站需要存储文章,一个电商网站需要存储库存,甚至一个待办事项列表也需要存储任务。
最常见的方法之一是利用数据库。在本次基准测试中,我们利用的是 PostgreSQL 关系型数据库。
除了前面提到的指标外,我们还会丈量每个应用程序将数据插入数据库所需的耽误,并追踪连接池的状态以及每个应用程序怎样扩展连接池。
作为一名 DevOps 工程师,我依靠开辟者的输入来在生产环境中运行和优化应用程序。我欢迎任何改进应用的发起,甚至更好的是 Pull Request。你可以在视频形貌中找到我 GitHub 堆栈的链接。
第一个测试
好了,如今我来部署这两个应用程序到 Kubernetes。你会注意到,Node.js 利用的 CPU 稍微多一些,而内存利用根本相同。好了,如今开始第一次性能测试。
https://i-blog.csdnimg.cn/img_convert/d909f1ed8b08b16bf96a785d7e5c711e.png
我利用了一个 Kubernetes Job 和 20 个副原来为每个应用程序天生负载。整个测试可能连续了三到四个小时,但我会将其压缩为几分钟展示。我从每个 Pod 启动一个客户端开始,然后不停增长客户端数量,直到两个应用程序都开始失败。
另外,每个阶段之间我设置了 60 秒的间隔,客户端超时时间设置为 1 秒。当达到超时阈值时,你会在可用性图表中看到下降。
https://i-blog.csdnimg.cn/img_convert/1fec0ac12bc60b69fc5e929ece1934ec.jpeg
从一开始你就可以注意到,Node.js 利用更多的 CPU 来处置惩罚哀求,且耽误明显高于 Go。我以为它的性能与我在之前视频中测试过的 Python Django 框架雷同。除此之外,Node.js 利用了更多的内存,它默认还会发送更多的头信息,这也是你会看到它传输的数据更多的原因。
当我们达到每秒 9,000 个哀求时,Node.js 的 CPU 利用率达到 60%,并陷入卡顿状态。如果你知道 Node.js 出现这种情况的原因,或者以前碰到过这种问题,请告诉我。在接下来的测试中,Node.js 的 CPU 利用率将维持在 60% 左右,而哀求的耽误会连续增长。我知道你可以利用 cluster 模式,但我个人以为直接增长副本数量对 Node.js 更合适。
https://i-blog.csdnimg.cn/img_convert/b8ca51579ff18796f8d83eddbd7fa154.jpeg
由于我利用的是与之前测试完全相同的设置,我们知道 Golang 可以处置惩罚约莫 70,000 到 80,000 个哀求。由于 Golang 的标准库没有任何速率限制机制,它会连续缓存所有哀求,直到内存利用率达到 100%,然后被 Kubernetes 的 OOM(内存溢出)机制杀死。
在测试竣事时,Node.js 也开始性能下降,很多哀求开始超时,你可以在可用性图表中看到这一点。趁便说一句,我在 Node.js 中利用了 async 函数,并设置了 NODE_ENV=production。
测试效果:Golang 可以处置惩罚约莫 70,000 个哀求,而 Node.js 只能处置惩罚约莫 9,000 个哀求。
如今让我打开整个测试周期中的每个图表:
[*]首先是每秒哀求数图;
https://i-blog.csdnimg.cn/img_convert/09722d0a7c88232dc54eab43b2454698.png
[*]然后是 P99 客户端耽误图;
https://i-blog.csdnimg.cn/img_convert/1565cc818bff55cb326ac7413c92329d.png
Node.js 开始变慢前的耽误图;
https://i-blog.csdnimg.cn/img_convert/262a72ce0326f63e72d3466d4eb4395e.png
[*]接下来是 CPU 利用图;
https://i-blog.csdnimg.cn/img_convert/fa53ebaf584cc9369254a9f0cd700e9b.png
[*]内存利用图;
https://i-blog.csdnimg.cn/img_convert/727aa63c24f775250f8624a8198d3e94.png
[*]可用性图;
https://i-blog.csdnimg.cn/img_convert/e470990acaae5e6bfce19e47e2e213e4.png
[*]CPU 限流图;
https://i-blog.csdnimg.cn/img_convert/9e07496bf3f4b736028d9a6bc08d1531.png
[*]最后是网络压力图。
https://i-blog.csdnimg.cn/img_convert/96b35fb3bcff6134d1d479a20b43fc70.png
https://i-blog.csdnimg.cn/img_convert/e8ffb046d591e0c2ff9747fdbfa5a4ea.png
好了,这就是第一个测试的全部内容。如果你有任何改进测试的发起,请告诉我。
第二个测试
如今我们进行第二个测试。在本测试中,我们向每个应用程序发送一个包罗 JSON 负载的 POST 哀求。应用程序会为设备天生一个 UUID,然后将其生存到数据库中。我为两个应用程序都设置了最大连接池巨细为 20。
我利用一个开源的 Postgres Docker 镜像来运行一些数据库迁徙操作。例如,我会创建一个用户,扫除该用户的所有空闲连接,并创建一个表。然后我利用 init 容器在每次应用程序部署时运行这些迁徙脚本。
https://i-blog.csdnimg.cn/img_convert/1aa94dfdfe3e1de3f4df41481810f18e.png
如今开始测试。我为 Node.js 利用了最快的 Postgres 驱动之一,因此在测试初期,插入数据的耽误根本相同。整体耽误也非常靠近。但固然,CPU 和内存利用差别很大。
https://i-blog.csdnimg.cn/img_convert/9c23bae3929ec4dbcf3ac1c1b75f1179.png
你还可以注意到,连接池很快就达到了最大连接数 --- 每个应用程序 20 个连接。
https://i-blog.csdnimg.cn/img_convert/0670c32084fddf236c43792eedc1ff8c.jpeg
当哀求量达到每秒约 4,000 时,你会再次看到 Node.js 的 CPU 利用率达到 60%,并开始性能下降,耽误上升。看起来这就是 Node.js 在本测试中的最大处置惩罚能力。
https://i-blog.csdnimg.cn/img_convert/bc2afc0da05ceb8334eee77139ca7db8.jpeg
继承测试,直到 Golang 开始失败。当哀求量达到每秒约 7,000 时,你可以看到它开始卡顿,只有内存利用率继承上升。如果我们继承测试,它也会达到内存限制,并被 Kubernetes 杀死。
https://i-blog.csdnimg.cn/img_convert/a26973a7b3342ce68237c6fc98801eed.jpeg
好了,如今让我打开整个测试周期中的每个图表:
[*]首先是每秒哀求数图;
https://i-blog.csdnimg.cn/img_convert/cfad547d1455d8046b940930466bcd4d.jpeg
[*]客户端耽误图;
https://i-blog.csdnimg.cn/img_convert/850ab6af299cdaed6028bdd9c0e44043.png
https://i-blog.csdnimg.cn/img_convert/643ff8af2dc1025260c683ea2b483e39.png
[*]数据库插入耽误图;
https://i-blog.csdnimg.cn/img_convert/19d95bf0fabfd8ed162235df65446d51.png
[*]连接池巨细图;
https://i-blog.csdnimg.cn/img_convert/3ed333652dbfd57ff32cdc71e836d336.png
[*]CPU 利用率图;
https://i-blog.csdnimg.cn/img_convert/425137ea1006c8f6e69751c219e29d5f.png
[*]内存利用图;
https://i-blog.csdnimg.cn/img_convert/d53f5aebccef86da1da5957c45d04879.png
[*]可用性图;
https://i-blog.csdnimg.cn/img_convert/35acbaf3ec508a4ec391e1720d48415f.png
[*]最后是 CPU 限流图
https://i-blog.csdnimg.cn/img_convert/9f53b99bb791f2eea3d5823cca536b8a.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]