在 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。