大家好,这里是 DBA 学习之路,专注于提升数据库运维效率。

概述

top 是 Linux 系统中最常用的实时系统监控命令之一,能够动态显示系统中正在运行的进程信息,包括 CPU 使用率、内存占用、系统负载等关键性能指标。

基本语法

1
top [选项]

界面说明

系统信息区域(前 5 行)

1
2
3
4
5
top - 14:30:25 up 10 days,  5:42,  2 users,  load average: 0.15, 0.25, 0.30
Tasks: 287 total, 1 running, 286 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.5 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 16384.0 total, 2048.5 free, 8192.3 used, 6143.2 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 7680.1 avail Mem
第一行:系统时间和负载
  • 14:30:25:当前时间
  • up 10 days, 5:42:系统运行时间
  • 2 users:当前登录用户数
  • load average: 0.15, 0.25, 0.30:1 分钟、5 分钟、15 分钟的平均负载
第二行:进程统计
  • 287 total:总进程数
  • 1 running:运行中的进程数
  • 286 sleeping:睡眠状态进程数
  • 0 stopped:停止的进程数
  • 0 zombie:僵尸进程数
第三行:CPU 使用率
  • us:用户空间占用 CPU 百分比
  • sy:内核空间占用 CPU 百分比
  • ni:改变过优先级的进程占用 CPU 百分比
  • id:空闲 CPU 百分比
  • wa:IO 等待占用 CPU 百分比
  • hi:硬中断占用 CPU 百分比
  • si:软中断占用 CPU 百分比
  • st:虚拟机占用 CPU 百分比
第四、五行:内存信息
  • total:总内存
  • free:空闲内存
  • used:已使用内存
  • buff/cache:缓冲和缓存内存
  • avail Mem:可用内存

进程列表区域

1
2
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
12345 root 20 0 162.5m 12.3m 8.9m S 2.3 0.8 0:05.67 oracle
  • PID:进程 ID
  • USER:进程所有者
  • PR:优先级
  • NI:nice 值
  • VIRT:虚拟内存
  • RES:物理内存
  • SHR:共享内存
  • S:进程状态(R 运行,S 睡眠,D 不可中断睡眠,Z 僵尸,T 停止)
  • %CPU:CPU 使用百分比
  • %MEM:内存使用百分比
  • TIME+:累计 CPU 时间
  • COMMAND:命令名称

常用选项

基本选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示特定用户的进程
top -u username

# 显示特定进程ID
top -p 1234

# 批处理模式,适合脚本使用
top -b

# 指定刷新次数后退出
top -n 5

# 设置刷新间隔(秒)
top -d 2

交互式按键

在 top 运行时,可以使用以下按键进行交互:

显示控制
  • q:退出 top
  • h?:显示帮助信息
  • z:彩色/单色显示切换
  • B:粗体显示切换
排序控制
  • P:按 CPU 使用率排序(默认)
  • M:按内存使用率排序
  • T:按累计时间排序
  • N:按 PID 排序
  • R:颠倒排序顺序
进程管理
  • k:终止进程(需要输入 PID)
  • r:重新设置进程优先级
  • u:只显示特定用户的进程
显示选项
  • 1:显示/隐藏每个 CPU 核心信息
  • t:切换 CPU 信息显示格式
  • m:切换内存信息显示格式
  • l:切换负载平均值和启动时间显示
  • f:添加或删除显示字段
  • o:改变显示字段顺序

实际应用场景

1. 系统性能监控

1
2
3
4
5
# 持续监控系统性能,每2秒刷新一次
top -d 2

# 监控特定时间段,运行10次后退出
top -n 10 -d 5

2. 问题排查

查找 CPU 占用高的进程
1
2
3
# 按CPU使用率排序(默认)
top
# 然后按 'P' 键确保按CPU排序
查找内存占用高的进程
1
2
3
4
# 启动top后按 'M' 键按内存排序
top
# 或者直接使用命令行方式
top -o %MEM
监控特定进程
1
2
3
4
5
# 监控oracle进程
top -p $(pgrep oracle)

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

3. 数据库运维场景

监控数据库进程
1
2
3
4
5
# 监控oracle相关进程
top -u oracle

