• Linux系统下的性能分析命令

在Linux系统下,有很多命令,其中不少命令能够收集、查看应用程序的性能指标,为应用程序的性能优化起到关键性的作用。

blog-thumb

在 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+ 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. 列出所有打开的文件和网络连接

    lsof
    
  2. 列出特定文件的打开者

    lsof /path/to/file
    
  3. 列出特定端口的网络连接

    lsof -i :<port>
    
  4. 列出某个用户打开的文件

    lsof -u <username>
    
  5. 列出特定进程的打开文件

    lsof -p <pid>
    
  6. 列出特定类型的文件(例如,TCP连接)

    lsof -i tcp
    
  7. 列出所有网络连接,但不解析主机名和端口号

    lsof -ni
    
  8. 以机器可读的格式输出信息

    lsof -F json
    
  9. 列出所有正在使用某个设备的进程

    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使用率和统计信息

    pidstat -u 1
    

    这将每秒显示一次CPU使用率和统计信息,默认显示所有进程的数据。可以通过添加 -p <PID> 选项指定特定的进程。

  2. 显示进程的内存使用率和统计信息

    pidstat -r 1
    

    类似于上面的示例,这将每秒显示一次内存使用率和统计信息。

  3. 显示进程的磁盘IO统计信息

    pidstat -d 1
    

    这将每秒显示一次磁盘IO统计信息,包括读写速率、读写次数等。

  4. 显示特定进程的CPU使用率和统计信息

    pidstat -u -p <PID> 1
    

    这将每秒显示指定进程的CPU使用率和统计信息,其中 <PID> 是目标进程的进程ID。

  5. 显示进程的启动时间

    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 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 输出的列含义:

  1. procs: 进程相关统计。 r: 正在运行的进程数、b: 等待运行的进程数。

  2. memory: 内存相关统计。swpd: 虚拟内存使用量(以KB为单位)、free: 空闲内存(以KB为单位)、buff: 用作缓冲的内存(以KB为单位)、cache: 用作缓存的内存(以KB为单位)。

  3. swap: 交换空间相关统计。si: 从磁盘读入交换区的数据量(以KB为单位)、so: 向磁盘写入交换区的数据量(以KB为单位)。

  4. io: IO相关统计。bi: 每秒从块设备读入的块数量(如硬盘)(以块为单位)、bo: 每秒写入块设备的块数量(以块为单位)。

  5. system: 系统相关统计。in: 每秒的中断数、cs: 每秒上下文切换数。

  6. 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   %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次

    iostat
    
  2. 显示详细的磁盘IO统计信息,每秒更新一次,共更新3次

    iostat -d 1 3
    
  3. 以千字节为单位显示数据,显示CPU和磁盘统计信息,每秒更新一次,共更新4次

    iostat -k -c -d 1 4
    
  4. 显示扩展的磁盘IO统计信息,每秒更新一次,共更新5次

    iostat -x 1 5
    

7、tcpdump

tcpdump 是一个在 Unix 系统上常用的网络抓包工具,用于捕获和分析网络数据包。它能够监听网络接口,捕获经过该接口的数据包,并以可读的格式显示数据包的内容。

tcpdump 支持多种过滤选项,以便只捕获感兴趣的数据包。

以下是一些常用的 tcpdump 命令选项以及示例说明:

  1. 基本使用

    tcpdump
    

    这将在默认网络接口上捕获所有的数据包。但是,通常情况下,您会希望使用其他选项来限制抓包的范围。

  2. 指定网络接口

    tcpdump -i eth0
    

    通过 -i 选项指定要捕获的网络接口,这里是 eth0

  3. 指定数据包数量

    tcpdump -c 10
    

    使用 -c 选项可以指定捕获的数据包数量,这里捕获前 10 个数据包。

  4. 捕获特定主机的数据包

    tcpdump host 192.168.1.100
    

    使用 host 关键字可以捕获特定主机的所有数据包。

  5. 捕获特定端口的数据包

    tcpdump port 80
    

    使用 port 关键字可以捕获特定端口的数据包,这里是端口 80(HTTP)的数据包。

  6. 组合多个过滤条件

    tcpdump host 192.168.1.100 and port 22
    

    可以使用逻辑运算符 and 来组合多个过滤条件,这里捕获主机 192.168.1.100 上的端口 22(SSH)数据包。

  7. 保存抓包结果到文件

    tcpdump -w capture.pcap
    

    使用 -w 选项可以将抓包结果保存到文件中,文件格式为 pcap。

  8. 读取保存的抓包文件

    tcpdump -r capture.pcap
    

    使用 -r 选项可以读取保存的抓包文件并显示其内容。

  9. 显示详细数据包信息

    tcpdump -v
    

    使用 -v 选项可以显示详细的数据包信息。

  10. 显示更详细的数据包信息

tcpdump -vv

使用 -vv 选项可以显示更详细的数据包信息,包括解析的协议头。

这只是 tcpdump 的一些基本用法示例,该工具还支持许多其他选项和过滤条件,以满足各种网络抓包和分析的需求。请注意,由于抓包涉及到访问网络数据,通常需要以 root 或者具有适当权限的用户身份运行 tcpdump