强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

系统监控工具指南 / 第2章:top详解

第2章:top详解

2.1 top概述

什么是top

top(Table of Processes)是Linux系统自带的实时进程监控工具,能够动态显示系统中各个进程的资源占用状况。

为什么学top

  1. 无需安装 - 所有Linux发行版默认自带
  2. 轻量高效 - 资源消耗极低
  3. SSH友好 - 纯文本界面,远程管理必备
  4. 功能强大 - 排序、过滤、信号发送

2.2 启动与基本界面

启动方式

# 直接启动
top

# 常用启动参数
top -d 5          # 5秒刷新一次
top -n 10         # 刷新10次后退出
top -p 1234,5678  # 只监控指定PID
top -u username   # 只监控指定用户
top -bn1          # 批处理模式,刷新1次(适合脚本)

界面解读

top - 14:32:15 up 10 days,  3:21,  2 users,  load average: 0.52, 0.58, 0.59
Tasks: 215 total,   2 running, 213 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.2 us,  2.1 sy,  0.0 ni, 92.3 id,  0.3 wa,  0.0 hi,  0.1 si,  0.0 st
MiB Mem :  16384.0 total,   8192.0 free,   4096.0 used,   4096.0 buff/cache
MiB Swap:   8192.0 total,   8192.0 free,      0.0 used.  11264.0 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1234 root      20   0  512340  65432  12340 S   5.0   0.4   1:23.45 nginx
   5678 mysql     20   0 1234567 234567  23456 S   3.2   1.4  12:34.56 mysqld

头部信息详解

第一行:系统概况

字段含义示例
14:32:15当前时间24小时制
up 10 days系统运行时间10天3小时21分
2 users登录用户数2个终端连接
load average系统负载1分钟/5分钟/15分钟平均值

负载解读:

load average: 0.52, 0.58, 0.59
                │     │     │
                │     │     └── 15分钟平均负载
                │     └──────── 5分钟平均负载
                └────────────── 1分钟平均负载

负载与CPU核心数的关系:

负载值4核CPU含义
0.512.5%空闲
2.050%正常
4.0100%满载
8.0200%过载,有进程等待

第二行:任务统计

字段含义
215 total进程总数
2 running运行中进程数
213 sleeping睡眠进程数
0 stopped停止进程数
0 zombie僵尸进程数

僵尸进程处理:

# 查找僵尸进程
ps aux | grep 'Z'

# 查找僵尸进程的父进程
ps -eo pid,ppid,stat,cmd | grep 'Z'

# 杀死父进程(僵尸进程会被init接管)
kill -9 父进程PID

第三行:CPU使用率

字段含义说明
us用户空间占用应用程序消耗
sy内核空间占用系统调用消耗
ni调整过优先级的进程nice值修改的进程
id空闲百分比越高越空闲
waIO等待磁盘或网络IO
hi硬件中断硬件设备请求
si软件中断软件请求
st虚拟机偷取时间虚拟化环境特有

CPU瓶颈判断:

# IO瓶颈
# 特征:wa值高
%Cpu(s): 10.0 us, 5.0 sy, 0.0 ni, 20.0 id, 65.0 wa

# CPU瓶颈
# 特征:us或sy值高,id值低
%Cpu(s): 85.0 us, 10.0 sy, 0.0 ni, 5.0 id, 0.0 wa

# 虚拟化资源争抢
# 特征:st值高
%Cpu(s): 30.0 us, 10.0 sy, 0.0 ni, 40.0 id, 0.0 wa, 0.0 hi, 0.0 si, 20.0 st

第四/五行:内存使用

字段含义
total物理内存总量
free空闲内存
used已使用内存
buff/cache缓冲/缓存
avail Mem可用内存(含可回收缓存)

内存解读:

MiB Mem :  16384.0 total,   8192.0 free,   4096.0 used,   4096.0 buff/cache
MiB Swap:   8192.0 total,   8192.0 free,      0.0 used.  11264.0 avail Mem

重要: Linux会将空闲内存用作缓存,这是正常行为!真正需要关注的是:

  • avail Mem - 实际可用内存
  • Swap使用量 - 如果持续增长说明内存不足

2.3 进程列表字段

字段详解

