在 Linux 系统下,有许多用于性能分析和调试的命令和工具,可以帮助您识别系统瓶颈、优化性能以及调查问题。本文将介绍在性能分析过程中,可能使用到的一些命令。
以下是一些常用的性能分析命令和工具汇总:
代码语言:javascript复制用于实时监视系统中运行的进程和系统性能指标,如CPU使用率、内存使用率等。
1、top
top
命令是 Linux 系统下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况,如:CPU 使用率、内存使用率等。
1.1 语法
代码语言:javascript复制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 COMMAND
2191 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 firefox
1 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
命令的一些常见用法和示例:
1. 基本使用:
使用以下命令启动 nmon
:
nmon
这将启动 nmon
交互式界面,显示各种性能指标的实时数据。
2. 指定刷新频率:
您可以使用 -s
参数来指定刷新间隔,单位为秒。例如,以下命令将每隔2秒刷新一次数据:
nmon -s 2
3. 保存数据到文件:
您可以使用 -f
参数将 nmon
的输出保存到文件中,以便后续分析。例如,以下命令将数据保存到名为 nmon_output.nmon
的文件中:
nmon -f -c 10 -s 2 -T -m /path/to/nmon_output.nmon
在这个示例中,-c 10
表示 nmon
运行10个循环后自动退出,-T
表示在输出中包含时间戳。
4. 只显示特定项目:
如果您只对特定性能指标感兴趣,可以使用 -d
参数来指定要显示的项目。例如,以下命令只显示CPU和内存相关数据:
nmon -d cpu,mem
5. 远程监视:
您可以通过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
命令:
1. 列出所有打开的文件和网络连接:
代码语言:javascript复制lsof
2. 列出特定文件的打开者:
代码语言:javascript复制lsof /path/to/file
3. 列出特定端口的网络连接:
代码语言:javascript复制lsof -i :<port>
4. 列出某个用户打开的文件:
代码语言:javascript复制lsof -u <username>
5. 列出特定进程的打开文件:
代码语言:javascript复制lsof -p <pid>
6. 列出特定类型的文件(例如,TCP连接):
代码语言:javascript复制lsof -i tcp
7. 列出所有网络连接,但不解析主机名和端口号:
代码语言:javascript复制lsof -ni
8. 以机器可读的格式输出信息:
代码语言:javascript复制lsof -F json
9. 列出所有正在使用某个设备的进程:
代码语言:javascript复制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 示例
下面列举了一些示例。
1. 显示进程的CPU使用率和统计信息:
代码语言:javascript复制pidstat -u 1
这将每秒显示一次CPU使用率和统计信息,默认显示所有进程的数据。可以通过添加 -p <PID>
选项指定特定的进程。
2. 显示进程的内存使用率和统计信息:
代码语言:javascript复制pidstat -r 1
类似于上面的示例,这将每秒显示一次内存使用率和统计信息。
3. 显示进程的磁盘IO统计信息:
代码语言:javascript复制pidstat -d 1
这将每秒显示一次磁盘IO统计信息,包括读写速率、读写次数等。
4. 显示特定进程的CPU使用率和统计信息:
代码语言:javascript复制pidstat -u -p <PID> 1
这将每秒显示指定进程的CPU使用率和统计信息,其中 <PID>
是目标进程的进程ID。
5. 显示进程的启动时间:
代码语言:javascript复制pidstat -t
这将显示所有进程的启动时间。
pidstat
可以帮助您深入了解特定进程的性能行为,从而进行性能调优、问题排查等工作。请注意,具体选项和输出格式可能会因系统版本而异,您可以通过 man pidstat
查看完整的命令手册以获取更多信息。
5、vmstat
vmstat
(Virtual Memory Statistics)是一个在 Linux 系统中常用的性能分析工具,它提供了关于系统虚拟内存、进程、CPU活动和IO的详细统计信息。通过使用 vmstat
,您可以实时监控系统的性能,并且可以快速识别出潜在的瓶颈和问题。
5.1 语法
代码语言:javascript复制vmstat [options] [delay [count]]
options
: 用于指定一些特定的输出选项。delay
: 两次输出之间的时间间隔(以秒为单位)。count
: 输出次数限制。
5.2 示例
代码语言:javascript复制vmstat 5 3
这个示例命令会每隔5秒输出一次统计数据,一共输出3次。
输出示例:
代码语言:javascript复制procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 244304 67420 802252 0 0 0 4 3 4 1 1 97 1 0
0 0 0 243968 67420 802256 0 0 0 0 1159 2292 1 1 98 0 0
0 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 语法
代码语言:javascript复制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 %idle
7.13 0.00 1.45 0.46 0.00 90.96
Device 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
部分显示了每个磁盘设备的统计数据,包括传输速率和总的读写字节数。您可以根据输出来评估系统的磁盘性能和负载情况。
1. 显示平均IO统计信息,每秒更新一次,共更新5次:
代码语言:javascript复制iostat
2. 显示详细的磁盘IO统计信息,每秒更新一次,共更新3次:
代码语言:javascript复制iostat -d 1 3
3. 以千字节为单位显示数据,显示CPU和磁盘统计信息,每秒更新一次,共更新4次:
代码语言:javascript复制iostat -k -c -d 1 4
4. 显示扩展的磁盘IO统计信息,每秒更新一次,共更新5次:
代码语言:javascript复制iostat -x 1 5
7、tcpdump
tcpdump
是一个在 Unix 系统上常用的网络抓包工具,用于捕获和分析网络数据包。它能够监听网络接口,捕获经过该接口的数据包,并以可读的格式显示数据包的内容。
tcpdump
支持多种过滤选项,以便只捕获感兴趣的数据包。
以下是一些常用的 tcpdump
命令选项以及示例说明:
1. 基本使用:
代码语言:javascript复制tcpdump
这将在默认网络接口上捕获所有的数据包。但是,通常情况下,您会希望使用其他选项来限制抓包的范围。
2. 指定网络接口:
代码语言:javascript复制tcpdump -i eth0
通过 -i
选项指定要捕获的网络接口,这里是 eth0
。
3. 指定数据包数量:
代码语言:javascript复制tcpdump -c 10
使用 -c
选项可以指定捕获的数据包数量,这里捕获前 10 个数据包。
4. 捕获特定主机的数据包:
代码语言:javascript复制tcpdump host 192.168.1.100
使用 host
关键字可以捕获特定主机的所有数据包。
5. 捕获特定端口的数据包:
代码语言:javascript复制tcpdump port 80
使用 port
关键字可以捕获特定端口的数据包,这里是端口 80(HTTP)的数据包。
6. 组合多个过滤条件:
代码语言:javascript复制tcpdump host 192.168.1.100 and port 22
可以使用逻辑运算符 and
来组合多个过滤条件,这里捕获主机 192.168.1.100 上的端口 22(SSH)数据包。
7. 保存抓包结果到文件:
代码语言:javascript复制tcpdump -w capture.pcap
使用 -w
选项可以将抓包结果保存到文件中,文件格式为 pcap。
8. 读取保存的抓包文件:
代码语言:javascript复制tcpdump -r capture.pcap
使用 -r
选项可以读取保存的抓包文件并显示其内容。
9. 显示详细数据包信息:
代码语言:javascript复制tcpdump -v
使用 -v
选项可以显示详细的数据包信息。
10. 显示更详细的数据包信息:
代码语言:javascript复制tcpdump -vv
使用 -vv
选项可以显示更详细的数据包信息,包括解析的协议头。
这只是 tcpdump
的一些基本用法示例,该工具还支持许多其他选项和过滤条件,以满足各种网络抓包和分析的需求。请注意,由于抓包涉及到访问网络数据,通常需要以 root 或者具有适当权限的用户身份运行 tcpdump