引言
诊断是运维的第一性原理。
当你发现 VPS 变慢、CPU 飙升、内存不足或磁盘 IO 异常时,第一步不是慌忙重启,而是系统地定位问题。本文将带你从零开始掌握 Linux 进程管理与系统诊断的核心技能——不是罗列命令,而是教你建立一套可复用的排障思维。
所有命令均适用于 Ubuntu 24.04 / Debian 12 / AlmaLinux 9,覆盖 CPU、内存、磁盘 I/O、网络、日志五大维度。
一、进程查看:ps 与 pstree 的进阶用法
1.1 ps 核心命令速查
# 查看所有进程的完整信息(最常用)
ps aux
# 按内存使用量排序(找出内存大户)
ps aux --sort=-%mem | head -20
# 按 CPU 使用率排序
ps aux --sort=-%cpu | head -20
# 只看某个用户的进程
ps -u www-data
# 以树状结构显示进程关系(查看父子进程)
ps auxf
# 只显示特定 PID 的进程详情
ps -p 1234 -o pid,ppid,cmd,%cpu,%mem,etime
1.2 关键输出字段解读
| 字段 | 含义 | 排障提示 |
|---|---|---|
%CPU | 进程占用 CPU 百分比 | 持续 >90% 需重点关注 |
%MEM | 物理内存占用百分比 | 警惕内存泄漏 |
VSZ | 虚拟内存大小(KB) | 过大可能预示问题 |
RSS | 实际物理内存(KB) | 比 VSZ 更真实 |
STAT | 进程状态(见下方) | D=不可中断睡眠,Z=僵尸进程 |
etime | 进程运行时长 | 判断是否为异常长期进程 |
1.3 STAT 状态速查
R → 运行中(Running)
S → 可中断睡眠(等待事件)
D → 不可中断睡眠(通常在等磁盘 I/O)⚠️
Z → 僵尸进程(已死但父进程未回收)⚠️
T → 已停止(Stopped)
X → 死亡(Dead)
当发现大量 D 状态进程时,说明系统存在严重的磁盘 I/O 瓶颈;Z 僵尸进程需要清理父进程。
1.4 pstree:看清进程血缘
# 查看完整进程树
pstree -p
# 只看某个进程的子孙
pstree -p 1234
# 显示进程启动命令
pstree -apul
二、实时监控:top 与 htop
2.1 top 命令详解
# 启动 top(默认每 3 秒刷新)
top
# 指定刷新间隔(秒)
top -d 1
# 只显示某个用户的进程
top -u www-data
# 按内存排序(进入后按 M)
top
# 按 CPU 排序(进入后按 P)
top
# 直接输出一次快照(非交互)
top -b -n 1
top 界面关键区域:
- 第一行:系统运行时间、登录数、负载平均值(1/5/15 分钟)
- 第二行:进程总数、运行/睡眠/僵尸进程数
- 第三行:CPU 使用率(us=用户态,sy=内核态,id=空闲,wa=IO等待)
- 第四行:内存使用(total/free/buff/cache)
- 第五行:交换分区(swap)
负载均值解读:
- 负载 < CPU 核数:系统健康
- 负载 ≈ CPU 核数:适中
- 负载 > CPU 核数 × 2:严重过载,需立即排查
2.2 htop:更现代的交互界面
# 安装(Debian/Ubuntu)
sudo apt install htop
# 启动 htop
htop
# 按 F2 进入设置,配置自定义列
# 按 F3 搜索进程
# 按 F9 发送信号(终止/挂起等)
# 按 F10 退出
htop 相比 top 的优势:
- 彩色显示,一目了然
- 支持鼠标操作
- 可直接杀死进程(F9)
- 更直观的磁盘和网络 IO 条形图
- 可按线程查看
三、磁盘 I/O 分析:iotop 与 iostat
3.1 iotop:找出 IO 大户
# 安装
sudo apt install iotop
# 实时监控(需要 root)
sudo iotop
# 只展示有 IO 行为的进程
sudo iotop -o
# 一次性快照
sudo iotop -b -n 1
关键字段:
DISK READ/WRITE:当前读写速度IO %:IO 占用百分比SWAPIN/OUTIN:交换区 IO 比例
3.2 iostat:查看设备级 IO 统计
# 安装
sudo apt install sysstat
# 每秒刷新一次,共 5 次
iostat -xz 1 5
# 只看磁盘设备(不显示 CPU)
iostat -dx 1 5
# 查看历史 IO 数据(如果启用)
sar -d -p
关键指标解读:
await:平均每次 IO 请求的等待时间(ms),>20ms 需关注%util:设备利用率,接近 100% 说明磁盘已成瓶颈r_await/w_await:读/写平均响应时间rkB/s wkB/s:读写吞吐量
四、内存深度分析
4.1 free 命令
# 人性化显示
free -h
# 以 MB 为单位
free -m
输出解读:
total used free shared buff/cache available
Mem: 7.6G 2.1G 3.2G 256M 2.3G 5.0G
Swap: 2.0G 0.0B 2.0G
关键点: available 比 free 更有参考价值——它表示实际应用可用内存(包含可回收的 buff/cache)。
4.2 深入内存:smem 与 /proc/meminfo
# 安装 smem(更准确的内存统计)
sudo apt install smem
# 按 RSS 排序(真正占用的物理内存)
smem -t -k
# 按 PSS 排序(考虑共享库后的公平分配)
smem -t -k -p
# 查看内核内存细节
cat /proc/meminfo | head -30
# 查看内存数值统计(非人性华)
cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree"
4.3 检测内存泄漏
# 跟踪某个进程的内存变化
watch -n 1 'ps aux --sort=-%mem | head -10'
# 查看进程的详细内存映射
cat /proc/<PID>/smaps | head -50
# 强制释放缓存(只释放干净页,不影响运行)
sudo sync; echo 1 > /proc/sys/vm/drop_caches
五、CPU 性能分析
5.1 mpstat:多核 CPU 监控
# 安装
sudo apt install sysstat
# 每秒刷新,看各核使用情况
mpstat -P ALL 1 5
# 只看总体
mpstat 1 3
解读: 如果某核心 usr 高而其他空闲,可能是单线程瓶颈;如果所有核心都满载,考虑横向扩容。
5.2 vmstat:虚拟内存统计
# 每秒刷新,观察系统整体
vmstat 1 10
# 只看汇总(不刷新)
vmstat -s
关键字段:
si/so:换入/换出内存量,持续非零说明内存不足bi bo:块设备读写,持续高位说明 IO 压力大us sy id wa st:CPU 各状态占比
5.3 pidstat:进程级 CPU 统计
# 安装
sudo apt install sysstat
# 每秒统计每个进程的 CPU 使用
pidstat -u 1 5
# 只看特定 PID
pidstat -u 1 5 -p 1234
# 查看上下文切换(高切换率影响性能)
pidstat -r 1 5
六、网络诊断工具
6.1 连接与端口
# 查看所有网络连接(含 PID)
ss -tulnap
# 只看 TCP 连接
ss -tna
# 监听端口列表
ss -tlnp
# 替代 netstat(已弃用,推荐用 ss)
netstat -tulnap # 仍可用但不推荐
连接状态速查:
ESTAB:正常连接TIME_WAIT:等待关闭的连接(大量存在影响新连接)CLOSE_WAIT:对端已关闭但未本地关闭 ⚠️SYN_RECV:大量出现可能遭 SYN Flood 攻击 ⚠️LISTEN:正常监听
6.2 网络流量监控
# 实时查看网卡流量
iftop
# 安装
sudo apt install iftop
# 查看每个连接的流量分布
nload eth0
# 带宽统计
sudo apt install bandwhich
bandwhich
6.3 链路质量检测
# 测试到目标的路由
traceroute example.com
# 快速路由跟踪(不需要 root)
mtr example.com
# 测试 DNS 解析
dig example.com +trace
# 测试 DNS 解析速度
time dig example.com
七、日志分析:journalctl 完全指南
7.1 基础查询
# 查看系统启动以来的所有日志
journalctl
# 只看本次启动的日志
journalctl -b
# 查看上一次启动的日志
journalctl -b -1
# 实时跟随日志(类似 tail -f)
journalctl -f
# 查看最近 100 行
journalctl -n 100
# 结合 pager 向下翻页
journalctl | less
7.2 按服务过滤
# 查看 nginx 相关日志
journalctl -u nginx
# 查看多个服务
journalctl -u nginx -u postgresql
# 查看某个服务的最新日志
journalctl -u nginx --since "10 minutes ago"
# 查看错误和警告
journalctl -u nginx -p err..alert
7.3 高级过滤技巧
# 按时间范围
journalctl --since "2026-08-29 10:00:00" --until "2026-08-29 12:00:00"
# 按优先级(0=紧急 7=调试)
journalctl -p err
journalctl -p crit
journalctl -p warning
# 查看特定内核消息
journalctl -k
# 查看特定 PID 进程日志
journalctl _PID=1234
# 查看特定程序日志
journalctl _COMM=nginx
# 混合过滤
journalctl -u nginx -p err --since "1 hour ago"
7.4 日志轮转与持久化
# 查看日志占用空间
journalctl --disk-usage
# 设置最大保留时间(默认 4 个月)
sudo journalctl --vacuum-time=7d
# 限制日志大小(最多 100MB)
sudo journalctl --vacuum-size=100M
# 开启日志持久化到磁盘(默认已开启)
# 日志文件位置:/var/log/journal/
八、综合排障流程
当 VPS 出现问题时,建议按以下顺序排查:
┌─────────────────────────────────────────────────────┐
│ 1. 快速概览:uptime / top(确认负载级别) │
│ 2. CPU 分析:top -c 或 mpstat(定位 CPU 瓶颈) │
│ 3. 内存分析:free -h + smem(判断是否内存不足) │
│ 4. 磁盘 IO:iotop -o + iostat -xz(找出 IO 大户) │
│ 5. 网络检查:ss -tna + mtr(连接与链路质量) │
│ 6. 日志追溯:journalctl -u <service> -p err │
│ 7. 内核信息:dmesg | tail(硬件/驱动级别错误) │
└─────────────────────────────────────────────────────┘
实战示例:CPU 飙升排查
# Step 1: 确认负载
uptime
# Step 2: 找到 CPU 高的进程
top -bn1 | head -20
# Step 3: 深入分析该进程
pidstat -u 1 3 -p <PID>
# Step 4: 查看进程详细信息
ps -p <PID> -o pid,ppid,cmd,%cpu,%mem,stat,etime
# Step 5: 查看进程打开的文件
lsof -p <PID> | head -20
# Step 6: 如果是 Web 服务,检查相关日志
journalctl -u nginx -p err --since "30 minutes ago"
实战示例:内存不足排查
# Step 1: 确认内存状况
free -h
vmstat -s
# Step 2: 找出内存大户
ps aux --sort=-%mem | head -15
smem -t -k
# Step 3: 检查是否有交换使用
cat /proc/swaps
swapon --show
# Step 4: 查看系统日志中是否有 OOM Killer 记录
journalctl -k | grep -i "oom\|out of memory"
# Step 5: 如有必要,临时缓解
sudo systemctl restart <heavy-service>
九、性能基线:建立你的 VPS 健康画像
排障的前提是了解"正常"。建议每天记录一次基线数据:
# 一键基线快照脚本
#!/bin/bash
echo "=== System Baseline $(date) ==="
echo "--- Uptime ---"
uptime
echo "--- Memory ---"
free -h
echo "--- CPU Load ---"
cat /proc/loadavg
echo "--- IO Wait ---"
vmstat 1 3 | tail -1
echo "--- Top Memory Processes ---"
ps aux --sort=-%mem | head -6
echo "--- Top CPU Processes ---"
ps aux --sort=-%cpu | head -6
echo "--- Disk Usage ---"
df -h
echo "--- Network Connections ---"
ss -s
保存为 ~/scripts/baseline.sh,每天通过 cron 执行并记录到文件,异常时对比基线快速定位偏差。
总结
VPS 排障不是凭感觉猜,而是用数据说话。掌握这套工具链后,你可以在 5 分钟内定位绝大多数性能问题:
| 症状 | 优先检查工具 |
|---|---|
| 系统变慢 | top → vmstat → mpstat |
| 磁盘满 | df -h → du -sh /* |
| 内存不足 | free -h → smem → dmesg | grep oom |
| IO 瓶颈 | iotop -o → iostat -xz |
| 网络连接异常 | ss -tna → mtr |
| 服务异常 | journalctl -u <service> → dmesg |
持续练习是唯一捷径。 建议你每天花 5 分钟运行 top 和 free -h,建立对服务器日常状态的直觉。当异常发生时,这种直觉会帮你更快定位问题。
