Go 中的 Hasura Storage:性能提升 5 倍,内存减少 40%

liuzhen007 行业动态 1月前 阅读 1014

Hasura Storage 是一项开源服务,可将任何与 S3 兼容的云存储服务与 Hasura 连接起来,它是 Nhost 用来为用户提供存储功能的服务。

image.png

它的目标是允许用户将他们喜欢的 Hasura 功能(权限、事件、动作、预设等)与能够在线显示文件的便利性结合起来。

image.png

随着公司的发展和用户数量的大规模增多,用 Node.js 编写的服务的性能开始成为一个问题,而且 Node.js 出于多种原因,性能和可扩展性都不是很好。

通过使用 Golang 重写 Node.js 服务,最终我们发现性能提升了 5 倍,同时内存消耗减半

决定重写服务

随着扩展需求变得越来越重要,重写云服务变得很有必要,使用 Golang 的原因有很多:

  1. 它的依赖管理系统和构建系统使其非常适合云服务。
  2. Nhost 团队有丰富的 Golang 经验。
  3. 尽管与 Node.js 相比,Golang 是一种非常冗长的语言,但它非常易于学习且编写速度很快。
  4. 众所周知,Golang 的性能非常好。

重写过程

实际的重写过程过渡很顺利。重写微服务不是一件特别复杂的事情。Hasura-storage 的创新性和实用性来自于用户喜爱的两个伟大的服务:S3 和 Hasura。

对服务进行基准测试

重写完成后,针对 Node.js 和 Golang 版本的服务做了一些基准测试。为此,我们使用了k6并设计了以下测试:

  1. 当测试开始时,在前 10 秒内将用户的数量从 1 增加到 TARGET。

  2. 然后它又运行了 60 秒,然后结束。

  3. 用户尽可能快地查询服务。

  4. 测试项:

    (1) download_small_file(100 名用户) - 下载一个 100KB 的文件

    (2) download_medium_file(100 名用户)- 下载一个 5MB 的文件

    (3) download_large_file(50 名用户)- 下载 45 MB 文件

    (4) download_image(100 名用户)- 下载 5.3 MB 的图片

    (5) download_image_manipulated(10 名用户)- 下载相同的图像,但调整图像大小并动态应用一些模糊

  5. CPU 被限制在整个系统的 10%。

  6. RAM 是无限的。

在介绍结论之前,需要先声明本文关心的不是 Node.js 和 Golang 两个版本服务具体的数据表现,而是两个版本之间的差异。

请求数

首先查看请求的数量,这是决定其他指标是否有意义的主要指标(即在服务只有较少请求时减少 RAM 是否可取)。

image.png

如上图所示,在每种情况下 Golang 版本能够处理的请求数量都大大提高了,尤其是对于较小的文件。

内存消耗

RAM 是一种有限的资源,如果系统达到其极限,则很难对其进行限制。如果服务器的内存占用达到一定的值,服务就会重新启动,导致无法访问。

image.png

如上图所示,在所有情况下内存占用都显著减少了,尤其是在下载大文件时。

响应时间

另一个重要的指标是响应时间,这里我们看两个单位;最小响应时间(系统没有压力时的响应时间)和 P95(大多数用户的响应时间)。

先看最小响应时间:

image.png

由上图可以看到,download_small_file场景中的响应时间从 Node.js 用例中的 29ms 提高到 Golang 用例中的 7ms。另外,download_image_manipulated场景中也有大约 2 倍改进效果。

再看 P95 指标:

image.png

还看到大多数情况下都有 4 倍的改进,除了download_image_manipulateddownload_large_file场景(改进效果也很明显)。

将服务部署到生产环境

将重写后的服务部署到生产环境,立即看到了好处。下面是集群中一个节点的 RAM 使用情况:

image.png

如上图所示,内存占用减少了近 40%,这是一项重大改进,可以在不增加整体基础设施费用的情况下为更多用户和流量提供服务。

结论

使用 Golang 重写云服务提高了服务整体的性能指标,使用更少的资源满足了更多用户请求,同时还改善了用户的响应时间。

评论