运维专题3——业务进程排查方法论

文章目录

进程排查方法论

生产环境的进程问题往往不是孤立的,排查时应遵循 "由表及里、由粗到细、分层定位"

原则

  • 全局概览:先查看系统整体资源使用情况(CPU、内存、负载、IO),确定问题范围
  • 进程定位:找到占用异常资源或行为异常的进程 PID
  • 深入分析:分析进程的运行状态、资源占用细节、系统调用、文件 / 网络依赖
  • 根因确认:结合日志和历史数据,验证问题根源
  • 验证修复:实施修复措施并验证效果

常用工具与功能

工具 功能 用法举例
top / htop 实时资源监控,发现异常进程 按 CPU/内存排序,观察负载趋势
ps 进程快照,获取进程树、线程、启动参数 查看父子关系、线程列表、环境变量
lsof 查看进程打开的文件、网络连接、管道 定位端口占用、删除文件未释放、Unix socket
strace 追踪系统调用和信号 分析进程卡死、性能瓶颈、权限错误
journalctl 集中式日志管理(systemd) 按服务、时间、优先级过滤日志

建议 :生产环境中应优先使用非侵入式工具(toppslsofjournalctl),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 查找已被删除但仍在写入的大文件,解决 dfdu 结果不一致的问题

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=sudojournalctl _COMM=sshd 分析特权操作和登录行为

实战案例

待二期更新

相关推荐
枳实-叶2 小时前
【Linux驱动开发】第10天:设备树零基础入门——DTS/DTB/DTC全解+编译流程
linux·运维·驱动开发
枳实-叶2 小时前
【Linux驱动开发】第11天:设备树(Device Tree)超详细全解:从诞生背景到工作原理
linux·运维·驱动开发
IT大白鼠2 小时前
网络发展简史:从ARPANET到Web3.0的技术演进与社会影响
网络·web3
Bert.Cai2 小时前
Linux shift命令详解
linux·运维·服务器
叶~小兮2 小时前
Zabbix 7.0 深度原理与生产进阶运维学习笔记
运维·学习·zabbix
cui_ruicheng2 小时前
Linux网络编程(六):UDP聊天室与线程池
linux·服务器·网络·udp
XMAIPC_Robot3 小时前
深度无人机自动驾驶仪,中小型无人机硬件在环仿真飞行
运维·arm开发·人工智能·fpga开发·无人机·边缘计算
文青小兵3 小时前
云计算Linux——数据库MySQL读写分离、数据库备份、恢复(十八)
linux·运维·服务器·数据库·mysql·云计算
路由侠内网穿透.3 小时前
本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)
网络·网络协议