bpftime 專案開發了 eBPF 的使用者空間實現

提出了 bpftime 項目,該項目開發了一個運行時和一個虛擬機,用於在用戶空間中執行 eBPF 處理程序。 Bpftime 允許 eBPF 追蹤和進程幹預程式完全在用戶空間中運行,使用 uprobe 和程式系統呼叫攔截等功能。值得注意的是,透過消除不必要的上下文切換,與使用 Linux 核心提供的 uprobe 和 uretprobe 功能相比,bpftime 可以實現十倍的開銷減少。此外,bpftime 極大地簡化了調試,可以在沒有 Linux 核心的系統上使用,並且不需要將 eBPF 應用程式載入到核心中所需的提升權限。該專案程式碼是用 C/C++ 編寫的,並根據 MIT 許可證分發。

系統呼叫的攔截和uprobe 檢查的整合是使用重寫可執行程式碼(二進位重寫)技術來實現的,其中對系統呼叫、入口點和本地函數的呼叫被透過修改機器碼轉換到偵錯處理程序來代替。執行應用程序,這比在 Linux 內核層級使用 uprobe 組織攔截要有效得多。

支援替換或更改函數、附加處理程序(掛鉤)和過濾器、重定向、阻止或替換系統呼叫參數、攔截函數的入口點和出口點以及在程式碼中的任意偏移處替換處理程序的操作。 Bpftime 可以附加到系統上任何正在運行的進程,而無需重新啟動或重建它。對於正在運行的進程,可以透過 ptrace 將 bpftime 替換為進程,也可以透過 LD_PRELOAD 載入進程。

作為 bpftime 的一部分,正在開發一個運行時,它允許您將 eBPF 程式附加到系統呼叫和 uprobe 追蹤點;帶有 JIT 的 eBPF 虛擬機,用於在使用者進程層級隔離執行 eBPF 程式(另外支援 AOT 編譯);用於與核心互動並組織與核心的uprobe子系統的兼容性的後台進程(bpftime支援將eBPF從核心載入到用戶空間的模式,以組織與核心中的eBPF程式的協作,例如用於處理kprobe或設定網路過濾器)。

eBPF虛擬機被設計為插件庫,並提供類似ubpf的API,這使得它可以用來將eBPF功能整合到其他專案中。對於來自多個進程的資料的匯總聚合,支援建立位於共享記憶體中的聯合 eBPF 映射。與 bpftime 一起,可以使用為在核心中使用而編寫的標準 eBPF 處理程序,並且可以使用標準 clang 和基於 libbpf 的工具進行彙編。

透過 bpftime,BCC、bpftrace 和 Deepflow 等追蹤系統可以在使用者空間中執行。例如,我們示範了使用 BCC 框架中的 sslsniff 腳本來分析和儲存 nginx 中的加密流量。在進行的測試中,在核心端執行 sslsniff 時,nginx 效能下降了 58%,而將處理程序移至使用者空間時,效能下降了 12.3%。

核心中使用原始eBPF的進程追蹤架構:

bpftime 專案開發了 eBPF 的使用者空間實現

使用 bpftime 的使用者空間追蹤架構:

bpftime 專案開發了 eBPF 的使用者空間實現

混合模式,其中 bpftime 與核心中的 eBPF 一起工作,例如,安裝網路過濾器或將單一處理程序移至用戶空間:

bpftime 專案開發了 eBPF 的使用者空間實現

未來的計畫包括:替代異常的能力(故障注入);熱補丁(Hot Patching)改變操作邏輯或修正二進位程式集中的錯誤;為 Nginx 建立一個模組,讓您可以使用 eBPF 程式建立擴充(例如,用於動態路由選擇、快取、應用安全性原則和負載平衡);擴展 FUSE 子系統的功能(例如,以 eBPF 程式的形式建立 FS 的擴充功能以進行快取或存取控制)。

來源: opennet.ru

添加評論