# 批处理模式输出到文件
top -b -n 1 -u oracle > oracle_performance.txt
性能分析
1
2
3
4
5
6
# 每30秒记录一次系统状态,持续记录24小时
while true; do
echo "=== $(date) ===" >> system_monitor.log
top -b -n 1 >> system_monitor.log
sleep 30
done

4. 服务器维护场景

服务器健康检查
1
2
3
4
5
# 快速查看系统概况
top -b -n 1 | head -10

# 检查是否有异常进程
top -b -n 1 | grep -E "(zombie|stopped)"
资源使用统计
1
2
3
4
5
# 获取内存使用前10的进程
top -b -n 1 -o %MEM | head -20

# 获取CPU使用前10的进程
top -b -n 1 -o %CPU | head -20

5. 自动化脚本示例

系统监控脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
# system_monitor.sh

LOGFILE="/var/log/system_monitor.log"
THRESHOLD_CPU=80
THRESHOLD_MEM=90

while true; do
# 获取CPU使用率最高的进程
CPU_TOP=$(top -b -n 1 | awk 'NR>7 {print $9,$12}' | sort -nr | head -1)
CPU_USAGE=$(echo $CPU_TOP | awk '{print $1}')
CPU_PROCESS=$(echo $CPU_TOP | awk '{print $2}')

# 获取内存使用率最高的进程
MEM_TOP=$(top -b -n 1 | awk 'NR>7 {print $10,$12}' | sort -nr | head -1)
MEM_USAGE=$(echo $MEM_TOP | awk '{print $1}')
MEM_PROCESS=$(echo $MEM_TOP | awk '{print $2}')

# 记录日志
echo "[$(date)] CPU: ${CPU_USAGE}% (${CPU_PROCESS}), MEM: ${MEM_USAGE}% (${MEM_PROCESS})" >> $LOGFILE

# 检查阈值
if (( $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc -l) )); then
echo "WARNING: High CPU usage: ${CPU_USAGE}% by ${CPU_PROCESS}" >> $LOGFILE
fi

if (( $(echo "$MEM_USAGE > $THRESHOLD_MEM" | bc -l) )); then
echo "WARNING: High memory usage: ${MEM_USAGE}% by ${MEM_PROCESS}" >> $LOGFILE
fi

sleep 60
done

高级使用技巧

1. 自定义显示字段

f 键进入字段选择界面,可以添加或删除显示列:

  • 使用上下箭头选择字段
  • 按空格键切换字段显示状态
  • q 退出字段选择

2. 保存配置

top 的配置可以保存到用户配置文件:

1
2
# 在top界面按 'W' 键保存当前配置
# 配置文件位置:~/.toprc

3. 多核 CPU 监控

1
2
3
# 显示每个CPU核心的使用情况
top
# 然后按 '1' 键切换单个/多个CPU显示

4. 进程树显示

1
2
3
# 显示进程树(需要按 'V' 键)
top
# 在界面中按 'V' 显示进程父子关系

性能优化建议

1. 系统负载分析

  • 负载平均值 > CPU 核心数:系统可能过载
  • 负载平均值 < CPU 核心数:系统正常
  • 1 分钟负载 > 15 分钟负载:负载在上升

2. CPU 使用率分析

  • us 高:用户程序消耗 CPU 多
  • sy 高:系统调用多,可能 IO 密集
  • wa 高:IO 等待时间长,可能磁盘瓶颈
  • id 低:CPU 使用率高

3. 内存使用分析

  • free 很低但 available 充足:正常,系统在使用缓存
  • available 也很低:可能需要增加内存
  • 大量 swap 使用:内存不足

注意事项

  1. 权限问题:某些进程信息需要 root 权限才能查看
  2. 性能影响:top 本身也会消耗系统资源,高频刷新会增加系统负载
  3. 数据准确性:瞬时数据可能不准确,建议观察一段时间的趋势
  4. 版本差异:不同 Linux 发行版的 top 可能有细微差异

替代工具

  • htop:增强版 top,界面更友好
  • atop:更详细的系统监控
  • iotop:专门监控 IO 使用情况
  • nethogs:网络使用监控

总结

top 命令是 Linux 系统管理员必须掌握的基础工具,通过合理使用各种选项和交互命令,可以有效监控系统性能、排查问题、优化系统资源配置。在日常运维工作中,建议结合脚本自动化监控,及时发现和处理系统异常。