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