用 Go 重寫 Node-js 服務,性能提升 5 倍,內存減少 40-

文 | 白開水

出品 | OSC 開源社區(ID:oschina2013)

Hasura Storage 是一項開源服務,在 hasura 和任何 s3 兼容的存儲服務之上增加了一個存儲服務。其目的是能夠利用雲存儲服務,同時也利用 hasura 的功能,如它的 graphql API、權限、行動、預設等。

出於業務發展需求,Hasura Storage 團隊近期將其原本用 Node.js 編寫的服務用 Golang 進行了重寫。“這個用 Node.js 編寫的服務在相當長的一段時間內爲我們提供了良好的服務,但隨着公司的發展和用戶數量的大規模增加,性能開始成爲一個問題。雖然 Node.js 可能有很多可取之處,但優異的性能和可擴展性並不是其中之一。”

Hasura Storage 方面表示,在使用 Golang 進行重寫後,其可處理的服務請求數增加了 5 倍,同時內存消耗減半。根據介紹,他們選擇 Go 的原因在於:

重寫完成後,Hasura Storage 團隊針對 Node.js 和 Golang 版本的服務運行了一些基準測試。使用了 k6 並設計了以下測試: 

Hasura Storage 提前聲明稱,最終結果不應該只看表面的數字;“用於基準測試的系統的 CPU 容量非常有限,因爲我們想對這兩種服務施加壓力並看看它們在壓力下的表現如何所以,我們感興趣的不是數字,而是兩個版本之間的差異。”

測試結果表明,Hasura Storage 在每種情況下能夠處理的請求數都實現了大幅提升,其中較小的文件(5x)的效果更爲顯著。

同時在所有情況下都設法大大改善了 RAM 消耗,尤其是在下載大文件時。值得一提的是,這還是在提供了多達 5 倍的請求的前提下。

另一個重要的指標是響應時間,Hasura Storage 提供了兩個數據:最小響應時間,開源告訴我們系統未承受壓力時的響應時間;以及 P95,開源告訴我們大多數用戶的響應時間最多是多少(包括當系統處於壓力之下)。

首先是最小響應時間。測試用例 download_small_file 的結果不好從圖中目測,但 Hasura Storage 稱其將場景的響應時間從 Node.js 用例的 29ms 提高到 Golang 用例的 7ms。除了在 download_image_manipulated 中實現了大約 2 倍的改進外,在其他場景中則均實現了 4 倍的改進。

再是 P95。除 download_image_manipulated 和 download_large_file 外,大多數情況下都實現了 4 倍的改進。Hasura Storage 解釋稱,雖然沒有像其他情況那樣戲劇性,但這兩種情況下都有實質性的改進。“這是合理的,因爲下載大文件會受到 I/O NET 的約束,而處理圖像則會受到 CPU 的約束。但即使如此,我們也很高興看到這種實質性的改進。”

此外,圖像處理方面也有所改善。

在服務被重寫和測試後,Hasura Storage 將服務部署到了生產環境,一些重寫的好處也開始展現。如下圖所示(集羣的一個節點中的 RAM 使用情況),內存佔用減少了近 40%。“這是一項重大改進,可以讓我們在不增加整體基礎設施費用的情況下爲更多用戶和流量提供服務。”

Hasura Storage 方面表示,他們決定重寫服務是爲了提高性能指標;而在對兩個服務進行並列基準測試後,他們也可以有底氣的宣稱成功地顯着改善了所有指標。“我們希望能夠在使用更少資源的同時滿足更多請求,同時還可以改善我們用戶的響應時間,我相信他們會喜歡的。”

歡迎關注「幽鬼」,像她一樣做團隊的核心。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/k1SixCQ8N0gVZjHSPQFHUw