用Go重寫:項目性能提升5倍,內(nèi)存減少40%
Hasura Storage 是一項開源服務(wù),在 hasura 和任何 s3 兼容的存儲服務(wù)之上增加了一個存儲服務(wù)。其目的是能夠利用云存儲服務(wù),同時也利用 hasura 的功能,如它的 graphql API、權(quán)限、行動、預設(shè)等。
出于業(yè)務(wù)發(fā)展需求,Hasura Storage 團隊近期將其原本用 Node.js 編寫的服務(wù)用 Golang 進行了重寫?!斑@個用 Node.js 編寫的服務(wù)在相當長的一段時間內(nèi)為我們提供了良好的服務(wù),但隨著公司的發(fā)展和用戶數(shù)量的大規(guī)模增加,性能開始成為一個問題。雖然 Node.js 可能有很多可取之處,但優(yōu)異的性能和可擴展性并不是其中之一?!?/span>
Hasura Storage 方面表示,在使用 Golang 進行重寫后,其可處理的服務(wù)請求數(shù)增加了 5 倍,同時內(nèi)存消耗減半。根據(jù)介紹,他們選擇 Go 的原因在于:
該語言的依賴性管理系統(tǒng)和構(gòu)建系統(tǒng)使其非常適合云 團隊有豐富的 Golang 經(jīng)驗 雖然 Go 是一種非常冗長的語言(尤其是與 Node.js 相比),但它非常易于學習且編寫速度快 性能非常優(yōu)異
重寫完成后,Hasura Storage 團隊針對 Node.js 和 Golang 版本的服務(wù)運行了一些基準測試。使用了 k6 并設(shè)計了以下測試:
當測試開始時,它會在前 10 秒內(nèi)將 workers 的數(shù)量從 1 增加到 TARGET 然后再運行 60 秒才結(jié)束。 Workers 盡可能快地查詢服務(wù) 運行以下測試: download_small_filedownload_medium_filedownload_large_filedownload_imagedownload_image_manipulatedCPU 被限制在整個系統(tǒng)的 10% RAM 是無限的
Hasura Storage 提前聲明稱,最終結(jié)果不應(yīng)該只看表面的數(shù)字;“用于基準測試的系統(tǒng)的 CPU 容量非常有限,因為我們想對這兩種服務(wù)施加壓力并看看它們在壓力下的表現(xiàn)如何所以,我們感興趣的不是數(shù)字,而是兩個版本之間的差異。”
測試結(jié)果表明,Hasura Storage 在每種情況下能夠處理的請求數(shù)都實現(xiàn)了大幅提升,其中較小的文件(5x)的效果更為顯著。

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

另一個重要的指標是響應(yīng)時間,Hasura Storage 提供了兩個數(shù)據(jù):最小響應(yīng)時間,開源告訴我們系統(tǒng)未承受壓力時的響應(yīng)時間;以及 P95,開源告訴我們大多數(shù)用戶的響應(yīng)時間最多是多少(包括當系統(tǒng)處于壓力之下)。
首先是最小響應(yīng)時間。測試用例 download_small_file 的結(jié)果不好從圖中目測,但 Hasura Storage 稱其將場景的響應(yīng)時間從 Node.js 用例的 29ms 提高到 Golang 用例的 7ms。除了在 download_image_manipulated 中實現(xiàn)了大約 2 倍的改進外,在其他場景中則均實現(xiàn)了 4 倍的改進。

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

此外,圖像處理方面也有所改善。
在服務(wù)被重寫和測試后,Hasura Storage 將服務(wù)部署到了生產(chǎn)環(huán)境,一些重寫的好處也開始展現(xiàn)。如下圖所示(集群的一個節(jié)點中的 RAM 使用情況),內(nèi)存占用減少了近 40%?!斑@是一項重大改進,可以讓我們在不增加整體基礎(chǔ)設(shè)施費用的情況下為更多用戶和流量提供服務(wù)?!?/span>

Hasura Storage 方面表示,他們決定重寫服務(wù)是為了提高性能指標;而在對兩個服務(wù)進行并列基準測試后,他們也可以有底氣的宣稱成功地顯著改善了所有指標?!拔覀兿M軌蛟谑褂酶儋Y源的同時滿足更多請求,同時還可以改善我們用戶的響應(yīng)時間,我相信他們會喜歡的?!?/span>
我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗!2012 年接觸 Go 語言并創(chuàng)建了 Go 語言中文網(wǎng)!著有《Go語言編程之旅》、開源圖書《Go語言標準庫》等。
堅持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長!也歡迎加我微信好友交流:gopherstudio
