自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不好意思,沒達到公司性能目標(biāo),決定從 Go 切換到 Rust

開發(fā)
Discord 廣泛使用 Rust 提升性能和安全性,如我們將它用于游戲 SDK、Go Live 的視頻捕獲和編碼、Elixir NIF、多個后端服務(wù)等。

今天分享篇文章關(guān)于 Discord 為什么從 Go 切換到 Rust。

如今 Rust 逐漸成為許多領(lǐng)域的一流語言,盡管還是相對較新的語言,但它已經(jīng)在重塑許多創(chuàng)新行業(yè)方面發(fā)揮了重要作用了。Rust 憑借其市場領(lǐng)先的性能、內(nèi)存安全性和并發(fā)性功能增強了眾多領(lǐng)域。 

下面一起來康康,這篇文章吧!

讀取狀態(tài)服務(wù)

Discord 是家專注于產(chǎn)品的公司,先從產(chǎn)品背景聊起,Discord 從 Go 語言遷移到 Rust 語言,以解決 "Read States" 服務(wù)的性能問題。該服務(wù)負(fù)責(zé)追蹤用戶已讀的頻道和消息,對響應(yīng)速度有高要求。然而 Go 的內(nèi)存模型和垃圾收集器導(dǎo)致了性能不穩(wěn)定,非常影響用戶體驗。

Go 沒有達到我們的性能目標(biāo)原因

為了解釋 Go 不能達到我們理想中性能目標(biāo),進行以下 5 個方面解釋:

  • 數(shù)據(jù)結(jié)構(gòu):使用"讀取狀態(tài)"來存儲每個用戶在每個頻道的讀取信息,每個狀態(tài)包含多個需要原子更新的計數(shù)器。
  • 規(guī)模:Discord擁有數(shù)十億個讀取狀態(tài),每個狀態(tài)服務(wù)器有數(shù)百萬個用戶的緩存。
  • 訪問模式:每秒有數(shù)十萬次的緩存更新,以及數(shù)萬次的數(shù)據(jù)庫寫入。
  • 架構(gòu):使用Cassandra數(shù)據(jù)庫集群支持緩存,緩存鍵逐出時數(shù)據(jù)提交到數(shù)據(jù)庫。
  • 性能問題:每2分鐘出現(xiàn)一次延遲和CPU峰值,可能與高頻率的緩存更新和數(shù)據(jù)庫寫入有關(guān)。

那么為什么是2分鐘的峰值呢?

Go 語言的垃圾收集器(GC)每2分鐘強制執(zhí)行一次,導(dǎo)致性能短暫下降。我們也嘗試調(diào)整GC頻率但是以無效告終,根本原因是內(nèi)存分配速度不足以觸發(fā)更頻繁的GC。深入研究后發(fā)現(xiàn),GC 需掃描整個LRU緩存來識別無用內(nèi)存,是性能峰值的主因。

這樣導(dǎo)致了減小 LRU 緩存可以減少GC峰值,但會增加緩存未命中率,從而增加延遲。團隊通過負(fù)載測試找到了一個折中的緩存設(shè)置,但并非完美。最終我們決定將服務(wù)切換到 Rust,希望利用 Rust 的優(yōu)勢解決性能問題,提升用戶體驗。

Rust 內(nèi)存管理優(yōu)勢

Rust 速度極快,內(nèi)存效率極高:無需運行時或垃圾收集器,它可以為性能關(guān)鍵型服務(wù)提供支持,在嵌入式設(shè)備上運行,并輕松與其他語言集成。

Rust 通過獨特的內(nèi)存管理機制避免了與 Go 類似的延遲峰值問題。它采用內(nèi)存所有權(quán)的概念,編譯時就強制執(zhí)行內(nèi)存規(guī)則,自動跟蹤并釋放不再使用的內(nèi)存。這意味著在 Rust 版本中,當(dāng)數(shù)據(jù)從緩存中逐出時,內(nèi)存會立即被釋放,無需等待垃圾收集器介入,從而減少了性能波動。

異步 Rust

Rust 的異步編程在穩(wěn)定版中支持不足,社區(qū)庫雖有支持但使用復(fù)雜且錯誤信息難以理解。盡管如此,Discord 團隊決定使用 Rust 的 Nightly 版本,以利用其先進的異步特性。Discord 有采用新技術(shù)的歷史,愿意面對前沿技術(shù)的挑戰(zhàn)。他們堅持使用 Nightly 版本直至異步特性在 Rust 穩(wěn)定版中成熟,最終這一決策證明是成功的。

