RFC-0035:自動追蹤流量 | |
---|---|
狀態 | 已遭拒 |
區域 |
|
說明 | 在 FIDL 繫結中新增追蹤事件後,就能啟用 Fuchsia 不同程序的端對端流程,而不用手動捲動自訂 ID。 |
作者 | |
提交日期 (年/月) | 2019-02-28 |
審查日期 (年/月) | 2019-02-28 |
拒絕原因
如果訊息沒有回應 (也就是事件或觸發並忘記呼叫),交易 ID 會設為 0,因此無法使用建議配置區分。
部分供應商會使用 zx_channel_call(),在核心中指派交易 ID 並等待回覆。(這個模式可讓並行呼叫端依賴核心同步處理,避免系統在指派交易 ID 時鎖定使用者空間)。同樣地,建議的配置無法區分這些配置。
核心追蹤支援功能應提供這項審查所需的遙測功能,且建議您改善這項機制,而非在 FIDL 繫結中推送。
最後,在 SDK 依附元件宣告順序中,使用 FIDL 和使用 FIDL 繫結方式非常接近頂端,因為在 Fuchsia 上過度使用 FIDL。如果在繫結中加入遙測和指標,這類問題就會按照該順序引發這類疑慮,但我們無法對此順序有疑慮。有些建構和選擇加入的技巧可以被判斷,因此需要做為未來提案的一部分。
摘要
在 FIDL 繫結中加入追蹤事件後,無須手動捲動自訂 ID,即可在 Fuchsia 上跨程序進行端對端流程。
提振精神
如果有大量的駭客攻擊,可在 Fuchsia 上跨程序邊界發生流程事件。我們能夠以不會複雜 API 介面且需要減少人工作業的方式,將大部分的自動化作業自動化。
設計
Fuchsia FIDL 函式的標準屬性,可將資料流的開始/結束事件新增至其個別產生的繫結。
這個屬性會設定追蹤記錄的類別,並使用通訊協定函式做為名稱。目前在 Fuchsia 上追蹤僅支援一個類別,因此屬性可能包含「N」類別,我們預期只能使用其中一個類別,並且會使用清單中的第一個類別。
protocol Example {
[Trace = "CATEGORY"]
ExampleFn(bool test) -> (bool status);
};
專屬的跨程序 ID 是由序數 ID、交易 ID (包含在每則訊息中) 和傳輸機制的 ID (用於 zircon 管道:傳送程序管道控制代碼,以及接收程序控制代碼的相關 koid) 與非密碼編譯雜湊結合。
ZDL 管道中的 FIDL 穩定追蹤 ID 範例
建議您結合下列幾種 ID:
- FIDL 管道的伺服器端 koid 能夠透過 zx_object_get_info()、主題
ZX_INFO_HANDLE_BASIC
取得,方法是使用伺服器端的 koid,以及用戶端上的相關 koid。 - 交易訊息的方法序數 (注意:這是目前是 uint32 雜湊值,很快就會演變成 uint64 雜湊值,請參閱 RFC-0029)。
- 最後是交易訊息的交易 ID。
這三種 ID 的組合方式應依照以下優先順序,盡力減少可能的追蹤記錄 ID 衝突:
- 兩則不同的訊息,具備「相同序數」,以及「同一個用戶端與伺服器」之間;
- 兩則不同的訊息,具備「不同序數」,以及「相同的用戶端與伺服器」之間;
- 兩個不同的訊息之間,包含「不同序數」,以及「不同的用戶端和伺服器」。
目前,Koid 的指派作業大部分按順序進行。因此,子項最低位元的熵會比最高的位元更多。 同樣地,系統會依序指派交易 ID,因此最低位元的熵會增加。方法會經過加密編譯,即使最高位元保留給系統使用,也可以放心假設所有位元都有相同的熵。
因此,合理的演算法會判斷目前條件為 OR:
koid & OxFFFF << 48
ordinal & 0xFFFFFFFF << 16
transaction ID & 0xFF << 0
追蹤記錄時間長度也會在 FIDL 繫結接收端開始。使用 C++/Rust 等語言時,這會使用 RAII 界定範圍,並允許事件與其他流程事件合併。
人體工學
這使得追蹤系統更容易使用,這對我們的基礎架構來說也是一大優點。
說明文件與範例
說明文件需要更新,以說明如何新增追蹤記錄 (如上所述)。
回溯相容性
這項變更與 API 相容,而且與 ABI 相容。
效能
停用追蹤類別時,這麼做會產生少許費用,而每個 dje@google.com 測試 (在 NUC 上) 不到 5 奈秒。假如需要提升效能,我們也可以從 IR 中移除追蹤註解。
安全性
不會對安全性造成任何影響。
缺點、替代方案和未知
替代選項
核心追蹤機制
針對管道讀取和頻道寫入,使用現有的 ktrace 流程事件。
如果沒有這項功能,則可以在基礎管道讀取和寫入上使用現有 ktrace 流程事件,嘗試達成目標。但這並不理想,因為管道適用於所有 FIDL 介面,這表示只能指定一個類別。這表示為了實際使用,使用者必須啟用管道讀取和管道寫入類別,這表示所有管道讀取和寫入事件 (而非只用於興趣的 FIDL 介面) 的事件都會顯示。這會導致更難以讀取追蹤檢視器輸出內容、不必要的 ktrace 緩衝區使用,並仰賴 FIDL 實作詳細資料。