Skip to main content

性能监控

top

top 是 Linux 系统中用来实时监控系统性能和进程的命令。它的输出包含系统的总体资源使用情况、进程列表以及进程的资源使用明细。以下是 top 输出的各部分解释:

top - 13:31:39 up 42 days, 20:05,  6 users,  load average: 38.15, 27.77, 16.46
Tasks: 639 total, 1 running, 565 sleeping, 0 stopped, 0 zombie
%Cpu(s): 19.9 us, 9.0 sy, 0.0 ni, 70.0 id, 0.8 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 65359412 total, 1237276 free, 51401168 used, 12720968 buff/cache
KiB Swap: 31998972 total, 30326640 free, 1672332 used. 12949852 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30100 root 20 0 9528208 1.604g 16528 S 166.7 2.6 27:52.77 java
3253 root 20 0 5574388 251848 21056 S 77.8 0.4 25731:19 dockerd

第一部分:整体系统信息

  1. top:

    • 描述系统总体状态。
    • 13:31:39: 系统当前时间。
    • up 42 days, 20:05: 系统运行时间。
    • 6 users: 当前登录用户数。
    • load average: 38.15, 27.77, 16.46: 系统负载,表示系统在过去 1 分钟、5 分钟和 15 分钟的平均负载情况。负载的定义是队列中等待运行的任务数(包括正在运行的任务和等待 CPU 时间片的任务)。
  2. Tasks:

    • 描述任务(进程)的状态。
    • 639 total: 系统当前有 639 个进程。
    • 1 running: 1 个进程正在运行。
    • 565 sleeping: 565 个进程处于休眠状态。
    • 0 stopped: 没有停止状态的进程。
    • 0 zombie: 没有僵尸进程。
  3. %Cpu(s):
    描述 CPU 使用情况(单位是百分比)。各部分含义:

    • 19.9 us: 用户空间(user space)的 CPU 使用率,表示运行用户程序占用的时间。
    • 9.0 sy: 内核空间(system space)的 CPU 使用率,表示运行内核或系统调用占用的时间。
    • 0.0 ni: 修改优先级的进程占用的 CPU 使用率。
    • 70.0 id: 空闲(idle)CPU 百分比,表示未被使用的时间。
    • 0.8 wa: 等待 I/O 操作完成的 CPU 使用率。
    • 0.0 hi: 硬件中断(hardware interrupt)消耗的 CPU 使用率。
    • 0.3 si: 软件中断(software interrupt)消耗的 CPU 使用率。
    • 0.0 st: 虚拟机“偷取”的时间(steal time),表示被其他虚拟机占用的 CPU 时间。
  4. KiB Mem (内存使用):
    显示系统内存使用情况(单位是 KiB)。

    • 65359412 total: 系统总内存 65,359,412 KiB(约 62.3 GB)。
    • 1237276 free: 空闲内存 1,237,276 KiB(约 1.2 GB)。
    • 51401168 used: 已使用的内存 51,401,168 KiB(约 49 GB)。
    • 12720968 buff/cache: 被缓存或缓冲占用的内存 12,720,968 KiB(约 12.1 GB)。
  5. KiB Swap (交换分区使用):
    显示交换分区的使用情况。

    • 31998972 total: 交换分区总大小 31,998,972 KiB(约 30.5 GB)。
    • 30326640 free: 未使用的交换分区大小 30,326,640 KiB(约 28.9 GB)。
    • 1672332 used: 已使用的交换分区大小 1,672,332 KiB(约 1.6 GB)。
    • 12949852 avail Mem: 可用内存(包括空闲和缓冲/缓存)。

第二部分:进程列表

各列显示系统中运行的每个进程的详细信息,以下是主要列的含义:

  1. PID (进程 ID)
    进程的唯一标识符。

  2. USER (用户)
    运行该进程的用户。

  3. PR (优先级)
    进程的优先级值。较低的数值表示较高的优先级。

  4. NI (Nice 值)
    进程的 nice 值,影响进程的调度优先级。

  5. VIRT (虚拟内存)
    进程使用的总虚拟内存,包括已分配但未实际使用的内存。单位是 KiB。

  6. RES (常驻内存)
    进程实际使用的物理内存(驻留在 RAM 中),单位是 KiB。

  7. SHR (共享内存)
    进程共享的内存部分,单位是 KiB。

  8. S (状态)
    进程的当前状态:

    • R: 运行中(running)。
    • S: 睡眠中(sleeping)。
    • D: 不可中断睡眠(通常等待 I/O)。
    • Z: 僵尸状态(zombie)。
    • T: 停止或暂停状态。
  9. %CPU
    进程使用的 CPU 占总 CPU 的百分比。

  10. %MEM
    进程使用的内存占总内存的百分比。

  11. TIME+ (CPU 时间)
    进程占用的 CPU 总时间,格式为 MM:SSHH:MM:SS

  12. COMMAND (命令)
    启动进程的命令或可执行文件的名称。

相关快捷键:

top 中,可以通过键盘输入以下快捷键进行操作:

  • h:显示帮助。
  • q:退出 top
  • z:切换彩色模式。
  • c:显示完整命令路径。
  • k:杀死某个进程(输入 PID)。
  • P:按 CPU 使用率排序。
  • M:按内存使用率排序。
  • T:按运行时间排序。
  • r:改变某个进程的优先级(输入 PID 和新 Nice 值)。

