Linux 性能监控与排查命令终极详解

一、系统整体监控:top 命令深度解析

1. top 命令界面详解

顶部信息区(前5行)

top - 14:30:45 up 15 days,  3:22,  3 users,  load average: 1.25, 0.98, 0.75
Tasks: 256 total,   2 running, 254 sleeping,   0 stopped,   0 zombie
%Cpu(s): 25.3 us,  5.6 sy,  0.0 ni, 68.1 id,  0.5 wa,  0.0 hi,  0.5 si,  0.0 st
KiB Mem : 16304288 total,  2048128 free,  9876544 used,  4379616 buff/cache
KiB Swap:  4194304 total,  3145728 free,  1048576 used.  5123456 avail Mem

1.1 系统平均负载(Load Average)

  • 格式load average: 1.25, 0.98, 0.75
    • 1分钟平均负载:1.25
    • 5分钟平均负载:0.98
    • 15分钟平均负载:0.75
  • 含义
    • 表示单位时间内处于可运行状态不可中断状态的平均进程数
    • 单核CPU的负载临界值为1.0,四核CPU为4.0
    • 若1分钟值 > 5分钟值 > 15分钟值,说明负载在升高
  • 判断标准
    • < 0.7:系统空闲
    • ≈ 1.0:资源利用合理
    • 5.0:系统严重过载

1.2 CPU状态行

%Cpu(s): 25.3 us,  5.6 sy,  0.0 ni, 68.1 id,  0.5 wa,  0.0 hi,  0.5 si,  0.0 st
  • 各字段含义
    • us:用户空间CPU时间占比(应用程序)
    • sy:内核空间CPU时间占比(系统调用)
    • ni:nice优先级调整的进程CPU占比
    • id:空闲CPU百分比
    • wa:I/O等待CPU百分比(>10%需关注)
    • hi:硬件中断CPU占比
    • si:软件中断CPU占比
    • st:虚拟机偷取时间(仅虚拟化环境)

1.3 内存信息

KiB Mem : 16304288 total,  2048128 free,  9876544 used,  4379616 buff/cache
KiB Swap:  4194304 total,  3145728 free,  1048576 used.  5123456 avail Mem
  • 关键指标
    • buff/cache:缓存内存(可被快速回收)
    • avail Mem:实际可用内存(含可回收缓存)
    • Swap使用量 > 0 表示物理内存不足

2. top 高级用法

2.1 线程监控模式

top -H -p [PID]      # 查看指定进程的所有线程
  • 字段说明
    • PID:线程ID(可通过ps -T -p [PID]对照)
    • PR:优先级
    • S:状态(R=运行, S=睡眠, D=不可中断)

2.2 批处理模式

top -b -n 3 -d 2 > top.log  # 非交互式运行3次,间隔2秒

2.3 自定义显示列

  1. 运行top后按f进入字段选择
  2. 使用空格键选中:
    • CODE:内存代码段大小
    • DATA:数据段+栈大小
    • nFLT:缺页中断次数

二、进程监控:ps 命令深度解析

1. ps 输出字段全解

ps aux --sort=-%mem | head -10

关键字段
| 字段 | 含义 | 重要值 |
|——|——|——–|
| USER | 进程所有者 | - |
| PID | 进程ID | - |
| %CPU | CPU使用率 | >30%需关注 |
| %MEM | 内存使用率 | >10%需关注 |
| VSZ | 虚拟内存大小(KB) | 异常增长可能内存泄漏 |
| RSS | 物理内存大小(KB) | 实际占用内存 |
| STAT | 进程状态 | D=不可中断, Z=僵尸 |
| START | 启动时间 | 运行时间异常需检查 |
| TIME | CPU占用时间 | 持续增长可能有问题 |
| COMMAND | 完整命令 | 检查可疑进程 |

2. 线程相关操作

2.1 查看进程线程数

ps -o nlwp [PID]       # 查看指定进程的线程数
ps -eLf | grep java | wc -l  # 统计Java总线程数

2.2 线程状态分析

ps -T -p [PID]        # 显示进程的所有线程
  • STAT 状态码
    • R:运行中
    • S:休眠中
    • D:不可中断休眠(通常等待I/O)
    • Z:僵尸进程

三、磁盘I/O监控:iostat 深度解析

1. 关键指标详解

iostat -xdm 1

输出示例

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda     0.00   0.50   5.0 20.0 0.80  1.20    100.12    1.25    50.25   10.50   60.75  4.00  90.20

