Linux資源分析工具雜談

Linux資源分析工具雜談

 

 

表1. 計算機科學中的延時

 

       軟件發展到今天可謂日新月異,短短的幾十年中極大的提高了人類的生產力。伴隨着軟件功能的發展,軟件的複雜度也在幾何級的增長,從經濟性的角度來講,人們總是希望投入更少的硬件資源,更少的電力,更少的時間來完成更多的生產任務,人們期望自己的每一度電,每一分鐘時間都在用在有意義的生產活動中。面對複雜的軟件,我們如何知道軟件在做有意義的事情而不是在無意義的阻塞,或者系統的哪一部分確實存在性能瓶頸,比如內存太小,硬盤太慢,CPU太慢等等。系統性能分析可以在不同的維度進行審視,常用的維度有負載分析和資源分析,本文希望從資源分析的角度對相關的工具進行討論。

       中國有句古話,工欲善其事,必先利其器,人類文明進步的最重要的標誌就是可以在對的時候使用對的工具。但是問題來了,什麼是對的時候使用對的工具?前人對問題總結後分成了三類,第一種是理解問題,也知道如何解決問題,第二種是理解問題,但是以個人的能力無法解決問題,第三類問題是不知道問題的存在,更不知道如何解決問題。第一種問題和第二種問題我們稱之爲基礎問題,因爲我們可以通過個人能力或者團隊合作解決這類問題,第三種問題未知的未知纔是我們需要重點關注的問題,理論上來說,在一個成熟的軟件開發週期中,不允許存在未知的未知,我們需要對系統的各個層次都有透徹的理解和深入的把握。

       當今世界的三大主流操作系統Linux, Windows NT, Mac OS都提供了系統的工具集來監控,排查各類性能問題,比如Windows平臺上Mark Russinovich的Sysinternals工具集,Windbg工具集,Linux 平臺上的Sysstat工具集, Brendan Gregg力推的DTrace工具集。爲了解決已知和未知的問題,我們首先需要對操作系統和硬件的相關指標有一個基礎的認識,否則即使有了適合的工具,統計出了詳盡的結果,我們仍然無法透徹的理解軟件和系統發生了什麼。如圖1所示是性能分析大神Brendan Gregg對常用的性能分析工具進行的詳盡總結。

 

 

 

圖1. Linux Performance Tools

 

基礎篇

 

       下面我們對圖1中的一些常用基礎分析工具以及應用場景進行簡單的分析。常用的性能分析工具包括:uptime, vmstat, mpstat, sar, ps, top, pidstat等等,這些命令的簡單描述請見表2。

 

 

表2. 常用性能分析工具簡單描述

 

       系統發生CPU性能問題時通常第一個使用的命令是uptime和top,uptime命令輸出系統過去1分鐘,5分鐘和15分鐘的平均負載,通過這三個數值可以粗略的分析出系統過去15分鐘內負載是降低了,升高了,或者是持平,uptime運行結果如圖2所示。

 

 

圖2. uptime運行結果

 

       多核系統分析中接下來要使用的命令通常是mpstat,我們可以通過mpstat對CPU的每個核的使用情況都進行監控,mpstat不僅可以對每個核心的數據進行分別統計,還可以對所有核心的平均使用情況進行統計,mpstat運行結果如圖3所示。

 

 

圖3. mpstat運行結果

 

       當我們使用top發現某一個進程的CPU或者其他資源使用異常的時候,我們可能需要引入第三個命令pidstat,我們甚至可以將這一統計數據精確到具體的線程。Top和pidstat運行結果見圖4和圖5。

 

圖4. Top運行結果

 

 

圖5. Pidstat分線程運行結果

 

       當我們需要對tcp流量進行簡單統計,又不願意要引入更復雜的tcpdump網絡監控的時候,sar命令是個不錯的選擇,當然,統計網絡流量只是sar的一個功能而已,更多功能可以參考sar man page, 使用sar命令統計tcp流量運行結果如圖6所示。

 

圖6. sar命令統計tcp流量運行結果

 

       限於篇幅的原因,此處不再一一討論圖1中的每一個命令。

 

進階篇


       動態追蹤是一種高級調試技術可以幫助開發人員以非常低的成本快速排查和解決軟件性能問題。當今世界軟件面臨的問題一是規模,二是複雜度。隨着 BPF 追蹤系統(基於時間採樣)最後一個主要功能被合併至 Linux 4.9-rc1 版本的內核中,Linux內核擁有了類似DTrace的原生追蹤功能。DTrace是Solaris系統中的高級追蹤器,功能強大,對於長期使用 DTrace 的用戶,這是一個振奮人心的消息,現在Linux系統上可以在生產環境中使用安全的、低負載的定製追蹤系統,通過執行時間的柱狀圖和頻率統計等信息,分析應用的性能以及內核。最初用於Linux的追蹤項目有很多,但是這個最終被合併進Linux內核的技術從一開始就根本不是一個追蹤項目:它最開始是用於伯克利包過濾器 Berkeley Packet Filter(BPF)的一個增強功能。這些補丁允許BPF重定向數據包,從而創建軟件定義網絡。久而久之,對事件追蹤的支持就被添加進來了,使得程序追蹤可用於Linux系統。BPF Compiler Collection (BCC), PLY 和 BPFTRACE都是正在開發的BPF前端,BCC架構如圖7所示,下面以BCC爲例對Linux動態追蹤技術進行簡單說明,

 

 

圖7. Linux BCC/BPF Tracing Tools

 

       假設我們有這樣一個場景,系統中偶爾會運行新的進程,這些新的進程可能會消耗大量系統資源,從而對我們生產上運行的環境產生干擾,但是這種進程可能運行時間極爲短暫,我們怎樣才能知道發生了這種情況呢?top?可能不行,時間太短了,可能top還沒來得及統計,進程已經退出了。這種情況下最適合使用的工具之一就是BCC工具集中的execsnoop,圖8中可以看出,每一個新啓動的進程都會被記錄在案。

 

圖8. Execsnoop命令運行結果

 

       網絡程序開發中我們可能想要按照TCP連接來統計一下通信兩端的吞吐量和生命週期,這個時候tcplife就派上用場了,tcplife對TCP會話的生命週期和吞吐量統計如圖9所示。

 

 

圖9. Tcplife命令運行結果

 

       對於一個給定的進程,我們甚至可以要求內核通過BPF統計CPU處理之外時間的內核和用戶堆棧,具體使用方法和示例請見圖10。

 

圖10 offcputime命令運行結果

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