文章目录
- 进程排查方法论
-
- 原则
- 常用工具与功能
-
- [top 命令:实时性能监控](#top 命令:实时性能监控)
- [ps 命令:定位进程](#ps 命令:定位进程)
- lsof:文件与网络连接排查
- strace:系统调用跟踪
- [journalctl:systemd 日志查看](#journalctl:systemd 日志查看)
- 实战案例
进程排查方法论
生产环境的进程问题往往不是孤立的,排查时应遵循 "由表及里、由粗到细、分层定位"
原则
- 全局概览:先查看系统整体资源使用情况(CPU、内存、负载、IO),确定问题范围
- 进程定位:找到占用异常资源或行为异常的进程 PID
- 深入分析:分析进程的运行状态、资源占用细节、系统调用、文件 / 网络依赖
- 根因确认:结合日志和历史数据,验证问题根源
- 验证修复:实施修复措施并验证效果
常用工具与功能
| 工具 | 功能 | 用法举例 |
|---|---|---|
top / htop |
实时资源监控,发现异常进程 | 按 CPU/内存排序,观察负载趋势 |
ps |
进程快照,获取进程树、线程、启动参数 | 查看父子关系、线程列表、环境变量 |
lsof |
查看进程打开的文件、网络连接、管道 | 定位端口占用、删除文件未释放、Unix socket |
strace |
追踪系统调用和信号 | 分析进程卡死、性能瓶颈、权限错误 |
journalctl |
集中式日志管理(systemd) | 按服务、时间、优先级过滤日志 |
建议 :生产环境中应优先使用非侵入式工具(top、ps、lsof、journalctl),strace 会引入可观的性能开销,仅在明确需要时对目标进程短暂使用,且建议加上 -o 输出到文件以避免影响终端。
top 命令:实时性能监控
top 是最常用的实时进程监控工具,特别适合在高负载环境下快速识别异常进程。
bash
# 按CPU使用率排序,显示完整命令行
top -c -o %CPU
# 按内存使用率排序,监控特定用户进程
top -u www-data -o %MEM
# 批量模式输出1次结果(适合脚本调用和日志记录)
top -b -n 1 > top_$(date +%Y%m%d_%H%M%S).log
# 指定刷新间隔为1秒,只显示指定PID的进程
top -d 1 -p 1234,5678
# 显示所有线程(H模式)
top -H
top -H -p 1234 # 只显示PID 1234的所有线程
剖析:
- 在 k8s 节点上,当 CPU 使用率突增时,使用
top -H -p <pid>查看线程级别的 CPU 消耗 - 结合
-d参数设置刷新间隔,在性能压测时持续监控进程资源变化 - 使用
-1选项查看每个 CPU 核心的负载分布,识别 CPU 绑定问题 -P:按 CPU 使用率降序排序
ps 命令:定位进程
命令示例:
bash
# 查找占用内存超过1GB的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | awk '$4 > 1.0'
# 查找僵尸进程
ps -eo pid,stat,cmd | grep -w 'Z'
# 按启动时间排序,识别长时间运行的可疑进程
ps -eo pid,lstart,cmd --sort=start_time
# 结合grep和awk,监控特定服务的进程树
ps -ef --forest | grep -A 10 "nginx"
# 显示所有进程的详细资源使用情况
ps aux
ps aux --sort=-%cpu # 按CPU使用率降序排序
ps aux --sort=-%mem # 按内存使用率降序排序
# 显示指定进程的详细信息
ps -p 1234 -o pid,ppid,user,%cpu,%mem,vsz,rss,tty,stat,start,time,cmd
# 显示进程的所有线程
ps -p 1234 -L # 显示PID 1234的所有线程
ps -eLf # 显示系统所有进程的所有线程
# 查找所有僵尸进程及其父进程
ps aux | grep 'Z'
# 查找指定用户的所有进程
ps -u nginx
# 查找占用内存最多的前10个进程
ps aux --sort=-%mem | head -10
剖析:
- 在自动化运维脚本中,使用
ps -p $PID -o comm=验证进程是否存在 - 结合
--ppid参数分析进程父子关系,识别异常进程树 - 使用
-L选项查看线程信息,配合top -H进行线程级问题定位
lsof:文件与网络连接排查
lsof 是排查端口占用、文件句柄泄漏、网络连接异常的必备工具。
bash
# 查看指定进程打开的所有文件
lsof -p 1234
# 查看指定端口被哪个进程占用(最常用!)
lsof -i :8080
lsof -i tcp:8080 # 只查看TCP连接
lsof -i udp:53 # 只查看UDP连接
# 查看指定用户打开的所有文件
lsof -u nginx
# 查看指定文件被哪个进程打开
lsof /var/log/nginx/access.log
# 查看所有网络连接
lsof -i
lsof -i -P -n # 不解析端口号和主机名(速度更快)
# 查看被删除但仍被进程占用的文件(排查磁盘空间释放不了的问题)
lsof | grep deleted
# 分析网络连接状态
lsof -i TCP -s TCP:ESTABLISHED
# 统计进程打开的文件句柄数(排查文件句柄泄漏)
lsof -p 1234 | wc -l
剖析:
- 端口冲突排查 :当服务启动失败时,使用
lsof -i :<port>快速定位占用端口的进程 - 磁盘空间异常 :使用
lsof | grep deleted查找已被删除但仍在写入的大文件,解决df和du结果不一致的问题
strace:系统调用跟踪
当进程无响应、启动失败或行为异常时,strace 是深入分析进程的解决工具。
bash
# 跟踪指定进程的所有系统调用
strace -p 1234
# 启动并跟踪新进程
strace ./myapp
# 将跟踪结果输出到文件(推荐!避免终端刷屏)
strace -o strace.log -p 1234
# 只跟踪指定类型的系统调用
strace -e trace=file -p 1234 # 只跟踪文件操作相关的系统调用
strace -e trace=network -p 1234 # 只跟踪网络相关的系统调用
strace -e trace=open,read,write -p 1234 # 只跟踪指定的系统调用
剖析
- strace 会显著降低被跟踪进程的性能,生产环境中应尽量缩短跟踪时间,避免在业务高峰期使用
- 对于高并发进程,使用
-e参数过滤只关注的系统调用,减少输出量 - 优先使用
-o参数将结果输出到文件,便于后续分析
journalctl:systemd 日志查看
systemd systemd 的日志管理工具,提供结构化日志查询和系统事件追踪能力;是排查服务启动失败、进程异常退出的首选工具。
bash
# 按时间范围查询日志
journalctl --since "2024-01-01 08:00:00" --until "2024-01-01 09:00:00"
journalctl --since "1 hour ago"
journalctl --since "yesterday"
# 过滤特定服务的日志
journalctl -u nginx.service -f
# 按优先级过滤
journalctl -p warning
# 结合进程ID查询
journalctl _PID=<PID>
# 实时监控系统事件
journalctl -f -o json | jq 'select(.MESSAGE | contains("OOM"))'
# 查看系统启动日志
journalctl -b # 本次启动的日志
journalctl -b -1 # 上一次启动的日志
扩展
- OOM 事件分析 :使用
journalctl -g "Out of memory"查找内存不足事件,结合进程信息定位问题应用 - 服务启动失败诊断 :
journalctl -u service_name.service --since "1 hour ago"查看服务启动失败的详细原因 - 系统安全审计 :监控
journalctl _COMM=sudo或journalctl _COMM=sshd分析特权操作和登录行为
实战案例
待二期更新