1. 为什么需要实时监控Linux进程?
在Linux系统管理中,进程监控就像汽车仪表盘对于驾驶员一样重要。想象你正在驾驶一辆车,如果看不到转速、油量和速度表,你根本无法判断引擎是否在正常工作。同样,作为系统管理员或开发者,不了解系统中运行的进程状态,就像在盲开服务器。
我管理过数百台生产服务器,最深刻的教训就是:90%的系统异常都能通过进程监控提前发现征兆。比如某个Java进程内存持续增长但没被察觉,最终导致OOM崩溃;或是隐藏的挖矿病毒悄悄消耗CPU资源。这些情况如果能在早期通过实时监控发现,就能避免严重事故。
2. 基础监控工具详解
2.1 top命令:系统监控的瑞士军刀
输入top后,你会看到类似这样的动态界面:
code复制top - 14:30:45 up 15 days, 3:23, 2 users, load average: 0.15, 0.08, 0.05
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15985.6 total, 3245.2 free, 5689.4 used, 7051.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 9685.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 mysql 20 0 12.345g 2.456g 12345 S 5.6 15.8 12:34.56 mysqld
5678 nginx 20 0 123456 78901 2345 S 1.2 0.5 0:12.34 nginx
关键列解析:
%CPU:进程占用的CPU百分比(多核环境下可能超过100%)%MEM:物理内存占用百分比VIRT:虚拟内存使用量(包含共享库和映射文件)RES:实际使用的物理内存(常驻内存集)SHR:共享内存大小
实用技巧:
- 按
M按内存排序,快速发现内存泄漏进程 - 按
P按CPU排序,揪出CPU占用高的元凶 - 按
1展开多核CPU详情,查看各核心负载 - 按
z切换彩色显示,关键数据更醒目
注意:生产环境中,top的默认3秒刷新间隔可能错过瞬时峰值。可以用
top -d 1改为1秒刷新,但会增加系统负载。
2.2 htop:现代化进程管理器
如果top是老式收音机,htop就是带触摸屏的智能设备。安装命令:
bash复制# Ubuntu/Debian
sudo apt install htop
# CentOS/RHEL
sudo yum install epel-release && sudo yum install htop
htop的核心优势:
- 树状视图展示父子进程关系(按
F5切换) - 鼠标直接点击表头排序
- 支持进程筛选(
F4)和搜索(F3) - 可视化CPU/内存使用条
- 直接杀死进程(
F9)或调整优先级(F7/F8)
实战案例:
发现某个未知进程占用过高CPU时:
- 用
F3搜索进程名 - 按
F2进入设置,开启"显示命令行参数" - 查看完整执行路径判断是否为恶意程序
- 用
strace -p PID进一步分析系统调用
3. 专业级监控方案
3.1 ps命令的进阶用法
虽然ps是静态快照,但结合watch命令就能变实时:
bash复制watch -n 1 "ps aux --sort=-%cpu | head -n 10"
这会每秒刷新CPU占用前十的进程。
关键参数组合:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head:按内存排序ps -p PID -o lstart,etime:查看进程启动时间和运行时长ps -eLf:显示所有线程(LWP)
排查僵尸进程:
bash复制ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
然后通过kill -9 PPID终止父进程来清理。
3.2 vmstat与系统级监控
vmstat 1输出示例:
code复制procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3245212 102384 7051236 0 0 12 23 101 156 2 1 97 0 0
关键指标:
r:运行队列长度(大于CPU核数表示饱和)si/so:swap交换频率(非零需警惕)us/sy:用户/系统CPU时间占比wa:IO等待时间(高值说明磁盘瓶颈)
3.3 pidstat:进程级资源统计
安装sysstat包后使用:
bash复制pidstat -urd -p PID 1
示例输出:
code复制14:45:42 UID PID %usr %system %guest %wait %CPU CPU Command
14:45:43 999 1234 2.50 0.50 0.00 0.00 3.00 3 java
监控维度:
-u:CPU使用率(可细分用户/系统态)-r:内存缺页和利用率-d:磁盘IO统计-w:上下文切换次数
4. 图形化工具与Web方案
4.1 Glances:全能监控仪表盘
安装与启动:
bash复制pip install glances
glances -w # 启用web服务
特色功能:
- 根据阈值自动变色警告(可自定义)
- 插件系统支持Docker、GPU等监控
- RESTful API接口供其他系统集成
- 历史数据记录(需配合--export选项)
4.2 Prometheus + Grafana 企业级方案
架构示意图:
code复制进程指标 → node_exporter → Prometheus → Grafana可视化
配置步骤:
- 安装node_exporter采集基础指标
- Prometheus配置抓取job:
yaml复制scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- Grafana导入ID 1860的Node Exporter仪表板
关键监控项:
- 进程数监控:
node_procs_running - 单进程CPU:
rate(process_cpu_seconds_total{pid="1234"}[1m]) - 内存使用:
process_resident_memory_bytes{job="node"}
5. 实战问题排查指南
5.1 高频问题速查表
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| CPU持续100% | 死循环/频繁GC | top -Hp PID + jstack |
| 内存缓慢增长 | 内存泄漏 | pmap -x PID + jmap |
| 进程频繁重启 | 被OOM Killer终止 | `dmesg |
| 僵尸进程堆积 | 父进程未处理SIGCHLD | `ps -ef |
| 磁盘IO高但无写入 | 可能是swap频繁 | vmstat 1 + iostat -dx |
5.2 性能分析实战案例
场景: 某Java服务CPU占用高但业务量低
- 用
top -Hp 1234找到占用高的线程ID(转为16进制) - 执行
jstack 1234 > thread.dump - 在dump文件中搜索nid=0x4a1b(对应线程ID)
- 发现该线程正在执行JSON序列化
- 检查代码发现循环内创建ObjectMapper实例
优化方案:
- 重用ObjectMapper实例
- 升级Jackson版本
- 对大数据量处理改用流式API
6. 自动化监控脚本示例
6.1 进程存活监控脚本
bash复制#!/bin/bash
SERVICE="nginx"
if ! pgrep -x "$SERVICE" >/dev/null; then
echo "$(date): $SERVICE stopped, restarting..." >> /var/log/process_monitor.log
systemctl restart $SERVICE
fi
加入crontab每分钟执行:
bash复制* * * * * /path/to/monitor.sh
6.2 资源阈值告警脚本
bash复制#!/bin/bash
THRESHOLD=90
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
echo "High CPU usage: $CPU_USAGE%" | mail -s "CPU Alert" admin@example.com
fi
增强版建议:
- 使用sar收集历史基线数据
- 实现指数平滑算法避免误报
- 集成到Zabbix/Nagios等监控系统