日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-06-27 17:17:50 147觀看
導讀今天分享篇文章關于 Discord 為什么從 Go 切換到 Rust。如今 Rust 逐漸成為許多領域的一流語言,盡管還是相對較新的語言,但它已經在重塑許多創新行業方面發揮了重要作用了。Rust 憑借其市場領先的性能、內存安全性和并

今天分享篇文章關于 Discord 為什么從 Go 切換到 Rust。1NE28資訊網——每日最新資訊28at.com

如今 Rust 逐漸成為許多領域的一流語言,盡管還是相對較新的語言,但它已經在重塑許多創新行業方面發揮了重要作用了。Rust 憑借其市場領先的性能、內存安全性和并發性功能增強了眾多領域。 1NE28資訊網——每日最新資訊28at.com

下面一起來康康,這篇文章吧!1NE28資訊網——每日最新資訊28at.com

1NE28資訊網——每日最新資訊28at.com

讀取狀態服務

Discord 是家專注于產品的公司,先從產品背景聊起,Discord 從 Go 語言遷移到 Rust 語言,以解決 "Read States" 服務的性能問題。該服務負責追蹤用戶已讀的頻道和消息,對響應速度有高要求。然而 Go 的內存模型和垃圾收集器導致了性能不穩定,非常影響用戶體驗。1NE28資訊網——每日最新資訊28at.com

Go 沒有達到我們的性能目標原因

為了解釋 Go 不能達到我們理想中性能目標,進行以下 5 個方面解釋:1NE28資訊網——每日最新資訊28at.com

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

1NE28資訊網——每日最新資訊28at.com

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

Go 語言的垃圾收集器(GC)每2分鐘強制執行一次,導致性能短暫下降。我們也嘗試調整GC頻率但是以無效告終,根本原因是內存分配速度不足以觸發更頻繁的GC。深入研究后發現,GC 需掃描整個LRU緩存來識別無用內存,是性能峰值的主因。1NE28資訊網——每日最新資訊28at.com

這樣導致了減小 LRU 緩存可以減少GC峰值,但會增加緩存未命中率,從而增加延遲。團隊通過負載測試找到了一個折中的緩存設置,但并非完美。最終我們決定將服務切換到 Rust,希望利用 Rust 的優勢解決性能問題,提升用戶體驗。1NE28資訊網——每日最新資訊28at.com

Rust 內存管理優勢

Rust 速度極快,內存效率極高:無需運行時或垃圾收集器,它可以為性能關鍵型服務提供支持,在嵌入式設備上運行,并輕松與其他語言集成。1NE28資訊網——每日最新資訊28at.com

Rust 通過獨特的內存管理機制避免了與 Go 類似的延遲峰值問題。它采用內存所有權的概念,編譯時就強制執行內存規則,自動跟蹤并釋放不再使用的內存。這意味著在 Rust 版本中,當數據從緩存中逐出時,內存會立即被釋放,無需等待垃圾收集器介入,從而減少了性能波動。1NE28資訊網——每日最新資訊28at.com

異步 Rust

Rust 的異步編程在穩定版中支持不足,社區庫雖有支持但使用復雜且錯誤信息難以理解。盡管如此,Discord 團隊決定使用 Rust 的 Nightly 版本,以利用其先進的異步特性。Discord 有采用新技術的歷史,愿意面對前沿技術的挑戰。他們堅持使用 Nightly 版本直至異步特性在 Rust 穩定版中成熟,最終這一決策證明是成功的。1NE28資訊網——每日最新資訊28at.com

實施、負載測試和啟動

在重寫服務為 Rust 版本的過程中,我們首先進行了簡單的翻譯,然后利用 Rust 的強類型系統和泛型簡化了代碼。Rust 的內存安全特性也讓我們去掉了 Go 中的一些手動內存保護。負載測試顯示,Rust 版本在延遲上與 Go 相當,但沒有出現峰值。1NE28資訊網——每日最新資訊28at.com

盡管只是進行了基礎優化,Rust 版本的表現已經超越了經過高度手動調整的 Go 版本,顯示出 Rust 在編寫高效程序方面的優勢。進一步的性能優化,如使用 BTreeMap 優化內存使用、替換度量庫、減少內存復制,使得 Rust 版本在延遲、CPU 和內存使用上全面超越了 Go。1NE28資訊網——每日最新資訊28at.com

優化后,我們順利地將服務推廣到生產環境,通過 Canary 節點測試發現了一些邊緣情況并進行了修復,之后成功地將其擴展到了整個服務艦隊。結果如下:1NE28資訊網——每日最新資訊28at.com

Go 是紫色,Rust 是藍色。1NE28資訊網——每日最新資訊28at.com

1NE28資訊網——每日最新資訊28at.com

提高緩存容量

在 Rust 服務穩定運行幾天后,我們決定提高 LRU 緩存的容量。由于 Rust 不受垃圾收集影響,我們能夠安全地增加緩存上限至800萬個讀取狀態,提升性能。結果表明,這一變化顯著改善了性能,平均響應時間降至微秒級別,而最大響應時間也僅為毫秒級。1NE28資訊網——每日最新資訊28at.com

1NE28資訊網——每日最新資訊28at.com

不斷發展的生態系統

最后,Rust 的另一個優點是它擁有快速發展的生態系統。最近,tokio(我們使用的異步運行時)發布了 0.2 版。我們進行了升級,它為我們帶來了免費的 CPU 優勢。下面您可以看到,從 16 日左右開始,CPU 一直較低。1NE28資訊網——每日最新資訊28at.com

1NE28資訊網——每日最新資訊28at.com

總結

從 Go 到 Rust 的初始移植于 2019 年 5 月完成。Discord 廣泛使用 Rust 提升性能和安全性,如我們將它用于游戲 SDK、Go Live 的視頻捕獲和編碼、Elixir NIF、多個后端服務等。Rust 的優勢包括易于重構的類型安全特性和強大的生態系統。1NE28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-96982-0.html不好意思,沒達到公司性能目標,決定從 Go 切換到 Rust

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Gopher的Rust第一課:Rust代碼組織

下一篇: 十大 Python 機器學習庫及其最新進展

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 理塘县| 肃宁县| 宝山区| 晋州市| 安仁县| 道孚县| 南平市| 宁南县| 开封市| 淮滨县| 怀来县| 安丘市| 连江县| 沙洋县| 祁连县| 吕梁市| 罗平县| 牙克石市| 襄城县| 普定县| 温宿县| 延津县| 南雄市| 喀喇沁旗| 镇赉县| 遂川县| 五华县| 高唐县| 麻栗坡县| 革吉县| 海丰县| 安溪县| 巴彦县| 元江| 江城| 和硕县| 株洲市| 江孜县| 宣化县| 嵩明县| 温州市|