Ring Buffer 和 Perf Buffer 都是在 eBPF 程式中用來將資料從核心空間傳送到使用者空間的機制

Ring Buffer

特點

  • 更新的技術,Linux 5.8 後推出
  • 單一生產者多重消費者 (Single Producer Multi Consumer) 模型
  • 更好的效能和記憶體使用效率
  • 動態大小調整

優點

  • 較低的 CPU 開銷
  • 較少的記憶體使用
  • 更好的多執行緒支援
  • 不會遺失事件

範例

use aya::maps::RingBuf;
 
// 在 eBPF 程式中定義
#[map(name = "EVENTS")]
static mut EVENTS: RingBuf = RingBuf::with_max_entries(256, 0);
 
// 在使用者空間讀取
let mut ring_buffer = bpf.map_mut("EVENTS")?;
while let Some(data) = ring_buffer.next()? {
    // 處理資料
}

Perf Buffer

特點

  • 較舊的技術
  • 基於 Linux perf 子系統
  • 固定大小的緩衝區
  • 每個 CPU 核心一個緩衝區

問題

  • CPU 開銷較大
  • 記憶體使用較多
  • 在高負載時可能丟失事件

範例

use aya::maps::PerfEventArray;
 
// 在 eBPF 程式中定義
#[map(name = "EVENTS")]
static mut EVENTS: PerfEventArray<MyEvent> = PerfEventArray::with_max_entries(1024, 0);
 
// 在使用者空間讀取
let mut perf_array = bpf.map_mut("EVENTS")?;
perf_array.poll(|events| {
    for event in events {
        // 處理資料
    }
})?;

比較

特性Ring BufferPerf Buffer
效能較佳較差
記憶體使用較少較多
多執行緒支援較差
實作複雜度簡單較複雜
核心版本要求5.8+所有版本
事件保證不會遺失可能遺失