實施、負(fù)載測試和啟動

在重寫服務(wù)為 Rust 版本的過程中,我們首先進行了簡單的翻譯,然后利用 Rust 的強類型系統(tǒng)和泛型簡化了代碼。Rust 的內(nèi)存安全特性也讓我們?nèi)サ袅?Go 中的一些手動內(nèi)存保護。負(fù)載測試顯示,Rust 版本在延遲上與 Go 相當(dāng),但沒有出現(xiàn)峰值。

盡管只是進行了基礎(chǔ)優(yōu)化,Rust 版本的表現(xiàn)已經(jīng)超越了經(jīng)過高度手動調(diào)整的 Go 版本,顯示出 Rust 在編寫高效程序方面的優(yōu)勢。進一步的性能優(yōu)化,如使用 BTreeMap 優(yōu)化內(nèi)存使用、替換度量庫、減少內(nèi)存復(fù)制,使得 Rust 版本在延遲、CPU 和內(nèi)存使用上全面超越了 Go。

優(yōu)化后,我們順利地將服務(wù)推廣到生產(chǎn)環(huán)境,通過 Canary 節(jié)點測試發(fā)現(xiàn)了一些邊緣情況并進行了修復(fù),之后成功地將其擴展到了整個服務(wù)艦隊。結(jié)果如下:

Go 是紫色,Rust 是藍色。

提高緩存容量

在 Rust 服務(wù)穩(wěn)定運行幾天后,我們決定提高 LRU 緩存的容量。由于 Rust 不受垃圾收集影響,我們能夠安全地增加緩存上限至800萬個讀取狀態(tài),提升性能。結(jié)果表明,這一變化顯著改善了性能,平均響應(yīng)時間降至微秒級別,而最大響應(yīng)時間也僅為毫秒級。

不斷發(fā)展的生態(tài)系統(tǒng)

最后,Rust 的另一個優(yōu)點是它擁有快速發(fā)展的生態(tài)系統(tǒng)。最近,tokio(我們使用的異步運行時)發(fā)布了 0.2 版。我們進行了升級,它為我們帶來了免費的 CPU 優(yōu)勢。下面您可以看到,從 16 日左右開始,CPU 一直較低。

總結(jié)

從 Go 到 Rust 的初始移植于 2019 年 5 月完成。Discord 廣泛使用 Rust 提升性能和安全性,如我們將它用于游戲 SDK、Go Live 的視頻捕獲和編碼、Elixir NIF、多個后端服務(wù)等。Rust 的優(yōu)勢包括易于重構(gòu)的類型安全特性和強大的生態(tài)系統(tǒng)。

責(zé)任編輯:趙寧寧 來源: 碼農(nóng)漁夫
相關(guān)推薦

2024-09-13 09:32:30

2022-06-28 08:03:06

緩存Redis

2020-05-19 13:34:20

ZookeeperZAB協(xié)議

2021-07-21 08:48:44

內(nèi)卷技術(shù)競賽

2015-07-13 09:48:21

iOS

2021-11-18 10:28:27

云計算云計算環(huán)境云應(yīng)用

2020-12-17 08:56:51

單例模式JVM

2019-01-23 10:58:52

接入層架構(gòu)負(fù)載均衡

2020-09-16 09:08:49

訂單微服務(wù)架構(gòu)

2013-02-28 09:46:18

程序員巖機Hacker News

2015-12-31 10:23:06

2015公有云中國云市場

2015-09-06 09:50:59

創(chuàng)業(yè)大數(shù)據(jù)

2018-07-11 08:19:26

高并發(fā)架構(gòu)網(wǎng)絡(luò)

2017-04-26 10:42:27

搜狗輸入法

2017-04-26 10:49:25

搜狗輸入法

2019-10-18 16:05:32

框架開發(fā)Java

2021-04-12 20:42:50

K8S端口內(nèi)存

2018-12-20 13:53:59

OLEDLCD屏幕

2021-05-17 10:53:49

5G手機4G

2010-09-15 09:28:35

云計算
點贊
收藏

51CTO技術(shù)棧公眾號