最近一項針對 OpenTelemetry Go SDK 的效能基準測試揭露了顯著的負擔成本,這在開發者之間引發了關於最佳化策略和替代方案的激烈討論。該測試測量了一個處理每秒 10,000 個請求的簡單 HTTP 伺服器,當啟用完整的可觀測性功能時,顯示出明顯的效能影響。
基準測試結果引起了 Go 社群的關注,特別是因為它們突顯了許多團隊在實施全面可觀測性時面臨的實際成本。雖然這種負擔不一定是禁止性的,但在大規模應用時仍然相當可觀。
測試配置
- 負載:每秒 10,000 個請求
- 基礎設施:4 個 Linux 節點(每個節點配置 2 vCPU、8GB RAM)
- 元件: Go HTTP 伺服器、 Volkey 資料庫、 wrk2 負載產生器
- 持續時間:每次測試 20 分鐘
- 網路:主機網路模式以避免 Docker 代理開銷
![]() |
---|
顯示 CPU 使用率隨時間變化的圖表,突出顯示啟用完整可觀測性功能時的效能開銷 |
CPU 使用率在完整檢測下躍升 30%
最令人震驚的發現是 CPU 負擔。當啟用 OpenTelemetry 追蹤時,CPU 使用率從 2 個核心增加到大約 2.7 個核心——增加了 30%。這種增加主要來自於 span 處理、資料匯出操作,以及像 Redis 呼叫等檢測操作,這些操作大約增加了 7% 的額外負擔。
社群成員已經開始提出減少這種影響的解決方案。一位開發者已經識別出幾個最佳化機會,包括使用更快的時間函式、用原子操作替換互斥鎖,以及實施直接的 protocol buffer 序列化而非基於反射的方法。
CPU 負載細分
- Span 處理:約佔總 CPU 時間的 10%
- Redis 操作:在 go-redis 呼叫上增加 7% 負載
- HTTP 處理器:來自已檢測中介軟體的額外負載
- eBPF 替代方案:<0.2 核心負載(顯著較低)
記憶體和網路成本不斷累積
除了 CPU 使用率,測試還揭露了其他資源影響。記憶體消耗從 10MB 增加到 15-50MB 之間,而網路流量大幅躍升,每秒匯出 4MB 的遙測資料。對於高吞吐量服務或有嚴格網路限制的環境,這種額外的頻寬使用成為一個真正需要考慮的問題。
延遲影響較為溫和但仍然可測量。第 99 百分位的回應時間從 10 毫秒增加到約 15 毫秒,儘管整體吞吐量保持穩定在每秒約 11,800 個請求。
效能影響摘要
- CPU 使用率:從 2.0 核心增加至 2.7 核心(+30%)
- 記憶體使用量:從約 10MB 增加至 15-50MB
- 網路流量:新增 4MB/秒(32 Mbps)的遙測資料
- 延遲時間(p99):從 10ms 增加至 15ms
- 處理量:維持穩定在每秒約 11,800 個請求
取樣策略變得至關重要
社群討論突顯了基準測試中的一個重要缺口:它沒有實施大多數生產系統使用的取樣策略。幾位經驗豐富的開發者指出,在高流量下追蹤每一個請求既不現實也不必要。
「在每秒 10k 請求的情況下追蹤每個 http 200 不是你應該做的事,在那種速率下你應該取樣 200 個(1% 左右)並追蹤所有錯誤。」
然而,實施智慧取樣引入了自己的複雜性。團隊希望捕獲所有錯誤,但你不知道請求是否會出錯,直到它完成。這創造了一個先有雞還是先有蛋的問題,需要複雜的尾部取樣系統。
eBPF 作為輕量級替代方案出現
基準測試也測試了基於 eBPF 的檢測作為替代方法。這種核心級監控技術顯示出更低的負擔——即使在重負載下也保持在 0.2 CPU 核心以下。雖然 eBPF 無法提供與基於 SDK 方法相同的詳細追蹤,但它為需要可見性而不需要效能成本的團隊提供了實用的中間地帶。
詳細可觀測性與系統效能之間的權衡繼續挑戰開發團隊。一些組織,特別是在高頻交易和廣告技術領域,發現傳統追蹤負擔完全不可接受,使得基於 eBPF 的解決方案越來越有吸引力。
前方的最佳化挑戰
社群回應表明,透過集中的工程努力可以實現顯著的效能改進。開發者指向其他系統中的成功實施,如 TiDB 的高度最佳化追蹤系統,作為可實現目標的例子。
挑戰在於平衡最佳化複雜性與可維護性。雖然原子操作和自定義序列化可以提升效能,但它們也引入了微妙的錯誤和維護負擔,開源專案必須仔細考慮。
對於大多數團隊來說,目前的負擔代表了 OpenTelemetry 提供的除錯和監控能力的可管理權衡。然而,隨著應用程式規模擴大和效能要求收緊,這些最佳化討論對於專案未來的採用可能會變得越來越重要。