當您學會使用 eBPF 效能分析解鎖詳細洞察時,不可靠的數據將成為過去。了解如何細粒度且高效地監控 CPU、記憶體和網絡數據。
譯自 Unlock detailed insights with eBPF profiling. Monitor CPU, memory, and network data granularly. Say goodbye to unreliable data.,作者 Aviv Zohari。
傳統的監控和可觀測性工具就像估計手機剩余電池時間的演算法:它們擅長跟蹤手機(或伺服器)總共使用了多少資源。它們還可以提供一些基本預測,比如您何時可能耗盡資源,並建議您可以進行的更改(例如關閉手機上的空閑套用,或者在可觀測性的情況下將工作負載移動到不同的節點)以提高資源消耗效率。
但它們並不擅長提供詳細、具體、細粒度的的數據。您的手機無法告訴您它將在何時何分耗盡電量。在大多數情況下,它甚至無法準確地告訴您哪些套用消耗了最多的電量。同樣,傳統的可觀測性工具只會讓您大致了解系統中發生的情況;它們不會生成詳細的效能分析數據或見解。
幸運的是,有一種更好的方法:eBPF 效能分析。使用 eBPF,一種內建於現代 Linux 內核中的簡潔小巧的技術,您可以對各種資源執行持續的效能分析。更好的是,基於 eBPF 的效能分析對您的應用程式施加的開銷很小,因此您不會浪費大量記憶體和 CPU 來弄清楚記憶體和 CPU 發生了什麽。
讓我們透過引導您了解如何透過 eBPF 進行效能分析、為什麽它有益以及如何開始使用 eBPF 作為傳統效能分析工具的替代品來解釋一下。
eBPF 效能分析是使用 eBPF 框架來收集有關 CPU、記憶體、網絡數據和其他資源使用情況的細粒度數據。(如果您不熟悉 eBPF,請檢視我們的網誌文章,其中回答了「什麽是 eBPF?」)
為了更詳細地理解這意味著什麽,讓我們退一步來談談一般的效能分析。在監控和可觀測性領域,效能分析是一種確定哪些資源被各個應用程式或行程消耗的方法。
因此,與其僅監控系統的總記憶體使用量或 CPU 利用率(您可以使用 Linux 工具(如 free 和 mpstat )來做到這一點),效能分析允許您確定特定行程或應用程式使用了多少記憶體、CPU 或其他資源。如果您想弄清楚某個套用或行程是否占用了超出其應有資源,或者辨識出您應該遷移到不同節點以釋放更多資源的工作負載,這些數據將派上用場——僅舉兩個您可能希望執行效能分析的範例。
大多數監控和可觀測性工具預設情況下不會對應用程式和行程進行效能分析;它們只跟蹤總資源消耗。但可以透過傳統工具執行效能分析。例如,您可以在 Linux 中使用 top 命令來獲取一些效能分析見解:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 74369 user 20 0 32.6g 76888 40264 S 6.0 0.5 25:43.84 slack 74393 user 20 0 1131.1g 254600 63572 S 4.7 1.6 17:06.80 slack 3392 root 20 0 4761140 59104 19700 S 2.3 0.4 115:59.39 kubelet
如您所見,在這種情況下, top 的輸出報告了正在系統上執行的特定行程(在本例中為 slack 和 kubelet)的記憶體和 CPU 利用率級別。
傳統效能分析與基於 eBPF 的效能分析
top 等工具透過檢視 Linux 檔案系統的 /proc 目錄來獲取效能分析見解,作業系統在其中報告有關正在執行行程的數據。因此,它們不會對工作負載進行效能分析,而是提取 Linux 內核預設情況下提供的有關活動行程的有限數據。它們完全依賴於使用者空間堆疊中可用的數據。
然而,使用 eBPF,一種不同的方法變得可行。eBPF 實際上可以透過監視堆疊跟蹤直接對系統上執行的任何應用程式或行程執行效能分析。它可以透過在內核空間中執行的特殊程式來做到這一點,這使得效能分析比依賴於在使用者空間中執行的請求要快得多。
基於 eBPF 的效能分析類別
eBPF 以低階方式與內核互動的能力意味著您可以使用eBPF 跟蹤 框架來執行多種類別的效能分析。
下面是轉譯並整理為 markdown 表格的內容:
描述 |
eBPF如何做 |
|
CPU profiling |
監控個別行程的 CPU 使用情況。 |
分析堆疊跟蹤進行效能分析。 |
Memory profiling |
跟蹤個別行程的記憶體分配和使用情況。 |
追蹤記憶體事件和分配請求。 |
Network profiling |
將網絡流量對映到行程。 |
將封包與行程關聯。 |
CPU分析
作為一種 CPU 效能分析解決方案,eBPF 允許您監視堆疊跟蹤以觀察各個行程或應用程式的 CPU 利用率級別。如果您想跟蹤哪些工作負載(或工作負載的哪些部份)消耗了最多的 CPU,並且可能剝奪了其他工作負載高效執行所需的計算資源,這將很有用。您還可以使用 CPU 效能分析來找出由於錯誤而消耗大量 CPU 的行程。
記憶體分析
同樣,您可以使用 eBPF 來分析單個行程或工作負載的記憶體分配和利用率。記憶體分析可幫助您確保記憶體正確分配到不同的工作負載之間。它還有助於解決記憶體泄漏等問題,當應用程式隨著時間的推移消耗越來越多的記憶體時,通常是由於應用程式或微服務中的記憶體管理不善造成的。
網絡分析
您不僅可以使用 eBPF 分析內部資源。您還可以透過將行程或應用程式對映到各個封包來跟蹤與網絡的連線。這種精細的網絡可見性級別為解決網絡效能問題(如高延遲率或丟包)提供了巨大的好處。它還可以幫助發現惡意網絡請求,並讓您了解工作負載如何對它們做出反應。
eBPF 分析在獲取系統見解中的重要性
既然您知道了如何將 eBPF 用作分析工具,那麽讓我們來討論一下為什麽您要執行 eBPF 分析。
簡單的答案是,基於 eBPF 的分析和堆疊跟蹤監控是一種獲取作業系統和工作負載內部發生情況的精細可見性的高效方式。透過分析各個行程和應用程式的資源消耗,您可以回答以下問題:
當然,這只是 eBPF 分析有用的原因中的一部份。使用 eBPF,您可以回答您可能遇到的有關任何應用程式或行程的資源利用率狀態或趨勢的幾乎任何問題。
eBPF 分析的好處
我們在上面提到,您可以使用其他類別的監控和可觀測性工具(例如,同樣古老的 top 命令)來分析應用程式。那麽,為什麽您要使用 eBPF 進行分析呢?
答案是,使用 eBPF,您可以獲得各種獨特的好處。
改善效能分析
由於 eBPF 程式在內核空間中執行,因此它們可以比在使用者空間中執行的監控應用程式更有效地從內核中收集有關資源利用率的數據。因此,您可以減少用於分析的資源,並為實際工作負載消耗更多資源。
改善可見性
使用 eBPF,您可以編寫自訂程式以高度可客製的方式收集分析數據。您不必局限於 /proc 中提供的通用資訊。
因此,基於 eBPF 的分析為您提供了比傳統方法更深入的可見性級別。
增強安全性和合規性
eBPF 程式在沙盒環境中執行,並且必須透過內核驗證才能執行。這些控制將有缺陷的 eBPF 分析常式使系統面臨風險的風險降至最低。
簡化部署
您可以在不修改內核或插入內核模組的情況下使用 eBPF 進行分析。只要您的節點執行的是 Linux 內核版本 4.16 或更高版本,那麽 eBPF 就內建其中。(公平地說,一些 Linux 發行版預設安裝了使用者空間分析工具,但這與將分析功能直接內建到內核中不同。)
eBPF 分析的挑戰
總體而言,值得註意的是,eBPF 作為一種分析解決方案並非沒有挑戰。
最大的挑戰是編寫和部署 eBPF 程式需要一些努力。您需要知道如何使用 C 等編譯語言進行編碼,並且您必須能夠編譯程式並將其載入到內核中,以便它們能夠與 eBPF 互動(您還可以使用解釋語言(如 Python)進行 eBPF 編程,但只能在包裝器的幫助下)。如果您已經熟悉 Linux 和編程,那麽學習如何執行這些操作並不是特別困難,但這個過程比執行不需要自訂編碼或專門部署的傳統監控工具更復雜。
eBPF 程式在執行前也必須經過驗證,這是個特性,而非缺陷,因為(如上所述)驗證有助於防止錯誤程式碼給系統造成問題。但這確實意味著你必須掌握 eBPF 驗證過程的復雜性,以確保你的程式碼能夠執行。
事實上,eBPF 仍然是一項相對較新的技術,並且仍在不斷發展。因此,不同的內核版本提供了不同版本的 eBPF,並且 eBPF 程式在不同的內核上執行時可能略有不同。如果你想在偏好設定了不同 Linux 版本的多個節點上使用 eBPF 進行分析,這可能會帶來挑戰。
在 Kubernetes 中使用 eBPF 進行持續分析入門
在 Kubernetes 中利用 eBPF 作為分析解決方案的過程很簡單。歸結為:
- 確保集群中的每個節點都偏好設定了支持 eBPF 的 Linux 內核。
- 在每個節點上部署 eBPF 代理以收集持續分析數據。
- 將數據推播到分析工具,以便理解數據。
此過程的確切步驟將根據你想要收集的分析數據以及你用來與框架互動的 eBPF 代理而有所不同。但作為一個範例,這裏有一個在 Ubuntu 上使用 eBPF 進行 CPU 分析的簡單方法。(此範例假定你的 Kubernetes 節點偏好設定了 Ubuntu 20.04 或更高版本。)
步驟 1:安裝 bpfcc-tools
首先,安裝 bpfcc-tools 0.12.0-02 或更高版本:
sudo apt-get install bpfcc-tools
此軟件包提供了一個名為 profile 的工具,該工具透過 eBPF 分析 CPU 利用率。
步驟 2:分析 CPU
接下來,執行該工具以收集分析數據:
如果你不傳遞任何參數, profile 將持續分析來自整個系統的堆疊跟蹤,並在命令列上打印分析和跟蹤數據。如果你想分析特定行程或控制分析頻率,請檢視該工具的手冊頁以了解適當的 CLI 參數。
步驟 3:分析數據
要將數據移動到可以分析它的位置,你可以將 profile 的輸出重新導向到檔或數據流:
然後,在所選的分析或視覺化工具中聚合數據以理解數據。
這是一個使用 eBPF 進行分析的非常基本的範例。對於更復雜的使用案例,你可能希望編寫自己的自訂 eBPF 程式,而不是依賴於通用工具(如 profile ),它無法對收集哪些數據以及如何收集數據提供太多控制。
但是,如果你只是想尋找一種快速簡便的方法來在 Kubernetes 中使用 eBPF 進行分析,那麽我們剛才介紹的方法就可以完成這項工作。
在 Kubernetes 中使用 groundcover 進行持續分析
作為部署自己的 eBPF 代理和手動管理分析數據的替代方案,你還可以使用 groundcover,它利用底層的 eBPF 來監視堆疊跟蹤並收集此數據。使用 groundcover,你可以獲得基於 eBPF 的分析效率,而無需設定和管理自己的工具。
分析以獲得樂趣和利潤
eBPF 並不是收集分析數據的唯一方法,但它比傳統分析方法更高效、更安全。eBPF 可以讓你以更低的開銷獲得更多數據,並且導致伺服器出現問題的風險更低。如果你尚未轉向 eBPF 作為提升分析方法的一種方式,現在是時候了。