vmstat

vmstat 是一个 Linux 命令,用于监控系统性能。它显示了系统的内存、CPU、进程、I/O 和上下文切换等运行时统计信息。
在你的命令 vmstat 1 3 中,它的含义如下:

# 每隔 1 秒刷新一次。总共刷新 3 次。
root@enbo-PowerEdge-R740:~# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
109 0 1716512 1019900 1769508 11100736 8 9 13 161 1 0 20 9 70 1 0
9 0 1716512 983516 1769540 11130400 0 0 0 2336 76678 124878 61 28 11 0 0
4 0 1716512 1013320 1769556 11126336 0 0 0 1800 71905 155767 36 26 37 0 0

输出的各列解释:

procs(进程)

  1. r(running):可运行的进程数,包括当前正在运行和等待 CPU 的进程。
    • 此处显示 109,表示有 109 个任务处于可运行状态,CPU 可能已经饱和。
  2. b(blocked):等待 I/O 的进程数(例如磁盘或网络)。
    • 此处显示 0,说明没有进程被 I/O 阻塞。

memory(内存)

  1. swpd(swapped):已使用的交换空间大小(单位:KB)。
    • 此处显示 1716512 KB,表示约 1.7 GB 的数据被换出到交换空间(swap)。
  2. free:当前空闲内存大小(单位:KB)。
    • 此处显示 1019900 KB,约为 1 GB 的内存是空闲的。
  3. buff(buffer):用于块设备的缓存(单位:KB)。
    • 此处显示 1769508 KB,约为 1.7 GB,可能用于磁盘缓存。
  4. cache:用于文件系统缓存的内存(单位:KB)。
    • 此处显示 11100736 KB,约为 11 GB。

swap(交换)

  1. si(swap in):从磁盘交换空间写入到内存的速率(单位:KB/s)。
    • 此处显示 8 KB/s,表示有少量数据从交换空间回读到内存。
  2. so(swap out):从内存写入到磁盘交换空间的速率(单位:KB/s)。
    • 此处显示 9 KB/s,表示正在将少量数据从内存换出到交换空间。

io(输入/输出)

  1. bi(blocks in):从块设备(磁盘等)读取的数据块速率(单位:块/s)。
    • 此处显示 13,表示每秒读取 13 个数据块。
  2. bo(blocks out):写入到块设备的数据块速率(单位:块/s)。
    • 此处显示 161,表示每秒写入 161 个数据块。

system(系统)

  1. in(interrupts):每秒硬件中断的次数。
    • 此处显示 1,硬件中断非常少。
  2. cs(context switches):每秒上下文切换的次数。
    • 此处显示 0,表示当前没有上下文切换,可能是任务较少或单任务负载。

cpu(CPU 使用情况)

  1. us(user time):用户进程占用 CPU 的时间百分比。
    • 此处显示 20%,表示用户进程消耗了 20% 的 CPU 时间。
  2. sy(system time):内核进程占用 CPU 的时间百分比。
    • 此处显示 9%,说明系统任务占用了 9% 的 CPU 时间。
  3. id(idle time):空闲时间百分比。
    • 此处显示 70%,表明 CPU 有 70% 的时间处于空闲状态。
  4. wa(waiting for I/O):等待 I/O 操作的时间百分比。
    • 此处显示 1%,说明有 1% 的时间因 I/O 操作而等待。
  5. st(stolen time):虚拟机等待 hypervisor 服务的时间百分比。
    • 此处显示 0%,说明没有资源被虚拟化技术“窃取”。

应用

  • 当cs值(上下文切换)和us值(用户CPU时间)很高时,说明系统上下文切换频繁,CPU占用率很高

iostat

iostat 是一个用于监控系统输入/输出设备(如磁盘和网络接口)活动以及 CPU 使用情况的 Linux 工具。它是 sysstat 工具包的一部分,特别适用于分析 I/O 性能瓶颈和整体系统性能。

基本命令结构

iostat [options] [interval] [count]
  • interval:采样间隔(以秒为单位)。
  • count:采样次数(可选,默认无限)。

例如:

iostat 1 3

表示每秒采样一次,共输出 3 次结果。

应用

  1. %iowait

    • 表明 I/O 操作可能是性能瓶颈。
    • 检查磁盘或网络设备的性能(重点看高 TPS 和 kB/s)。
  2. 某个磁盘的 TPS 特别高

    • 表示该磁盘可能存在 I/O 热点。
    • 可通过分布式存储、RAID 或缓存策略减轻负载。
  3. %idle 低,%user/%system

    • CPU 被密集计算任务占用,可优化代码或添加更多计算资源。
  4. 数据吞吐(kB_read/s 和 kB_wrtn/s)不符合预期

    • 磁盘性能可能受限,需检查设备类型(如 SATA vs NVMe)或带宽配置。

pidstat

能精确到线程,相当不错

  • -p 指定进程号
  • -u 显示cpu信息
  • -d 监控磁盘io
  • -r 监控内存
# 监听进程id为1187的cpu和线程信息,每隔 1 秒刷新一次。总共刷新 3 次
# 输出的线程号可以通过jstack -l TID 找到
pidstat -p 1187 1 3 -u –t

文件描述符

ls -l /proc/1/fd

TODO

[ ] netstat [ ] lsof