今天分享篇文章關(guān)于 Discord 為什么從 Go 切換到 Rust。
如今 Rust 逐漸成為許多領(lǐng)域的一流語言,盡管還是相對(duì)較新的語言,但它已經(jīng)在重塑許多創(chuàng)新行業(yè)方面發(fā)揮了重要作用了。Rust 憑借其市場領(lǐng)先的性能、內(nèi)存安全性和并發(fā)性功能增強(qiáng)了眾多領(lǐng)域。
下面一起來康康,這篇文章吧!
Discord 是家專注于產(chǎn)品的公司,先從產(chǎn)品背景聊起,Discord 從 Go 語言遷移到 Rust 語言,以解決 "Read States" 服務(wù)的性能問題。該服務(wù)負(fù)責(zé)追蹤用戶已讀的頻道和消息,對(duì)響應(yīng)速度有高要求。然而 Go 的內(nèi)存模型和垃圾收集器導(dǎo)致了性能不穩(wěn)定,非常影響用戶體驗(yàn)。
為了解釋 Go 不能達(dá)到我們理想中性能目標(biāo),進(jìn)行以下 5 個(gè)方面解釋:
Go 語言的垃圾收集器(GC)每2分鐘強(qiáng)制執(zhí)行一次,導(dǎo)致性能短暫下降。我們也嘗試調(diào)整GC頻率但是以無效告終,根本原因是內(nèi)存分配速度不足以觸發(fā)更頻繁的GC。深入研究后發(fā)現(xiàn),GC 需掃描整個(gè)LRU緩存來識(shí)別無用內(nèi)存,是性能峰值的主因。
這樣導(dǎo)致了減小 LRU 緩存可以減少GC峰值,但會(huì)增加緩存未命中率,從而增加延遲。團(tuán)隊(duì)通過負(fù)載測(cè)試找到了一個(gè)折中的緩存設(shè)置,但并非完美。最終我們決定將服務(wù)切換到 Rust,希望利用 Rust 的優(yōu)勢(shì)解決性能問題,提升用戶體驗(yàn)。
Rust 速度極快,內(nèi)存效率極高:無需運(yùn)行時(shí)或垃圾收集器,它可以為性能關(guān)鍵型服務(wù)提供支持,在嵌入式設(shè)備上運(yùn)行,并輕松與其他語言集成。
Rust 通過獨(dú)特的內(nèi)存管理機(jī)制避免了與 Go 類似的延遲峰值問題。它采用內(nèi)存所有權(quán)的概念,編譯時(shí)就強(qiáng)制執(zhí)行內(nèi)存規(guī)則,自動(dòng)跟蹤并釋放不再使用的內(nèi)存。這意味著在 Rust 版本中,當(dāng)數(shù)據(jù)從緩存中逐出時(shí),內(nèi)存會(huì)立即被釋放,無需等待垃圾收集器介入,從而減少了性能波動(dòng)。
Rust 的異步編程在穩(wěn)定版中支持不足,社區(qū)庫雖有支持但使用復(fù)雜且錯(cuò)誤信息難以理解。盡管如此,Discord 團(tuán)隊(duì)決定使用 Rust 的 Nightly 版本,以利用其先進(jìn)的異步特性。Discord 有采用新技術(shù)的歷史,愿意面對(duì)前沿技術(shù)的挑戰(zhàn)。他們堅(jiān)持使用 Nightly 版本直至異步特性在 Rust 穩(wěn)定版中成熟,最終這一決策證明是成功的。
在重寫服務(wù)為 Rust 版本的過程中,我們首先進(jìn)行了簡單的翻譯,然后利用 Rust 的強(qiáng)類型系統(tǒng)和泛型簡化了代碼。Rust 的內(nèi)存安全特性也讓我們?nèi)サ袅?Go 中的一些手動(dòng)內(nèi)存保護(hù)。負(fù)載測(cè)試顯示,Rust 版本在延遲上與 Go 相當(dāng),但沒有出現(xiàn)峰值。
盡管只是進(jìn)行了基礎(chǔ)優(yōu)化,Rust 版本的表現(xiàn)已經(jīng)超越了經(jīng)過高度手動(dòng)調(diào)整的 Go 版本,顯示出 Rust 在編寫高效程序方面的優(yōu)勢(shì)。進(jìn)一步的性能優(yōu)化,如使用 BTreeMap 優(yōu)化內(nèi)存使用、替換度量庫、減少內(nèi)存復(fù)制,使得 Rust 版本在延遲、CPU 和內(nèi)存使用上全面超越了 Go。
優(yōu)化后,我們順利地將服務(wù)推廣到生產(chǎn)環(huán)境,通過 Canary 節(jié)點(diǎn)測(cè)試發(fā)現(xiàn)了一些邊緣情況并進(jìn)行了修復(fù),之后成功地將其擴(kuò)展到了整個(gè)服務(wù)艦隊(duì)。結(jié)果如下:
Go 是紫色,Rust 是藍(lán)色。
在 Rust 服務(wù)穩(wěn)定運(yùn)行幾天后,我們決定提高 LRU 緩存的容量。由于 Rust 不受垃圾收集影響,我們能夠安全地增加緩存上限至800萬個(gè)讀取狀態(tài),提升性能。結(jié)果表明,這一變化顯著改善了性能,平均響應(yīng)時(shí)間降至微秒級(jí)別,而最大響應(yīng)時(shí)間也僅為毫秒級(jí)。
最后,Rust 的另一個(gè)優(yōu)點(diǎn)是它擁有快速發(fā)展的生態(tài)系統(tǒng)。最近,tokio(我們使用的異步運(yùn)行時(shí))發(fā)布了 0.2 版。我們進(jìn)行了升級(jí),它為我們帶來了免費(fèi)的 CPU 優(yōu)勢(shì)。下面您可以看到,從 16 日左右開始,CPU 一直較低。
從 Go 到 Rust 的初始移植于 2019 年 5 月完成。Discord 廣泛使用 Rust 提升性能和安全性,如我們將它用于游戲 SDK、Go Live 的視頻捕獲和編碼、Elixir NIF、多個(gè)后端服務(wù)等。Rust 的優(yōu)勢(shì)包括易于重構(gòu)的類型安全特性和強(qiáng)大的生態(tài)系統(tǒng)。
本文鏈接:http://www.www897cc.com/showinfo-26-96982-0.html不好意思,沒達(dá)到公司性能目標(biāo),決定從 Go 切換到 Rust
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com