在 Linux 系統下,有許多用于性能分析和調試的命令和工具,可以幫助您識別系統瓶頸、優化性能以及調查問題。本文將介紹在性能分析過程中,可能使用到的一些命令。
以下是一些常用的性能分析命令和工具匯總:
命令 | 功能簡述 |
---|---|
top | 用于實時監視系統中運行的進程和系統性能指標,如CPU使用率、內存使用率等。 |
nmon | 一個性能監控工具,提供實時的系統性能數據,包括CPU、內存、磁盤、網絡等信息。 |
lsof | 用于列出打開的文件和網絡連接,可以用于查找資源泄漏和不正常的連接。 |
pidstat | 用于監視進程級別的CPU、內存、IO等性能數據。 |
vmstat | 用于顯示系統的虛擬內存、進程、CPU活動和IO統計信息。 |
iostat | 用于監視系統磁盤和IO性能,提供關于磁盤活動的信息。 |
tcpdump | 用于抓取網絡數據包,對于網絡性能分析和故障排除非常有用。 |
1、top
top
命令是 Linux 系統下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用情況,如:CPU 使用率、內存使用率等。
1.1 語法
top [options]
常用選項:
-
-d
或--delay
: 指定刷新間隔,即 top 每隔多少秒更新一次,默認為 3 秒。 -
-n
或--iterations
: 指定刷新次數,即 top 更新數據的次數。 -
-u
或--user
: 僅顯示指定用戶的進程。 -
-p
或--pid
: 僅顯示指定進程 ID 的信息。 -
-H
:顯示進程的層次關系,即顯示線程。
1.2 示例
以下是一個 top
命令的示例輸出:
top - 16:30:45 up 2 days, 5:37, 2 users, load average: 0.15, 0.18, 0.20
Tasks: 186 total, 1 running, 185 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.5 us, 0.5 sy, 0.0 ni, 97.9 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 16327936 total, 9359124 free, 2368572 used, 4600256 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 13755352 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2191 alice 20 0 169168 14164 10964 S 3.0 0.1 0:07.83 gnome-terminal-2811 bob 20 0 2067296 301100 78964 S 2.0 1.8 30:02.45 firefox1 root 20 0 191064 7780 4744 S 0.0 0.0 0:06.07 systemd...
在上述示例中,每行輸出信息分別為:
-
第一行:提供了系統的一般性信息。分別是系統當前時間、系統運行時間、當前登錄用戶數和負載平均值(
load average
,即:任務隊列的平均長度,3個值分別表示1分鐘、5分鐘、15分鐘到現在的平均值)。 -
第二行:任務(Tasks)信息。分別是總任務數,顯示了正在運行(
running
)、睡眠(sleeping
)、停止(stopped
)和僵尸(``zombie)狀態的進程數量。 -
第三行:CPU 統計信息。
us
表示用戶空間 CPU 占有率、sy
表示內核空間 CPU 占用率、ni
表示用戶進程空間改變過優先級的進程 CPU 占有率、id
表示空閑 CPU 占用率、wa
表示等待輸入輸出的 CPU 時間百分比、hi
表示硬件中斷請求、si
表示軟件中斷請求。 -
第四行:內存信息。分別為物理內存總量、已使用的物理內存、空閑物理內存、內核緩沖使用量。
-
第五行:交換區信息。分別為交換區總量、空閑交換區大小、緩沖交換區大小。
-
…:進程列表。每一行表示一個進程的信息,包括進程 ID、用戶、CPU 使用率、內存使用率、進程狀態等。
請注意,top
命令的輸出會實時更新,您可以使用交互式命令來切換排序方式、改變顯示內容等。例如,按下 M
可以按內存使用率排序進程,按下 P
可以按 CPU 使用率排序進程。要退出 top,您可以按下 q
鍵。
2、nmon
nmon
是一個用于實時監視系統性能的命令行工具,最初由 IBM 的 Nigel Griffiths 開發。它提供了一種簡潔的方式來查看系統的CPU、內存、磁盤、網絡等性能指標,以及進程級別的信息。
nmon
具有交互式界面,可以顯示實時的性能數據,方便管理員和開發人員進行系統性能分析。
以下是 nmon
命令的一些常見用法和示例:
-
基本使用:
使用以下命令啟動
nmon
:nmon
這將啟動
nmon
交互式界面,顯示各種性能指標的實時數據。 -
指定刷新頻率:
您可以使用
-s
參數來指定刷新間隔,單位為秒。例如,以下命令將每隔2秒刷新一次數據:nmon -s 2
-
保存數據到文件:
您可以使用
-f
參數將nmon
的輸出保存到文件中,以便后續分析。例如,以下命令將數據保存到名為nmon_output.nmon
的文件中:nmon -f -c 10 -s 2 -T -m /path/to/nmon_output.nmon
在這個示例中,
-c 10
表示nmon
運行10個循環后自動退出,-T
表示在輸出中包含時間戳。 -
只顯示特定項目:
如果您只對特定性能指標感興趣,可以使用
-d
參數來指定要顯示的項目。例如,以下命令只顯示CPU和內存相關數據:nmon -d cpu,mem
-
遠程監視:
您可以通過SSH在遠程系統上運行
nmon
,然后將性能數據傳輸到本地進行分析。例如,以下命令在遠程系統上運行nmon
并將數據傳輸到本地:ssh user@remote_host "nmon -f -s 5 -c 10" > nmon_output.nmon
這些示例只是 nmon
的一小部分用法。nmon
還提供了許多其他選項和功能,可以根據您的需求進行調整和使用。要詳細了解 nmon
的所有選項和功能,請查閱官方文檔或運行 nmon
命令時使用 -h
參數查看幫助信息。
3、lsof
lsof
(“List Open Files”)是一個用于列出在 Linux 系統上被進程打開的文件和網絡連接的命令。它可以幫助您查看哪些進程正在訪問哪些文件,以及網絡連接的相關信息。
lsof
可以用于排查資源泄漏、尋找進程占用文件等問題。
3.1 語法
以下是一些常用的 lsof
命令選項及其說明:
-
-i
: 列出網絡連接。 -
-n
: 不解析主機名和端口號。 -
-c <進程名>
: 僅列出特定進程的信息。 -
-p <進程ID>
: 列出指定進程的信息。 -
-u <用戶名>
: 列出屬于特定用戶的信息。 -
-t
: 僅顯示進程ID。 -
-F <格式>
: 使用指定的格式輸出。
3.2 示例
以下是一些示例,演示了如何使用 lsof
命令:
-
列出所有打開的文件和網絡連接:
lsof
-
列出特定文件的打開者:
lsof /path/to/file
-
列出特定端口的網絡連接:
lsof -i :<port>
-
列出某個用戶打開的文件:
lsof -u <username>
-
列出特定進程的打開文件:
lsof -p <pid>
-
列出特定類型的文件(例如,TCP連接):
lsof -i tcp
-
列出所有網絡連接,但不解析主機名和端口號:
lsof -ni
-
以機器可讀的格式輸出信息:
lsof -F json
-
列出所有正在使用某個設備的進程:
lsof /dev/sda1
請注意,lsof
命令提供了豐富的信息,包括文件描述符、文件類型、文件位置、打開方式、進程ID、用戶等等。您可以根據需要使用不同的選項來過濾和查看所需的信息。使用 man lsof
命令可以查看完整的命令文檔和詳細說明。
4、pidstat
pidstat
是一個用于監視進程級別性能統計的命令行工具,它可以提供有關CPU使用率、內存使用率、IO活動等信息。它是 sysstat
套件的一部分,需要安裝才能使用。
4.1 語法
以下是 pidstat
命令的常用選項:
-
-u
: 顯示CPU使用率和統計信息。 -
-r
: 顯示內存使用率和統計信息。 -
-d
: 顯示磁盤IO統計信息。 -
-t
: 顯示進程啟動時間。 -
-p <PID>
: 指定要監視的特定進程ID。 -
-h
: 顯示幫助信息。
4.2 示例
下面列舉了一些示例。
-
顯示進程的CPU使用率和統計信息:
pidstat -u 1
這將每秒顯示一次CPU使用率和統計信息,默認顯示所有進程的數據。可以通過添加
-p <PID>
選項指定特定的進程。 -
顯示進程的內存使用率和統計信息:
pidstat -r 1
類似于上面的示例,這將每秒顯示一次內存使用率和統計信息。
-
顯示進程的磁盤IO統計信息:
pidstat -d 1
這將每秒顯示一次磁盤IO統計信息,包括讀寫速率、讀寫次數等。
-
顯示特定進程的CPU使用率和統計信息:
pidstat -u -p <PID> 1
這將每秒顯示指定進程的CPU使用率和統計信息,其中
<PID>
是目標進程的進程ID。 -
顯示進程的啟動時間:
pidstat -t
這將顯示所有進程的啟動時間。
pidstat
可以幫助您深入了解特定進程的性能行為,從而進行性能調優、問題排查等工作。請注意,具體選項和輸出格式可能會因系統版本而異,您可以通過 man pidstat
查看完整的命令手冊以獲取更多信息。
5、vmstat
vmstat
(Virtual Memory Statistics)是一個在 Linux 系統中常用的性能分析工具,它提供了關于系統虛擬內存、進程、CPU活動和IO的詳細統計信息。通過使用 vmstat
,您可以實時監控系統的性能,并且可以快速識別出潛在的瓶頸和問題。
5.1 語法
vmstat [options] [delay [count]]
-
options
: 用于指定一些特定的輸出選項。 -
delay
: 兩次輸出之間的時間間隔(以秒為單位)。 -
count
: 輸出次數限制。
5.2 示例
vmstat 5 3
這個示例命令會每隔5秒輸出一次統計數據,一共輸出3次。
輸出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st1 0 0 244304 67420 802252 0 0 0 4 3 4 1 1 97 1 00 0 0 243968 67420 802256 0 0 0 0 1159 2292 1 1 98 0 00 0 0 243636 67420 802256 0 0 0 0 1173 2261 1 1 98 0 0
在這個示例中,輸出的各個列給出了不同的統計信息,包括進程狀態、內存使用、交換空間使用、IO活動、系統活動以及CPU使用率等。通過觀察這些數據,您可以了解系統的性能情況并識別潛在的問題。
vmstat
輸出的列含義:
-
procs
: 進程相關統計。r
: 正在運行的進程數、b
: 等待運行的進程數。 -
memory
: 內存相關統計。swpd
: 虛擬內存使用量(以KB為單位)、free
: 空閑內存(以KB為單位)、buff
: 用作緩沖的內存(以KB為單位)、cache
: 用作緩存的內存(以KB為單位)。 -
swap
: 交換空間相關統計。si
: 從磁盤讀入交換區的數據量(以KB為單位)、so
: 向磁盤寫入交換區的數據量(以KB為單位)。 -
io
: IO相關統計。bi
: 每秒從塊設備讀入的塊數量(如硬盤)(以塊為單位)、bo
: 每秒寫入塊設備的塊數量(以塊為單位)。 -
system
: 系統相關統計。in
: 每秒的中斷數、cs
: 每秒上下文切換數。 -
cpu
: CPU使用情況統計。%us
: 用戶空間CPU使用率、%sy
: 系統CPU使用率、%id
: 空閑CPU百分比、%wa
: 等待IO的CPU百分比、%st
: 用于虛擬化的CPU時間百分比。
6、iostat
iostat
是一個在 Linux 系統中常用的命令,用于監視系統的磁盤和IO性能。它能夠提供關于磁盤活動、IO延遲和吞吐量等信息,對于識別磁盤性能瓶頸和調優非常有幫助。
請注意,iostat
命令需要安裝 sysstat
包才能使用。在大多數Linux發行版中,您可以使用包管理器來安裝 sysstat
包。
6.1 語法
iostat [options] [interval] [count]
選項解釋:
-
-c
:顯示CPU統計信息。 -
-d
:顯示磁盤統計信息。 -
-k
:以千字節為單位顯示數據。 -
-m
:以兆字節為單位顯示數據。 -
-x
:顯示擴展統計信息,包括更多的磁盤和分區信息。
6.2 示例
iostat
命令的輸出包含了各個磁盤和分區的統計數據,以及系統的平均負載、CPU利用率、上下文切換等信息。以下是示例輸出的一部分:
Linux 5.4.0-81-generic (hostname) 08/13/2023 _x86_64_ (8 CPU)avg-cpu: %user %nice %system %iowait %steal %idle7.13 0.00 1.45 0.46 0.00 90.96Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.14 18.60 19.84 123759 132016
sdb 0.06 0.28 0.00 1863 0
在這個示例中,avg-cpu
部分顯示了 CPU 利用率的統計信息,Device
部分顯示了每個磁盤設備的統計數據,包括傳輸速率和總的讀寫字節數。您可以根據輸出來評估系統的磁盤性能和負載情況。
-
顯示平均IO統計信息,每秒更新一次,共更新5次:
iostat
-
顯示詳細的磁盤IO統計信息,每秒更新一次,共更新3次:
iostat -d 1 3
-
以千字節為單位顯示數據,顯示CPU和磁盤統計信息,每秒更新一次,共更新4次:
iostat -k -c -d 1 4
-
顯示擴展的磁盤IO統計信息,每秒更新一次,共更新5次:
iostat -x 1 5
7、tcpdump
tcpdump
是一個在 Unix 系統上常用的網絡抓包工具,用于捕獲和分析網絡數據包。它能夠監聽網絡接口,捕獲經過該接口的數據包,并以可讀的格式顯示數據包的內容。
tcpdump
支持多種過濾選項,以便只捕獲感興趣的數據包。
以下是一些常用的 tcpdump
命令選項以及示例說明:
-
基本使用:
tcpdump
這將在默認網絡接口上捕獲所有的數據包。但是,通常情況下,您會希望使用其他選項來限制抓包的范圍。
-
指定網絡接口:
tcpdump -i eth0
通過
-i
選項指定要捕獲的網絡接口,這里是eth0
。 -
指定數據包數量:
tcpdump -c 10
使用
-c
選項可以指定捕獲的數據包數量,這里捕獲前 10 個數據包。 -
捕獲特定主機的數據包:
tcpdump host 192.168.1.100
使用
host
關鍵字可以捕獲特定主機的所有數據包。 -
捕獲特定端口的數據包:
tcpdump port 80
使用
port
關鍵字可以捕獲特定端口的數據包,這里是端口 80(HTTP)的數據包。 -
組合多個過濾條件:
tcpdump host 192.168.1.100 and port 22
可以使用邏輯運算符
and
來組合多個過濾條件,這里捕獲主機 192.168.1.100 上的端口 22(SSH)數據包。 -
保存抓包結果到文件:
tcpdump -w capture.pcap
使用
-w
選項可以將抓包結果保存到文件中,文件格式為 pcap。 -
讀取保存的抓包文件:
tcpdump -r capture.pcap
使用
-r
選項可以讀取保存的抓包文件并顯示其內容。 -
顯示詳細數據包信息:
tcpdump -v
使用
-v
選項可以顯示詳細的數據包信息。 -
顯示更詳細的數據包信息:
tcpdump -vv
使用 -vv
選項可以顯示更詳細的數據包信息,包括解析的協議頭。
這只是 tcpdump
的一些基本用法示例,該工具還支持許多其他選項和過濾條件,以滿足各種網絡抓包和分析的需求。請注意,由于抓包涉及到訪問網絡數據,通常需要以 root 或者具有適當權限的用戶身份運行 tcpdump
。