RFC-0181:無鎖定可捨棄的 VMO

RFC-0181:無鎖定可丟棄的 VMO
狀態已接受
區域
  • 核心
說明

允許讀取及寫入處於解鎖狀態的可捨棄 VMOs。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2022-05-18
審查日期 (年-月-日)2022-08-03

摘要

無鎖的可丟棄 VMOs 是可丟棄的 VMOs 的子類型,即使未上鎖,也允許存取。VMO 仍可能隨時遭到捨棄,使用者必須能接受資料突然完全遺失的情況。為了改善誘因用途的使用情況,VMO 提示作業已擴充至涵蓋可捨棄的 VMOs。

提振精神

追蹤是一種工作負載,希望能將效能額外負擔降至最低,並產生大量資料。由於鎖定和解鎖的額外負擔,目前可捨棄的 VMOs 不適合用於此用途。使用一般匿名 VMOs 的現行缺點是,由於產生的資料大量爆增,追蹤記錄可能會導致系統發生 OOM 問題。

追蹤引擎可容許任意資料遺失。也就是說,即使在讀取或寫入期間,追蹤 VMO 也能任意取消提交,而不會造成問題 (除了追蹤資料遺失)。此外,與讓整個系統發生 OOM 相比,讓部分追蹤資料遺失會是較佳的做法。

允許在解鎖時使用可捨棄的 VMOs,可解決所有這些問題,因為:

  • 追蹤遭到捨棄的 VMO 內容,即可避免系統 OOM。
  • 寫入追蹤 VMOs 不會產生額外負荷。
  • 追蹤功能已可容許資料遺失,並會將 VMO 捨棄視為資料遺失。

雖然追蹤系統可容許資料遺失,但建議您只在需要時捨棄追蹤,以免發生 OOM。目前沒有任何機制可控制核心何時會對可丟棄的 VMOs 執行回收作業,也無法平衡丟棄 VMOs 與其他形式的回收作業。為了提高追蹤產生的可靠性,且不影響 OOM 防範機制,因此我們希望能夠在需要時,通知核心從這些記憶體中回收。

相關人員

協助人員:

未定

審查者:

未定

諮詢:

未定

社會化:

eieio@ 和 rashaeqbal@

設計

建立標記

無鎖定可捨棄的 VMOs 是一般可捨棄的 VMOs 的子類型,應透過將選項 ZX_VMO_DISCARDABLE_LOCKLESS 傳遞至 zx_vmo_create 來建立,而非一般 ZX_VMO_DISCARDABLE 選項。建立的可捨棄 VMO 仍會在解鎖狀態下啟動,唯一的差異在於,在解鎖狀態下,讀取和寫入 VMO 會成功,而不會產生錯誤。

控制版權聲明

VMO 範圍作業 ZX_VMO_OP_DONT_NEEDZX_VMO_OP_ALWAYS_NEED 的 API 定義會擴充,涵蓋可捨棄的 VMOs,而非僅限於 pager 支援的 VMOs。

鎖定行為

雖然無鎖棄置項目可在未鎖定狀態下使用,但仍可透過 ZX_VMO_OP_LOCK 和相關作業進行鎖定。鎖定行為與一般可棄置的 VMO 相同,且在鎖定期間,內容無法棄置。

實作

ZX_VMO_DISCARDABLE_LOCKLESS 的系統呼叫標記必須透過 VMO 建立傳遞,並成為內部 VMO 中的標記。

當 VMO 遭到解鎖,並由幾個相關的程式碼路徑檢查可捨棄狀態,且在解鎖時產生錯誤時,現有的可捨棄 VMOs 實作會明確導致錯誤。這些檢查只需要擴充,如果是 LOCKLESS 變體,就不會產生錯誤。

內部可捨棄清單中可捨棄的 VMOs 移動作業也需要稍微變更。由於無鎖定 VMO 可能隨時都有頁面可棄用,而非只有在自上次棄用後才鎖定,因此這些頁面在棄用後必須留在可棄用清單中。

對於回收變更,系統會忽略 ZX_VMO_OP_ALWAYS_NEED 的範圍,並一律將其提升為完整 VMO。系統會建立可捨棄的清單,並在其中放置提示的 VMOs。系統會在 ALMOST_OOM 壓力下,將此清單從記憶體中移除。ZX_VMO_OP_DONT_NEED

  • 如果 VMO 已解鎖,請立即丟棄
  • 將 VMO 移至一般刪除清單 (如果尚未移至的話)。

在對應時,無鎖的可捨棄 VMOs 不需要 ZX_VM_ALLOW_FAULTS 標記。

這一切都可以透過單一小型 CL 完成,且不會有其他依附元件。

成效

在已是慢速路徑情境中,額外加入單一布林值檢查,對 VMO 作業不會造成任何效能影響。

安全性考量

隱私權注意事項

測試

測試將加入 Zircon 核心測試套件。

說明文件

需要更新相關的系統呼叫說明文件:

  • zx_vmo_create - 文件 ZX_VMO_DISCARDABLE_LOCKLESS
  • zx_vmo_op_range - 更新 ZX_VMO_OP_ALWAYS_NEEDZX_VMO_OP_DONT_NEED 支援的 VMO 類型陳述式。
  • zx_vmar_map - 針對無鎖定可丟棄的 VMOs,更新 ZX_VM_ALLOW_FAULTS 的規定。

缺點、替代方案和未知事項

原始可捨棄的 RFC 說明瞭使用原子最佳化,可提供大部分的效能提升。這種做法有兩個缺點:

  1. 核心和使用者空間之間的 API 是未知領域,因此探索起來會相當複雜,這也是為何在原始提案中未採用這項 API 的原因。
  2. 即使鎖定頁面很有效率,但仍不必要,而且實際上會違背我們希望這些 VMOs 隨時可完全捨棄的記憶體需求。

既有技術與參考資料