基於 eBPF 的 Serverless 多語言應用監控能力建設

監控能力作爲基礎運維能力和核心穩定性措施,開發運維人員可以通過監控系統有效進行故障定位,預防潛在風險,分析長期趨勢進行容量規劃和性能調優,是軟件開發生命週期中必不可少的一環。與此同時,Serverless 作爲雲計算的最佳實踐和未來演進趨勢,其全託管免運維的使用體驗和按量付費的成本優勢,使得其在雲原生時代備受推崇,在下一個十年將成爲雲廠商提供的核心能力。隨着 Serverless 的心智普及度越來越高,場景覆蓋度越來越廣,更多使用 PHP, Python,C/C++, Node.Js, Golang 等語言的用戶開始進行 Serverless 架構升級。

對於這部分用戶來說,傳統的應用監控方案存在以下痛點:

  • 建設成本高:需部署一整套監控系統,包括數據採集,指標傳輸,持久化存儲,可視化展示,告警等模塊,增加了額外的資源成本和人力成本。
  • 埋點強入侵:需評估各語言,各框架,各接口的監控指標訴求,引入三方依賴進行繁瑣地手動埋點。雖然對於 PHP, Python 等語言,已經有藉助對象(模塊)替換增強的技術實現無需修改的指標採集,但其能力成熟度,框架兼容性,運行穩定性等方面都還有進一步提升的空間。
  • 運維複雜:用戶需要確保整個監控鏈路的低延時,高可用和指標準確性,需要對比分析引入監控埋點後對原有應用性能上的影響並持續優化。

    Serverless 產品需要提供一種統一的,開箱即用的,無入侵零改造的方式來實現任意語言的應用監控能力,使得多語言用戶可以充分享受 Serverless 帶來的普惠技術紅利。下面我們首先對其背後使用的 eBPF(Extended Berkeley Packet Filter) 技術進行介紹。

    eBPF 全稱爲 Extended Berkeley Packet Filter,始於 Linux 3.18,是一項革命性的 Linux 內核技術。eBPF 提供了基於系統或程序事件的高效,安全,無入侵執行特定代碼的通用能力。在 eBPF 誕生之前,由於用戶態與系統態相互隔離,應用程序無法直接處理內核數據,而如果直接修改內核又具備相當的複雜性,每次開發或調試都需要重新編譯,效率十分低下,安全性也無法保證。

eBPF 作爲一個運行在內核中的虛擬機,允許開發人員直接提交 eBPF 程序,在不修改內核代碼的情況下運行特定的功能。eBPF 程序基於事件驅動模型,當內核運行到特定 hook 點時會觸發執行,預定義的 hook 點包括系統調用、函數進入/退出、內核 tracepoints、網絡事件等。對於不存在的 hook 點也可以通過 KProbe,UProbe 進行動態埋點,提供內核態和用戶態函數的追蹤能力。藉助豐富的 hook 點,eBPF 技術可被廣泛應用於包括網絡監控、安全過濾和性能分析等諸多場景。

eBPF 的工作流程如下圖所示,首先通過在用戶空間內使用 LLVM 或者 GCC 將編寫好的 eBPF 程序編譯成爲字節碼,然後藉助系統調用 bpf 將其加載至內核中。eBPF 虛擬機將使用驗證器對字節碼進行安全性校驗,如只能使用受限的 helper 輔助函數,有限的循環次數和執行時間,DAG 判斷是否存在不可達代碼等,避免其造成內核崩潰。

安全校驗後 eBPF 字節碼將通過即時編譯器(JIT,Just-In-Time Compiler)編譯成爲原生機器碼,提供近乎內核本地代碼的執行效率,並掛載到具體的 hook 點上。用戶態程序與 eBPF 程序間通過常駐內存的 eBPF Map 結構進行雙向通信,每當特定的事件發生時,eBPF 程序可以將採集的統計信息通過 Map 結構傳遞給上層用戶態的應用程序,進行進一步數據處理與分析。

SAE(Serverless 應用引擎)作爲業界首款面向應用的 Serverless PaaS 平臺,全託管免運維,實現了單體 Web 應用,微服務應用以及定時任務的 Serverless 化。其核心優勢之一在於用戶可以低心智負擔,零改成成本的將其應用/任務直接部署至 SAE 中。目前在 JAVA 生態中,無論是代碼包部署,監控調用鏈的集成,還是分佈式調度框架的遷移,都可以讓用戶無需改動任何業務邏輯和版本依賴的情況下使用。

基於 eBPF 技術,SAE 應用監控支持了針對任意語言,任意框架的無入侵指標採集與監控告警能力,提供包括應用/實例維度的黃金三指標 RED(請求數,錯誤數,響應時間)和 HTTP 狀態碼統計,以及提供服務與依賴服務的接口級別調用信息。藉助內置可視化大盤,開發運維人員可以及時評估當前應用對外服務狀態,有效識別用戶體驗、服務中斷、業務異常等問題。

SAE 應用監控能力具備以下核心優勢:

  • 免運維:開箱即用,部署即生效,用戶無需額外運行維護監控告警組件。
  • 代碼無侵入:無需任何代碼埋點,無需任何依賴修改即可獲取到豐富的監控數據。
  • 語言無關:通過內核層進行網絡協議解析,支持任意語言,任意框架。
  • 多協議覆蓋:支持對 HTTP,MySQL,Redis,Kafka,DNS 等網絡協議,進行指標和鏈路的監控。
  • 高性能:通過減少數據在內核態和用戶態之間的拷貝,以極低的性能消耗獲取指標數據。

技術實現上,SAE 通過將 eBPF 探針以 sidecar 的形式與用戶業務程序部署在同一安全容器中,實現了多租隔離。eBPF 程序將會監聽 accept/close/read/write/sendto/recvfrom 等系統調用,獲取本地及遠端地址,線程上下文,文件描述符 fd 等信息,同時關聯當前容器實例信息產出原始事件。然後將原始事件的內容發送至用戶態程序。用戶態程序進行應用層協議識別,解析出協議的關鍵字段,匹配單條鏈路的請求和響應,同時經過事件過濾,維度收斂,元信息關聯,預聚合等步驟進行數據加工,生成最終指標。最後週期性將採集指標上報至 Arms Promethues 中進行持久化存儲。

總結

面向未來,雲計算將會全面 Serverless 化,多語言,全生態的支持將會是 Serverless 產品發力的重點,SAE 應用監控能力同樣會持續不斷的演進和增強,目前已經全面上線了無入侵,多維度,高性能的應用核心指標監控和告警能力,歡迎大家使用。同時在後續的 RoadMap 中,SAE 將會推出全局調用拓撲,服務上下游依賴,調用鏈路詳情等進階功能,打造更加完善的 Serverless 多語言可觀測體系。

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章