????? 在現代計算環境中,網絡性能對于系統的整體性能至關重要。網絡瓶頸不僅會影響數據傳輸速度,還會影響應用程序的響應時間,最終影響用戶體驗。為了有效地解決網絡性能問題,了解和使用各種追蹤工具至關重要。另外一方面,造成網絡性能問題的原因有很多,而本文主要關注從Linux內核的角度對網絡性能問題的追蹤。本文將介紹三種在Linux下常用的性能追蹤工具:LTTng、ftrace和內核打印輸出,利用這三種工具,可以分別從Linux內核四層及以下協議棧實現代碼以及Linux內核應用層協議實現代碼入手,在主機上對網絡性能問題進行跟蹤。
2. Linux內核網絡協議棧
????? Linux內核網絡協議棧是一個復雜且高效的系統實現,用于處理所有網絡通信任務。它涵蓋了從底層的硬件接口到高層的應用協議,負責數據包的接收、處理、轉發和發送。理解Linux內核網絡協議棧的結構和工作原理,對于優化網絡性能、開發網絡應用和排除網絡故障非常重要。
Linux內核網絡協議棧遵循OSI模型和TCP/IP模型的層次結構,主要包括以下幾個層次:
- 物理層:負責實際的硬件傳輸,如網卡驅動程序。
- 數據鏈路層:包括以太網協議,負責數據幀的封裝和解封裝。
- 網絡層:主要包括IP協議,負責數據包的路由和轉發。
- 傳輸層:包括TCP和UDP協議,負責端到端的數據傳輸。
- 應用層:包括NFS等協議,直接服務于應用。
圖1 Linux內核網絡協議棧
????? 圖1是Linux內核網絡協議棧結構,摘自騰訊云開發者社區[1]。由圖可見,在Linux系統中,網絡報文的接收沿著Linux網絡協議棧向上流轉,而網絡報文的發送沿著Linux網絡協議棧向下流轉。我們可以利用工具在Linux網絡協議棧實現的各個部分進行追蹤和分析,就能定位網絡性能問題的根源。
3. ?ftrace工具
????? ftrace 是 Linux 內核提供的一種強大的跟蹤框架,主要用于診斷和調試內核中的性能和功能問題。ftrace 允許開發人員和系統管理員跟蹤內核函數的調用、系統事件和其他內核行為 [2]。
?????? ftrace 的基礎是 trace 文件系統,它位于 /sys/kernel/debug/tracing 目錄下。該文件系統包含許多文件和子目錄,用于配置和查看跟蹤數據。Ftrace 通過對這些文件進行讀寫操作來控制和獲取跟蹤信息。
ftrace 支持多種跟蹤器(tracer),每種跟蹤器提供不同的跟蹤功能。主要的跟蹤器包括:
- function tracer: 跟蹤內核函數的調用和返回。
- function_graph tracer: 跟蹤內核函數調用圖,包括函數的調用關系和時間消耗。
- sched tracer: 跟蹤調度事件。
- irq tracer: 跟蹤中斷處理事件。
????? ftrace 使用內核中的跟蹤點(tracepoints)來收集數據。跟蹤點是內核代碼中的特定位置,當代碼執行到這些位置時,會觸發一個事件記錄。這些事件記錄了各種信息,如時間戳、CPU ID、進程 ID 等。
???? ftrace 使用內核的環形緩沖區(ring buffer)來存儲跟蹤數據。環形緩沖區的大小是可配置的,當緩沖區滿時,新的跟蹤數據會覆蓋最舊的數據。用戶可以從緩沖區讀取跟蹤數據進行分析。
圖2 利用ftrace對Linux網絡協議棧進行追蹤
????? 圖2是國科環宇利用ftrace對Linux網絡協議棧進行追蹤的結果,從上圖可見,套接字在發送過程中,由于要處理外設中斷,導致了網絡發送性能下降。
4. ?LTTng工具
????? LTTng(Linux Trace Toolkit Next Generation)是一款功能強大的跟蹤工具,用于捕獲和分析Linux系統中的內核和用戶空間事件。LTTng內核跟蹤器通過內核模塊實現,這些模塊在內核空間中插入跟蹤點,用于捕獲內核事件。常見的內核模塊包括 lttng-modules,這些模塊提供了捕獲系統調用、調度事件、中斷處理等功能。LTTng設計了一套高效的事件處理機制,包括鎖定最小化、CPU本地緩存和批量處理等,確保在高負載下的低開銷和高性能。
????? 國科環宇將利用LTTng在高負載下的優良特性,對網絡協議棧的性能問題進行追蹤和排查。
5. ?內核打印輸出
????? 對于實現在內核的應用層協議如果出現性能問題,很難用常規的方法對其進行定位,這時利用內核打印輸出可以比較清晰地追蹤到性能瓶頸的根源。
????? 例如sunrpc.nfs_debug 和 sunrpc.rpc_debug 是 Linux 內核中用于調試 NFS(Network File System)和 RPC(Remote Procedure Call)功能的調試選項。它們通常用于開發和調試階段,以幫助診斷和解決與 NFS 和 RPC 相關的問題。
????? sunrpc.nfs_debug用于啟用 NFS 客戶端和服務器端的調試信息輸出。它允許開發人員和系統管理員跟蹤和調查 NFS 文件系統的運行時行為。通過設置sunrpc.nfs_debug可以跟蹤 NFS 操作,例如文件的讀寫請求。捕獲 NFS 錯誤和超時情況。分析 NFS 客戶端與服務器之間的通信問題。
????? sunrpc.rpc_debug 用于啟用 RPC(Remote Procedure Call)層的調試信息輸出。RPC 是一個用于遠程過程調用的協議,NFS 以及許多其他網絡服務都使用 RPC 進行通信。通過設置sunrpc.rpc_debug,可以跟蹤 RPC 消息的發送和接收。捕獲 RPC 調用失敗或超時情況。分析 RPC 協議層面的問題,如協議版本不匹配或消息格式錯誤。
????? sunrpc.nfs_debug 和 sunrpc.rpc_debug的輸出都是以內核打印的形式呈現的。
6. 結論
????? 在 Linux 系統調試和性能優化中,選擇適當的工具取決于具體的需求和場景。LTTng 和 ftrace 提供了強大的跟蹤能力和高級的數據分析功能,適合復雜的調試和性能分析任務;而內核打印輸出則是一個簡單但實用的調試工具,適合對實現在內核的應用層協議進行跟蹤。根據實際情況靈活選擇和組合使用這些工具,能夠更有效地提升系統的可靠性和性能。
7. 參考文獻
[1] Linux Networking Stack: Sending Data. kernel|network| Linux Networking Stack: Sending Data-騰訊云開發者社區-騰訊云
[2] ftrace - Function Tracer . https://www.kernel.org/doc/html/v4.17/trace/ftrace.html