面試官提問:Linux 系統故障時,你會用哪些工具排查?
引言
正如標題所言:如果面試官問你,如果在 Linux 中系統出現了問題,你會使用哪些工具排查呢?
那就把下面的三分之一記住就足夠了,如果面試官不服氣,那就把下面所有的都給他說一遍,讓他啞口無言。
開始
簡介
性能分析
? top: 實時顯示系統的 CPU、內存使用情況,以及各個進程的資源消耗。
? htop: top 命令的增強版,界面更友好,支持鼠標操作,可以更加方便地查看和管理進程。
? mpstat: 顯示各個 CPU 核心的使用情況,分析多核系統中的 CPU 負載。
? sar: 系統活動報告工具,可以監控 CPU、內存、I/O 等系統資源的使用情況。它可以在長時間內進行系統性能的數據采集。
? vmstat: 查看 CPU、內存、交換分區的性能,能夠檢測 CPU 的等待時間和系統瓶頸。
內存性能分析
? free: 顯示系統當前的內存和交換分區使用情況。
? vmstat: 顯示內存、進程、I/O 系統的性能狀態。可以幫助分析內存的使用情況。
? smem: 詳細列出每個進程的內存消耗情況。
? top / htop: 可以查看每個進程的內存使用情況。
? slabtop: 顯示內核 slab 緩存的使用情況,有助于了解內存中緩存數據塊的分布。
磁盤性能分析
? iostat: 顯示磁盤 I/O 的性能統計信息,尤其是在分析磁盤讀寫性能時非常有用。
? iotop: 類似于 top,但專注于磁盤 I/O,能夠按進程顯示實時 I/O 活動。
? df: 顯示文件系統的磁盤使用情況。
? du: 顯示文件或目錄的磁盤空間使用情況。
? lsblk: 列出所有存儲設備和分區信息。
? blktrace: 對塊設備進行詳細的 I/O 跟蹤分析。
網絡性能分析
? ifconfig / ip: 顯示和配置網絡接口的信息。
? netstat: 查看網絡連接、路由表、接口狀態、協議統計等。
? ss: 替代 netstat 的工具,功能更強大,速度更快,分析網絡連接和套接字。
? iftop: 實時監控網絡帶寬使用情況,顯示每個網絡連接的實時流量。
? nload: 實時查看網絡流量的工具,能夠顯示出入口和出口的帶寬使用情況。
? ping: 測試與遠程主機的網絡連通性,測量網絡延遲。
? traceroute: 查看數據包從本地主機到目標主機經過的路由信息。
? tcpdump: 強大的網絡抓包工具,能夠捕獲和分析網絡數據包。
? nmap: 網絡掃描工具,檢查開放端口、主機發現和網絡服務。
進程管理
? ps: 列出當前正在運行的進程。
? top / htop: 查看實時進程資源消耗情況。
? pstree: 以樹形結構展示進程關系。
? kill: 終止特定的進程。
? strace: 跟蹤系統調用和信號,分析進程執行的系統調用,非常適合調試和跟蹤進程的運行狀態。
綜合性能分析
? dstat: 結合 vmstat、iostat、netstat 等工具的功能,實時顯示 CPU、內存、磁盤 I/O、網絡等資源的使用情況。
? perf: 內核提供的強大性能分析工具,支持采樣、跟蹤和性能分析,適合開發人員和高級用戶進行深入的性能調優。
? sar: 系統監控和報告工具,可以詳細記錄 CPU、內存、網絡、I/O 等各方面的性能。
? sysstat: 包含 iostat、mpstat、sar 等多種工具的綜合工具包。
? glances: 類似于 htop 和 dstat 的結合,實時監控 CPU、內存、磁盤、網絡、進程等多項系統性能指標。
最佳實踐
一、性能分析
1. top
? 用途: 實時監控 CPU、內存及進程資源消耗。
? 快捷鍵:
a:按 CPU 使用率排序。
b:按內存使用率排序。
c :退出。
? 示例:
top -c # 顯示完整進程命令行
2. htop (需安裝)
? 用途: 增強版 top,支持鼠標操作、多核負載可視化。
? 安裝:
sudo apt install htop # Debian/Ubuntu
? 示例:
htop # 查看線程級 CPU 使用
3. mpstat (需安裝 sysstat )
? 用途: 監控多核 CPU 各核心利用率。
? 示例:
mpstat -P ALL 1 # 每秒刷新所有核心狀態
4. perf
? 用途: 深入分析 CPU 性能事件(如函數熱點、緩存命中率)。
? 示例:
perf top # 實時查看 CPU 熱點
perf record -g # 生成火焰圖數據
5. sar(需安裝 sysstat)
? 用途: 長期記錄 CPU 使用率、上下文切換等。
? 示例:
sar -u 1 5 # 查看過去 5 秒 CPU 使用率
二、內存性能分析
1. free
? 用途: 快速查看內存和 Swap 使用量。
? 示例:
free -h # 以 GB/MB 顯示
2. vmstat
? 用途: 綜合監控內存、Swap、進程隊列和 I/O。
? 示例:
vmstat 1 # 每秒刷新一次
3. smem(需安裝)
? 用途: 按進程統計實際物理內存占用(USS/PSS/RSS)。
? 安裝:
sudo apt install smem # Debian/Ubuntu
? 示例:
smem -u # 按用戶統計內存
4. slabtop
? 用途: 分析內核 Slab 緩存(內核對象占用內存)。
? 示例:
slabtop -s c # 按緩存大小排序
三、磁盤性能分析
1. iostat(需安裝 sysstat)
? 用途: 監控磁盤吞吐量、延遲和利用率。
? 示例:
iostat -xz 1 # 查看詳細 I/O 統計
2. iotop(需安裝)
? 用途: 按進程實時顯示磁盤 I/O 活動。
? 安裝:
sudo apt install iotop # Debian/Ubuntu
? 示例:
iotop -o # 僅顯示活躍 I/O 進程
3. blktrace(需安裝)
? 用途: 深度跟蹤塊設備 I/O 請求(調試磁盤性能瓶頸)。
? 示例:
blktrace -d /dev/sda -o trace # 跟蹤 sda 設備
四、網絡性能分析
1. iftop(需安裝)
? 用途: 實時監控網絡連接帶寬。
? 示例:
sudo iftop -i eth0 # 指定網卡監控
2. nethogs(需安裝)
? 用途: 按進程統計網絡流量。
? 示例:
nethogs eth0 # 查看指定網卡流量
3. ss
? 用途: 替代 netstat,快速查看連接和端口狀態。
? 示例:
ss -tunlp # 顯示所有 TCP/UDP 連接及進程
4. tcpdump
? 用途: 抓包分析網絡流量(需 root 權限)。
? 示例:
tcpdump -i eth0 port 80 # 抓取 HTTP 流量
五、進程級分析
1. pidstat(需安裝 sysstat )
? 用途: 監控進程的 CPU、內存、I/O。
? 示例:
pidstat -d -p 1234 1 # 監控 PID 1234 的磁盤 I/O
2. strace
? 用途: 跟蹤進程的系統調用和信號。
? 示例:
strace -p 1234 -T # 跟蹤 PID 1234 的調用耗時
六、綜合工具與場景指南
1. 一站式監控工具
? glances(需安裝)
glances # 實時監控 CPU、內存、磁盤、網絡
? dstat(需安裝)
dstat -c -m -d -n # 綜合顯示 CPU、內存、磁盤、網絡
2. 高頻場景速查
? 系統卡頓:
top → vmstat 1 → iostat 1 → pidstat 1 # 逐層定位瓶頸
? 網絡延遲:
ping 8.8.8.8 → traceroute google.com → tcpdump -i eth0 # 逐步排查
? 進程異常:
strace -p <PID> → perf record -g -p <PID> # 分析系統調用和 CPU 熱點
3. 實用組合命令
? 查找 CPU/內存占用 Top 進程:
ps aux --sort=-%cpu | head -10 # Top 10 CPU 進程
ps aux --sort=-%mem | head -10 # Top 10 內存進程
? 持續監控磁盤空間:
watch -n 1 'df -h' # 每秒刷新磁盤使用
七、使用場景總結
? 系統變慢: 先用 top 或 htop 查看整體負載,再用 vmstat/iostat 定位 CPU、磁盤或內存瓶頸。
? 網絡延遲: iftop 或 nethogs 查看流量,tcpdump 抓包分析。
? 進程卡死: strace 跟蹤系統調用,perf 分析 CPU 熱點。
實際案例解說
這邊選擇幾個有代表性的把參數詳細聊聊。
vmstat 命令顯示了 系統資源的實時狀態,幫助你監控 CPU、內存、IO、進程等資源的使用情況。
(進程相關)
? r: 運行隊列中等待 CPU 的進程數。如果這個數值大于 CPU 核心數量,說明系統 CPU 資源不足。
? b: 不可中斷睡眠的進程數(一般是等待 I/O 的進程)。
(內存相關)
? swpd: 使用的 swap 空間(單位:KB)。如果非 0,表示系統已經在使用 swap 分區,可能會影響性能。
? free: 空閑內存(單位:KB)。
? buff: 用于緩沖區的內存(單位:KB),用于存儲文件系統的元數據。
? cache: 用于緩存的內存(單位:KB),加速數據讀取。如果緩存命中率高,會減少 I/O 壓力。
(交換分區相關)
? si(swap in): 從 swap 分區交換到內存的大小(單位:KB/秒)。
? so(swap out): 從內存交換到 swap 分區的大小(單位:KB/秒)。
? 如果 si 和 so 值較大,說明系統內存不足,需要頻繁使用 swap,這會降低性能。
(相關)
? bi(block in): 從塊設備(如磁盤)讀取的數據量(單位:塊/秒)。
? bo(block out): 寫入塊設備(如磁盤)的數據量(單位:塊/秒)。
? 這兩個值高時,說明磁盤 I/O 活動頻繁,可能會成為系統瓶頸。
(系統相關)
? in: 每秒中斷次數,包括硬件和系統時鐘中斷。
? cs(context switches): 每秒上下文切換次數。上下文切換多說明進程頻繁切換,可能影響性能。
(相關)
? us(user time): CPU 花費在用戶進程上的時間百分比。用戶進程是指非內核的應用程序。
? sy(system time): CPU 花費在系統內核進程上的時間百分比。
? id(idle time): CPU 的空閑時間百分比。如果值很高,說明 CPU 比較空閑。
? wa(wait time): CPU 等待 I/O 的時間百分比。如果值高,說明 I/O 成為系統瓶頸。
? st(steal time): 虛擬機中,CPU 被其他虛擬機占用的時間百分比。如果值高,說明虛擬化資源不足。
如何分析圖中的數據:
? r 為 0: 沒有等待 CPU 的進程,CPU 資源充足。
? id 高達 98-97%: CPU 基本處于空閑狀態,系統負載很低。
? wa 為 0%: 沒有 CPU 等待 I/O,I/O 性能正常。
? si 和 so 為 0: 系統沒有使用 swap,內存充足。
? bi 和 bo 較低: 磁盤 I/O 壓力不大。
總結:
從截圖來看,系統整體運行狀態非常良好:
? CPU 基本處于空閑狀態(id 很高)。
? 沒有使用 swap(swpd、si、so 都是 0)。
? 沒有等待 CPU 或 I/O 的進程(r、b 和 wa 都接近 0)。
這表明當前系統負載很低,沒有出現任何性能瓶頸。
圖片
你的截圖顯示了 iostat -d 3 命令的輸出,它展示了 磁盤設備的性能數據。
iostat -d 3 輸出字段解釋
1. Device:
? 顯示監控的磁盤設備名稱(如 vda 和 vdb)。
? 這些是塊設備,如虛擬機中的磁盤、物理磁盤或分區。
2. tps(Transactions per Second):
? 每秒對該設備發起的 I/O 請求數(讀或寫)。
? 這個值越高,說明設備的 I/O 活動越頻繁。
3. kB_read/s:
? 每秒從設備讀取的 數據量(單位:KB)。
? 如果這個值持續較高,說明系統在頻繁讀取數據。
4. kB_wrtn/s:
? 每秒寫入設備的 數據量(單位:KB)。
? 如果寫入數據量較高,說明系統在頻繁寫數據到磁盤。
5. kB_dscd/s(discarded data per second):
? 每秒丟棄的數據量(單位:KB)。通常用于監控 SSD 設備的 TRIM 操作。
? 在你的輸出中,該值為 0,說明當前沒有丟棄操作。
6. kB_read:
? 從啟動以來總共讀取的數據量(單位:KB)。
7. kB_wrtn:
? 從啟動以來總共寫入的數據量(單位:KB)。
8. kB_dscd:
? 從啟動以來總共丟棄的數據量(單位:KB)。在你截圖中為 0。
分析你的輸出
? vda 設備:
? tps:3.74,每秒有 3.74 個 I/O 操作。
? 讀取速率:每秒讀取 0.52 KB。
? 寫入速率:每秒寫入 65.88 KB。
? 說明:vda 設備的寫入操作較為頻繁,性能上主要是寫密集型。
? vdb 設備:
? tps:0.10,每秒只有 0.10 個 I/O 操作。
? 讀取和寫入速率:讀取和寫入數據量都很小(約 0.52 KB 和 2.10 KB/s)。
? 說明:vdb 設備 I/O 活動較少,讀寫需求不高。
如何解讀這些數據
1. I/O 活動:
? vda 設備 I/O 活動相對較高,且主要以寫操作為主(每秒寫入 65.88 KB)。
? vdb 活動非常少,基本沒有大量的讀寫需求。
2. 性能分析:
? 如果寫入操作頻繁且 I/O 性能出現瓶頸(如 tps 和 kB_wrtn/s 高得離譜),可能需要檢查設備是否需要優化或擴展。
? 如果讀取較慢,可能需要檢查是否有必要優化緩存。
總結
? vda 設備 主要是寫操作頻繁,需要密切監控寫入性能。
? vdb 設備 活動很少,沒有明顯的性能壓力。
你可以繼續使用 iostat 命令來實時監控設備的 I/O 性能,并觀察這些值是否在高峰期發生顯著變化。如有必要,也可以結合 iotop 或 dstat 等工具進行進一步分析。
圖片
該命令顯示 每個 CPU 核心 的詳細使用情況,并每 3 秒更新一次。
字段解釋:
1. CPU:
? 顯示是哪一個 CPU 核心。
? all 表示所有 CPU 核心的平均值。
? 接下來的每一行代表一個具體的 CPU 核心(例如 0 到 7 代表系統中的 8 個核心)。
2. %usr(User Time):
? 用戶進程消耗的 CPU 百分比(不包括內核進程)。
? 這個值較高時,說明系統在運行大量的用戶級應用程序。
3. %nice(Nice Time):
? 被調整優先級(nice 級別)的進程消耗的 CPU 百分比。
? 如果有低優先級任務占用大量 CPU 時間,這個值會增加。
4. %sys(System Time):
? 內核進程消耗的 CPU 百分比。
? 如果這個值較高,說明內核級的任務或 I/O 操作占用了大量 CPU 時間。
5. %iowait(I/O Wait):
? CPU 等待 I/O 操作完成的時間百分比。
? 如果這個值較高,說明 CPU 大量時間被耗費在等待磁盤或網絡 I/O 上。
6. %irq(Interrupt Requests):
? CPU 處理硬件中斷(IRQ)請求的時間百分比。
? 高值表明系統中有頻繁的硬件中斷(如網絡或磁盤活動)。
7. %soft(Soft IRQs):
? 軟中斷占用的 CPU 時間百分比。
? 軟中斷多與網絡或驅動程序相關。
8. %steal(Steal Time):
? 在虛擬化環境中,CPU 被其他虛擬機占用的時間百分比。
? 如果值較高,說明虛擬機沒有獲得足夠的 CPU 資源。
9. %guest(Guest Time):
? CPU 用于運行虛擬機內進程的時間百分比。
10. %gnice(Guest Nice Time):
? 虛擬機中被調整了優先級的進程消耗的時間。
11. %idle(Idle Time):
? CPU 空閑的時間百分比。
? 如果該值高,說明系統比較空閑;如果低,說明 CPU 資源繁忙。
分析你的輸出:
1. 所有 CPU 核心的平均情況(all 行):
? %usr: 2.59%——用戶進程占用少量 CPU 時間。
? %sys: 2.30%——內核進程也占用了一些時間。
? %iowait: 0.17%——CPU 花在等待 I/O 的時間很少。
? %idle: 94.95%——整體來看,CPU 大部分時間處于空閑狀態。
2. 各個 CPU 核心的情況:
? CPU 6: %usr 為 7.33%,CPU 活動稍高。
? 其余核心: 大部分核心的 %idle 在 90% 以上,表明它們大部分時間處于空閑狀態。
結論:
? 系統整體負載較低,因為所有 CPU 的空閑時間 %idle 都很高(94% 以上)。
? CPU 6 相較于其他核心稍微活躍,但沒有出現過高的負載,說明系統沒有性能瓶頸。
? I/O 等待時間 %iowait 很低(0.17%),說明磁盤和網絡 I/O 不存在明顯的瓶頸。
你當前的系統狀態非常良好,CPU 負載輕,I/O 等待時間短,無需額外優化。如果某個 CPU 核心的負載過高或 %iowait 增加,可能需要進一步分析具體的進程或任務。