字段含义说明
PID进程ID唯一标识符
USER进程所有者启动进程的用户
PR优先级rt表示实时进程
NInice值-20到19,越小优先级越高
VIRT虚拟内存进程申请的总内存
RES常驻内存实际使用的物理内存
SHR共享内存与其他进程共享的内存
S进程状态R/S/D/Z/T
%CPUCPU使用率多核可能超过100%
%MEM内存使用率占总内存百分比
TIME+CPU时间进程累计CPU使用时间
COMMAND命令名进程启动命令

进程状态说明

状态含义说明
RRunning运行中或可运行
SSleeping可中断睡眠(等待事件)
DDisk Sleep不可中断睡眠(通常等待IO)
ZZombie僵尸进程(已终止但未被回收)
TStopped被信号停止
tTracing Stop被调试器停止

VIRT/RES/SHR关系

┌─────────────────────────────────────────┐
│                 VIRT (虚拟内存)           │
│  ┌─────────────────────────────────┐   │
│  │           RES (常驻内存)          │   │
│  │  ┌─────────────┐ ┌───────────┐  │   │
│  │  │   私有内存   │ │  SHR(共享) │  │   │
│  │  │  (实际占用)  │ │           │  │   │
│  │  └─────────────┘ └───────────┘  │   │
│  └─────────────────────────────────┘   │
└─────────────────────────────────────────┘

关键指标:

  • RES 是真正占用的物理内存
  • SHR 可能被其他进程共享,实际占用更少
  • VIRT 包含申请但未使用的内存

2.4 交互命令

排序操作

按键功能说明
P按CPU排序默认排序方式
M按内存排序查找内存大户
N按PID排序按进程号
T按时间排序按累计CPU时间
R反转排序升序/降序切换

显示控制

按键功能
1显示/隐藏每个CPU核心
t切换CPU显示模式
m切换内存显示模式
l显示/隐藏负载行
t显示/隐藏任务行
1显示/隐藏CPU行

进程管理

按键功能说明
k杀死进程输入PID和信号
r重新设置优先级输入PID和nice值
d修改刷新间隔输入秒数

信号列表

信号编号作用
SIGTERM15优雅终止(默认)
SIGKILL9强制杀死
SIGHUP1重新加载配置
SIGSTOP19暂停进程
SIGCONT18继续运行

其他命令

按键功能
h显示帮助
q退出top
W保存当前配置
c显示完整命令行
i只显示活跃进程
V树状视图
H显示线程
u按用户过滤

2.5 实用技巧

技巧1:查找CPU占用最高的进程

# 交互模式
# 启动top后按P(大写)

# 脚本模式
top -bn1 | head -20

# 更精确的排序
top -bn1 -o %CPU | head -20

技巧2:查找内存占用最高的进程

# 交互模式
# 启动top后按M(大写)

# 脚本模式
top -bn1 -o %MEM | head -20

技巧3:监控特定进程

# 监控特定PID
top -p 1234

# 监控多个PID
top -p 1234,5678,9012

# 监控特定用户
top -u mysql

# 监控特定命令
top -bn1 | grep nginx

技巧4:批量输出(适合脚本)

# 输出一次,适合脚本处理
top -bn1

# 输出5次,每次间隔2秒
top -bn5 -d 2

# 输出到文件
top -bn1 > top_output.txt

# 格式化输出
top -bn1 | awk 'NR>7 {print $1, $9, $10, $12}'

技巧5:查看线程

# 方法1:top中按H
top
# 按H显示线程

# 方法2:使用-H参数
top -H

# 方法3:查看特定进程的线程
top -H -p 1234

技巧6:显示完整命令

# 方法1:top中按c
top
# 按c显示完整命令

# 方法2:使用-c参数
top -c

技巧7:自定义显示字段

# 进入top后按f
# 使用上下箭头选择字段
# 按空格切换显示/隐藏
# 按s设置排序字段
# 按q退出设置

2.6 高级用法

2.6.1 配置文件

top的配置文件保存在:

~/.toprc          # 用户级配置
/etc/toprc        # 系统级配置

保存当前配置:

# 在top中按W(大写)
# 配置将保存到~/.toprc

配置文件示例:

# ~/.toprc
top's Config File (Linux processes with windows)
Id:a, Mode_altscr=0, Mode_irixps=1, Delay_time=3.000, Curwin=0
Def     fieldscur=AEHIOQTWKNMbcdfgjplrsuvyzX
        winflags=62777, sortindx=10, maxtasks=0
        graph_cpus=0, graph_mems=0, double_up=0
        combine_cpus=0, cpu_in_row=2
        tree_view=0, tree_sort=0, tree collapsed=1

