Linux getrandom() 獲得 8450% 效能提升

2022-02-23 09:00:06

Jason Donenfeld 是 WireGuard 的主要開發者,同時他也是 Linux 核心亂數相關程式碼的維護者,近日在他的領導下,Linux 核心的亂數生成器程式碼有了巨大幅度的改進。

在之前的 Linux 5.17 中,Jason Donenfeld 就在隨機程式碼用 BLAKE2s 代替了 SHA1,由於 BLAKE2s 自帶的特性,前者通常比後者更快更安全。經過測試,通過這個簡單的轉換就能獲得 131% 左右的速度提升。

雖然在 Linux 5.17 中有了速度上的大幅提升,但 Jason Donenfeld 對此並沒滿足。因此在 Linux 5.18 中他對隨機程式碼作出了更多的改進。

通過檢視 Linux 的 倉庫的紀錄檔能夠看出(上圖),開發者 Jason Donenfeld 在最近兩天時間裡進行了大量的程式碼提交。這些提交內容都將在 3 月下旬 Linux 5.18 的合併視窗啟動時引入核心。

在特別強調到,通過使用正在開發的最新程式碼,用於獲取隨機位元組的 getrandom() 呼叫能夠獲得更好的效能。在配備英特爾 Xeon E5-2697 v2 @ 2.70GHz CPU 和 112G 記憶體的裝置上進行 stress-ng getrandom() 基準測試後,更是獲得了 8450% 的效能提升。

此次更改基本上會將之前的全域性結構(實際上是 per-numa 節點結構)更改為 per-cpu 結構,這意味著快速路徑上的許多鎖都會消失。因此,當在具備多核的 CPU 上同時嘗試 getrandom() 時,毫無疑問效能會出現提升。只不過沒想到在測試中能帶來 8450% 的提升。

除此之外,當從 per-numa 更改為 per-cpu 後,也將不再需要被推遲到工作佇列上線後才能進行。也正如我之前所說,此次改進將會為高核心數的電腦和伺服器帶來巨大收益。

展開閱讀全文