Linux系统下的性能分析命令

2023-09-06 11:19:19 浏览数 (2)

在 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 命令的示例输出:

代码语言:javascript复制
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

代码语言:javascript复制
nmon

这将启动 nmon 交互式界面,显示各种性能指标的实时数据。

2. 指定刷新频率:

您可以使用 -s 参数来指定刷新间隔,单位为秒。例如,以下命令将每隔2秒刷新一次数据:

代码语言:javascript复制
nmon -s 2

3. 保存数据到文件:

您可以使用 -f 参数将 nmon 的输出保存到文件中,以便后续分析。例如,以下命令将数据保存到名为 nmon_output.nmon 的文件中:

代码语言:javascript复制
nmon -f -c 10 -s 2 -T -m /path/to/nmon_output.nmon

在这个示例中,-c 10 表示 nmon 运行10个循环后自动退出,-T 表示在输出中包含时间戳。

4. 只显示特定项目:

如果您只对特定性能指标感兴趣,可以使用 -d 参数来指定要显示的项目。例如,以下命令只显示CPU和内存相关数据:

代码语言:javascript复制
nmon -d cpu,mem

5. 远程监视:

您可以通过SSH在远程系统上运行 nmon,然后将性能数据传输到本地进行分析。例如,以下命令在远程系统上运行 nmon 并将数据传输到本地:

代码语言:javascript复制
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 输出的列含义:

  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 语法

代码语言:javascript复制
iostat [options] [interval] [count]

选项解释:

  • -c:显示CPU统计信息。
  • -d:显示磁盘统计信息。
  • -k:以千字节为单位显示数据。
  • -m:以兆字节为单位显示数据。
  • -x:显示扩展统计信息,包括更多的磁盘和分区信息。

6.2 示例

iostat 命令的输出包含了各个磁盘和分区的统计数据,以及系统的平均负载、CPU利用率、上下文切换等信息。以下是示例输出的一部分:

代码语言:javascript复制
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

0 人点赞