2.6.2 多窗口模式

# 启动top后
# 按A切换到多窗口模式
# 按a切换窗口
# 按G重命名窗口

窗口布局:

┌─────────────────────────────────┐
│ 1:Def - 系统概览                 │
├─────────────────────────────────┤
│ 2:Job - 任务列表                 │
├─────────────────────────────────┤
│ 3:Mem - 内存详情                 │
├─────────────────────────────────┤
│ 4:Usr - 用户统计                 │
└─────────────────────────────────┘

2.6.3 树状视图

# 启动top后按V
# 显示进程的父子关系

树状视图示例:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  169452  13184   8480 S   0.0   0.1   0:03.45 systemd
    567 root      20   0   24340   9876   6543 S   0.0   0.1   0:01.23  `- systemd-journal
    678 root      20   0   28456  12345   8765 S   0.0   0.1   0:00.45  `- systemd-udevd
   1234 www-data  20   0  512340  65432  12340 S   0.5   0.4   1:23.45  `- nginx
   1235 www-data  20   0  512340  65432  12340 S   0.3   0.4   0:45.67      `- nginx
   1236 www-data  20   0  512340  65432  12340 S   0.2   0.4   0:34.56      `- nginx

2.6.4 过滤显示

# 按用户过滤
# 启动top后按u,输入用户名

# 只显示活跃进程
# 启动top后按i

# 按命令名过滤(结合grep)
top -bn1 | grep nginx

2.7 脚本化应用

2.7.1 监控脚本示例

#!/bin/bash
# monitor.sh - 系统监控脚本

LOG_FILE="/var/log/system_monitor.log"

while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    
    # 获取系统负载
    LOAD=$(uptime | awk -F'load average:' '{print $2}' | tr -d ' ')
    
    # 获取CPU使用率
    CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | cut -d'.' -f1)
    CPU_USED=$((100 - CPU_IDLE))
    
    # 获取内存使用率
    MEM_INFO=$(free -m | awk 'NR==2{printf "%.1f %.1f %.1f", $3*100/$2, $3, $2}')
    
    # 获取磁盘使用率
    DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
    
    # 记录日志
    echo "$TIMESTAMP | Load: $LOAD | CPU: ${CPU_USED}% | Memory: $MEM_INFO | Disk: ${DISK_USAGE}%" >> $LOG_FILE
    
    # 检查阈值并告警
    if [ $CPU_USED -gt 90 ]; then
        echo "ALERT: CPU usage is ${CPU_USED}%" | mail -s "CPU Alert" admin@example.com
    fi
    
    sleep 60
done

2.7.2 获取特定进程信息

#!/bin/bash
# get_process_info.sh

PROCESS_NAME=$1

if [ -z "$PROCESS_NAME" ]; then
    echo "Usage: $0 <process_name>"
    exit 1
fi

# 获取进程信息
top -bn1 | grep "$PROCESS_NAME" | head -5

# 获取详细信息
ps aux | grep "$PROCESS_NAME" | grep -v grep

2.7.3 性能数据采集

#!/bin/bash
# collect_perf.sh

OUTPUT_FILE="perf_data_$(date +%Y%m%d_%H%M%S).csv"

# CSV头
echo "Timestamp,CPU_Used,Memory_Used,Load_1m,Load_5m,Load_15m" > $OUTPUT_FILE

# 采集100次,每次间隔5秒
for i in $(seq 1 100); do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | cut -d'.' -f1)
    CPU_USED=$((100 - CPU_IDLE))
    MEM_USED=$(free -m | awk 'NR==2{printf "%.1f", $3*100/$2}')
    LOAD=$(cat /proc/loadavg | awk '{print $1","$2","$3}')
    
    echo "$TIMESTAMP,$CPU_USED,$MEM_USED,$LOAD" >> $OUTPUT_FILE
    
    sleep 5
done

echo "数据已保存到 $OUTPUT_FILE"

2.8 性能指标解读

2.8.1 CPU指标

指标正常范围异常表现可能原因
us<70%>80%应用程序消耗CPU
sy<30%>50%系统调用频繁
wa<20%>50%IO瓶颈
st<5%>20%虚拟化资源争抢

2.8.2 内存指标

指标正常范围异常表现可能原因
使用率<80%>90%内存不足
Swap使用0持续增长内存泄漏
buff/cache占比高不断下降缓存不足

2.8.3 负载指标

场景负载值CPU核心数判断
正常0.5412.5%,空闲
中等2.0450%,正常
高负载4.04100%,满载
过载8.04等待队列长

2.9 常见问题

Q1: top显示的内存使用率很高,但系统正常?

原因: Linux会将空闲内存用作缓存(buff/cache)

解决: 关注 avail Mem 字段,它是实际可用内存

# 查看真实可用内存
free -h
# 或
top  # 看第四行的avail Mem

Q2: 如何找出内存泄漏的进程?

方法:

# 1. 按内存排序(按M)
# 2. 观察RES列是否持续增长
# 3. 使用脚本记录
while true; do
    top -bn1 | head -20 >> /tmp/mem_monitor.log
    sleep 60
done

Q3: 进程状态D是什么意思?

D状态: Disk Sleep,不可中断睡眠

含义: 进程正在等待IO操作,不能被信号中断

常见场景:

  • 磁盘IO瓶颈
  • NFS挂载问题
  • 内核bug

排查:

# 查看D状态进程
ps aux | awk '$8=="D"'

# 查看IO情况
iostat -x 1

# 查看哪个进程在等待IO
iotop

Q4: 多核CPU使用率超过100%?

原因: top默认显示所有CPU核心的总和

解决:

# 按1查看每个核心
top
# 按1

# 或查看进程的单核使用
top -H -p <PID>

2.10 top vs htop 对比

特性tophtop
界面文本单色彩色图形
鼠标支持
树状视图有限完整
横向滚动
杀进程输入PID直接选择
配置保存复杂简单
资源占用更低稍高
安装系统自带需安装

选择建议:

  • 临时查看 → top
  • 日常管理 → htop
  • 无网络环境 → top

2.11 实战案例

案例1:服务器响应慢

# 1. 检查负载
uptime
# load average: 8.52, 7.58, 6.59  # 4核CPU过载

# 2. 找出CPU消耗高的进程
top -o %CPU
# 发现java进程占用800% CPU

# 3. 分析该进程
top -H -p $(pgrep java)
# 发现多个线程都在高CPU

# 4. 结论:Java应用代码问题
# 联系开发人员排查

案例2:内存不足告警

# 1. 检查内存
free -h
#               total   used   free   shared  buff/cache  available
# Mem:           16G    15G    500M    256M      500M        500M
# Swap:          8G     2G     6G

# 2. 找出内存大户
top -o %MEM
# 发现mysqld占用8G内存

# 3. 检查MySQL配置
grep innodb_buffer_pool_size /etc/mysql/my.cnf
# innodb_buffer_pool_size = 12G  # 配置过大

# 4. 解决:调整MySQL配置
# innodb_buffer_pool_size = 8G

案例3:僵尸进程堆积

# 1. 检查僵尸进程
top
# Tasks: 215 total, 2 running, 193 sleeping, 0 stopped, 20 zombie

# 2. 找出僵尸进程
ps aux | grep 'Z'

# 3. 找出父进程
ps -eo pid,ppid,stat,cmd | grep 'Z'
# 发现父进程是某个服务

# 4. 重启父进程
systemctl restart service_name

2.12 快捷命令参考

# 常用启动命令
top                      # 标准启动
top -c                   # 显示完整命令
top -H                   # 显示线程
top -d 5                 # 5秒刷新
top -p 1234              # 监控特定PID
top -u mysql             # 监控特定用户
top -bn1                 # 批处理模式
top -bn1 -o %CPU | head  # CPU占用最高的进程

# 常用交互键
P  # 按CPU排序
M  # 按内存排序
N  # 按PID排序
T  # 按时间排序
1  # 显示每个CPU核心
c  # 显示完整命令
H  # 显示线程
V  # 树状视图
i  # 只显示活跃进程
k  # 杀死进程
r  # 修改优先级
q  # 退出

2.13 扩展阅读

2.14 本章小结

本章详细介绍了top命令的使用:

  1. 界面解读: 系统概况、CPU、内存、进程列表
  2. 交互命令: 排序、过滤、进程管理
  3. 高级用法: 多窗口、树状视图、配置文件
  4. 脚本化: 批处理模式、监控脚本
  5. 实战案例: CPU、内存、僵尸进程问题排查

下一章我们将学习 htop,它提供了更友好的交互界面。


上一章: 第1章:监控工具概览 下一章: 第3章:htop详解