字段解析
| 字段 | 含义 | 警戒值 |
|——|——|——–|
| rrqm/s | 每秒合并读请求数 | - |
| wrqm/s | 每秒合并写请求数 | - |
| r/s | 每秒读次数 | >1000可能瓶颈 |
| w/s | 每秒写次数 | >1000可能瓶颈 |
| rMB/s | 每秒读取量(MB) | 接近磁盘上限时有问题 |
| wMB/s | 每秒写入量(MB) | 接近磁盘上限时有问题 |
| avgqu-sz | 平均I/O队列长度 | >5表示拥堵 |
| await | 平均I/O响应时间(ms) | >20ms需关注 |
| %util | 设备利用率 | >80%表示瓶颈 |

2. 高级用法

2.1 监控特定设备

iostat -x /dev/nvme0n1 2  # 每2秒监控NVMe磁盘

2.2 历史数据分析

iostat -x 1 10 > io.log   # 记录10次采样

四、网络监控:iftop 深度解析

1. 界面字段详解

interface: eth0
IP: 192.168.1.100
=========================
TX: cum: 15.3MB   peak: 2.45Mb  rates: 1.02Mb  2.45Mb  1.67Mb
RX: cum: 45.2MB   peak: 5.12Mb  rates: 3.21Mb  4.56Mb  2.89Mb
=========================
192.168.1.1          => 10.0.0.5            1.45Mb  1.23Mb  1.12Mb
                    <=                       2.10Mb  1.89Mb  1.56Mb

关键字段

  • TX:发送流量统计
  • RX:接收流量统计
  • rates:2秒/10秒/40秒的平均流量
  • =>:表示连接方向
  • <=:表示反向流量

2. 高级过滤

2.1 监控特定端口

iftop -f 'port 80 or port 443'  # 只监控HTTP/HTTPS

2.2 显示端口号

iftop -P       # 按P键显示端口

五、内存分析:free 深度解析

1. 输出详解

free -h

输出示例

              total        used        free      shared  buff/cache   available
Mem:            15G         8G        1.2G        512M        5.8G        6.5G
Swap:           4.0G       1.5G       2.5G

关键指标

  • available:实际可用内存(含可回收缓存)
  • buff/cache:可快速释放的缓存
  • 内存健康判断
    • available > 总内存20%:健康
    • Swap used > 0:开始使用交换空间
    • free内存少但available多:正常(Linux积极利用缓存)

六、综合性能分析:vmstat 深度解析

1. 输出详解

vmstat 1 5

输出示例

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 524288 1024000 512000 4096000  0    0   100    50  500 2000 25 10 63  2  0

关键字段
| 字段 | 含义 | 警戒值 |
|——|——|——–|
| r | 运行队列长度 | > CPU核数 |
| b | 不可中断进程数 | > 0需关注 |
| swpd | 已用交换空间 | > 0表示内存压力 |
| si/so | 交换区换入/出 | > 0表示内存不足 |
| bi/bo | 块设备读写(blocks/s) | 持续高位表示I/O忙 |
| in | 中断次数/s | 突然增加可能有硬件问题 |
| cs | 上下文切换次数/s | >100,000可能有锁竞争 |
| us/sy/id | CPU时间分配 | us>70%或sy>30%需关注 |

七、性能问题排查实战流程

场景:数据库服务器响应缓慢

  1. 快速定位方向

    top -n 1          # 查看整体负载
    vmstat 1 5       # 检查运行队列和交换
  2. CPU分析

    ps aux --sort=-%cpu | head -10
    top -H -p [mysql_pid]  # 查看MySQL线程
    perf top -p [pid]     # 需要perf工具
  3. 内存分析

    free -h
    ps aux --sort=-rss | head -10
    cat /proc/[pid]/smaps # 详细内存映射
  4. I/O分析

    iostat -x 1
    iotop -o -d 1
  5. 网络分析

    iftop -i eth0 -nNP
    netstat -s | grep -E 'retrans|segments'
  6. 深度诊断

    strace -p [pid] -T -f -o trace.log  # 系统调用分析
    tcpdump -i eth0 -w mysql.pcap port 3306  # 抓包分析

通过这套完整的监控体系,可以系统性地定位90%以上的性能问题!

作者:admin  创建时间:2025-05-29 10:08
最后编辑:admin  更新时间:2025-05-29 13:26