第66集:进程监控工具

教学目标

  • 了解Linux系统中进程监控的重要性
  • 掌握常用的进程监控工具及其使用方法
  • 学会查看进程状态和资源使用情况
  • 学会分析进程树结构
  • 能够识别和处理异常进程
  • 能够根据监控结果进行进程优化

主要知识点

1. 进程监控概述

  • 进程监控的重要性

    • 进程异常会影响系统稳定性
    • 资源占用过高会导致系统性能下降
    • 僵尸进程会占用系统资源
    • 恶意进程会威胁系统安全
    • 定期监控有助于提前发现潜在问题
  • 进程监控的主要指标

    • 进程状态
    • CPU使用率
    • 内存使用率
    • 磁盘I/O使用率
    • 网络I/O使用率
    • 进程优先级
    • 进程启动时间
    • 进程运行时间

2. 进程查看工具

2.1 ps 命令

ps命令是最常用的进程查看工具,用于显示当前系统中的进程状态。

基本语法

ps [选项]

常用选项

  • -a:显示所有终端中的进程
  • -u:显示进程的用户信息
  • -x:显示没有控制终端的进程
  • -e:显示所有进程
  • -f:显示完整格式的进程信息
  • -l:显示长格式的进程信息
  • -o:自定义输出格式
  • -p:显示指定PID的进程
  • --forest:以树状结构显示进程

使用示例

# 查看当前终端中的进程
ps

# 查看所有进程
ps -ef

# 查看所有进程并以树状结构显示
ps -ef --forest

# 查看指定用户的进程
ps -u root

# 查看指定PID的进程
ps -p 1234

# 自定义输出格式(PID、命令、CPU使用率、内存使用率)
ps -eo pid,comm,%cpu,%mem

# 查看进程的完整命令行
ps -ef | grep nginx
ps -ef | grep [n]ginx  # 避免显示grep进程本身

2.2 pgrep 命令

pgrep命令用于根据进程名或其他属性查找进程,是进程查找的专用工具。

基本语法

pgrep [选项] 模式

常用选项

  • -l:显示进程名
  • -a:显示完整的命令行
  • -u:指定用户
  • -P:指定父进程PID
  • -g:指定进程组ID
  • -t:指定终端

使用示例

# 查找指定名称的进程
pgrep nginx

# 查找指定名称的进程并显示进程名
pgrep -l nginx

# 查找指定名称的进程并显示完整命令行
pgrep -a nginx

# 查找指定用户的进程
pgrep -u root sshd

# 查找指定父进程的子进程
pgrep -P 1234

2.3 pstree 命令

pstree命令用于以树状结构显示进程之间的关系,直观展示进程的父子关系。

基本语法

pstree [选项] [PID]

常用选项

  • -a:显示完整的命令行
  • -u:显示进程的用户切换
  • -p:显示进程的PID
  • -c:显示相同的子树多次
  • -h:高亮显示当前进程及其祖先

使用示例

# 以树状结构显示所有进程
pstree

# 显示进程的PID
pstree -p

# 显示完整的命令行
pstree -a

# 显示指定PID的进程树
pstree -p 1234

# 高亮显示当前进程
pstree -h

3. 进程动态监控工具

3.1 top 命令

top命令是一个交互式的进程监控工具,可以实时显示进程的资源使用情况。

基本语法

top [选项]

常用选项

  • -d:指定刷新间隔(秒)
  • -p:显示指定PID的进程
  • -u:显示指定用户的进程
  • -c:显示完整的命令行
  • -b:以批处理模式运行
  • -n:指定刷新次数

交互式命令

  • k:终止指定PID的进程
  • r:修改指定PID的进程优先级
  • f:自定义显示字段
  • o:按指定字段排序
  • P:按CPU使用率排序
  • M:按内存使用率排序
  • T:按运行时间排序
  • q:退出top

使用示例

# 启动top并实时监控进程
top

# 每2秒刷新一次
top -d 2

# 监控指定PID的进程
top -p 1234

# 监控指定用户的进程
top -u nginx

# 以批处理模式运行并输出5次结果
top -b -n 5 > top_output.txt

3.2 htop 命令

htop命令是一个增强版的top命令,提供了更友好的界面和更多的功能。

基本语法

htop [选项]

常用选项

  • -d:指定刷新间隔(秒)
  • -p:显示指定PID的进程
  • -u:显示指定用户的进程
  • -s:指定排序字段

交互式命令

  • F1:显示帮助信息
  • F2:进入设置界面
  • F3:搜索进程
  • F4:过滤进程
  • F5:切换树状视图
  • F6:选择排序字段
  • F7:降低进程优先级
  • F8:提高进程优先级
  • F9:终止进程
  • F10:退出htop

使用示例

# 安装htop
sudo apt install htop  # Debian/Ubuntu
sudo yum install htop  # CentOS/RHEL

# 启动htop并实时监控进程
htop

# 监控指定PID的进程
htop -p 1234

# 监控指定用户的进程
htop -u nginx

# 按内存使用率排序
htop -s MEM

3.3 atop 命令

atop命令是一个高级的系统和进程监控工具,可以记录系统资源使用情况并进行历史分析。

基本语法

atop [选项]

常用选项

  • -a:显示所有进程
  • -d:指定刷新间隔(秒)
  • -n:指定刷新次数
  • -w:将数据写入文件
  • -r:从文件中读取数据

使用示例

# 安装atop
sudo apt install atop  # Debian/Ubuntu
sudo yum install atop  # CentOS/RHEL

# 启动atop并实时监控进程
atop

# 每2秒刷新一次
atop -d 2

# 将数据写入文件
atop -w /var/log/atop.log 60

# 从文件中读取数据
atop -r /var/log/atop.log

4. 进程资源监控工具

4.1 pidstat 命令

pidstat命令是一个进程级的资源监控工具,可以详细显示进程的CPU、内存、磁盘I/O和网络I/O使用情况。

基本语法

pidstat [选项] [时间间隔] [次数]

常用选项

  • -u:显示CPU使用情况(默认)
  • -r:显示内存使用情况
  • -d:显示磁盘I/O使用情况
  • -w:显示上下文切换情况
  • -t:显示线程级别的统计信息
  • -p:显示指定PID的进程
  • -U:显示指定用户的进程

使用示例

# 安装pidstat(通常包含在sysstat包中)
sudo apt install sysstat  # Debian/Ubuntu
sudo yum install sysstat  # CentOS/RHEL

# 查看所有进程的CPU使用情况(每1秒刷新一次,共5次)
pidstat 1 5

# 查看指定PID的进程的内存使用情况
pidstat -r -p 1234 1 5

# 查看所有进程的磁盘I/O使用情况
pidstat -d 1 5

# 查看线程级别的统计信息
pidstat -t 1 5

4.2 psutil 库

psutil是一个Python库,提供了跨平台的进程和系统监控功能,适合编写自定义监控脚本。

使用示例

# 安装psutil
pip install psutil

Python脚本示例

import psutil
import time

# 监控所有进程的CPU和内存使用情况
while True:
    print("\n进程ID\tCPU使用率\t内存使用率\t命令")
    print("-" * 80)
    for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
        try:
            info = proc.info
            print(f"{info['pid']}\t{info['cpu_percent']:.2f}%\t\t{info['memory_percent']:.2f}%\t\t{info['name']}")
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            pass
    time.sleep(2)

5. 进程分析工具

5.1 strace 命令

strace命令用于跟踪进程的系统调用和信号,是进程调试和分析的重要工具。

基本语法

strace [选项] 命令
strace [选项] -p PID

常用选项

  • -p:跟踪指定PID的进程
  • -f:跟踪子进程
  • -e:指定要跟踪的系统调用
  • -o:将输出写入文件
  • -s:指定字符串的最大长度
  • -t:显示时间戳

使用示例

# 跟踪指定命令的系统调用
strace ls -l

# 跟踪指定PID的进程
strace -p 1234

# 跟踪进程的文件操作相关系统调用
strace -e open,read,write,close -p 1234

# 将输出写入文件
strace -o trace.log -p 1234

5.2 lsof 命令

lsof命令用于显示进程打开的文件,是进程文件操作分析的重要工具。

基本语法

lsof [选项]

常用选项

  • -p:显示指定PID的进程打开的文件
  • -u:显示指定用户的进程打开的文件
  • -c:显示指定命令的进程打开的文件
  • -i:显示网络连接
  • -t:仅显示PID

使用示例

# 查看指定PID的进程打开的文件
lsof -p 1234

# 查看指定用户的进程打开的文件
lsof -u nginx

# 查看网络连接
lsof -i

# 查看指定端口的网络连接
lsof -i :80

6. 高级进程监控工具

6.1 Glances 命令

Glances是一个跨平台的系统监控工具,提供了丰富的监控信息,包括进程、CPU、内存、磁盘、网络等。

使用示例

# 安装Glances
pip install glances  # 使用pip安装
sudo apt install glances  # Debian/Ubuntu

# 启动Glances并实时监控系统
Glances

# 以Web模式运行
Glances -w
# 然后在浏览器中访问 http://localhost:61208

# 以客户端-服务器模式运行
# 服务器端
Glances -s
# 客户端
Glances -c 服务器地址

6.2 进程监控系统:Prometheus + Grafana

对于企业级进程监控,可以使用Prometheus和Grafana构建完整的进程监控系统。

部署示例

# 安装Prometheus(参考官方文档)

# 安装Grafana(参考官方文档)

# 配置进程监控指标采集
# 使用node_exporter采集系统和进程指标
# 使用process-exporter采集详细的进程指标

实用案例分析

案例1:CPU使用率过高问题排查

场景:系统报警显示CPU使用率过高,可能存在异常进程。

排查步骤

  1. 查看CPU使用率最高的进程

    top -b -n 1 | head -20
    ps -eo pid,comm,%cpu --sort=-%cpu | head -10
  2. 分析进程的详细信息

    ps -ef | grep 进程名
    lsof -p 进程PID
    strace -p 进程PID
  3. 检查进程是否为恶意进程

    • 检查进程的路径是否合法
    • 检查进程的启动参数
    • 检查进程的网络连接
  4. 解决方案

    • 终止异常进程:kill 进程PIDkill -9 进程PID
    • 优化应用程序代码
    • 调整进程优先级:renice -n 10 进程PID
    • 增加系统资源(如CPU核心数)

案例2:内存使用率过高问题排查

场景:系统报警显示内存使用率过高,可能存在内存泄漏。

排查步骤

  1. 查看内存使用率最高的进程

    top -b -n 1 -o %MEM | head -20
    ps -eo pid,comm,%mem --sort=-%mem | head -10
  2. 分析进程的内存使用情况

    pidstat -r -p 进程PID 1 5
    cat /proc/进程PID/status | grep Vm
  3. 检查是否存在内存泄漏

    • 监控进程内存使用的变化趋势
    • 分析应用程序的内存分配和释放
  4. 解决方案

    • 终止异常进程:kill 进程PID
    • 优化应用程序的内存管理
    • 增加系统内存
    • 配置内存限制:ulimit -m 内存大小 或使用cgroups

案例3:僵尸进程问题排查

场景:系统中存在大量僵尸进程,占用系统资源。

排查步骤

  1. 查找僵尸进程

    ps -ef | grep defunct
    ps -eo pid,stat,comm | grep Z
  2. 查看僵尸进程的父进程

    ps -ef | grep 僵尸进程PID
    # 第二列是父进程PID
  3. 分析父进程

    • 检查父进程是否正常运行
    • 检查父进程是否正确处理子进程的退出
  4. 解决方案

    • 重启父进程:systemctl restart 服务名
    • 终止父进程:kill 父进程PID(谨慎使用)
    • 修复应用程序,确保正确处理子进程的退出

课后练习

  1. 基础练习

    • 使用ps命令查看系统中的进程
    • 使用top命令监控进程的资源使用情况
    • 使用pstree命令查看进程树结构
    • 使用pgrep命令查找指定名称的进程
  2. 进阶练习

    • 编写一个脚本,定期检查CPU使用率最高的进程并记录日志
    • 使用pidstat命令分析进程的磁盘I/O使用情况
    • 使用strace命令跟踪进程的系统调用
    • 使用lsof命令查看进程的网络连接
  3. 综合练习

    • 分析一个系统性能下降问题,找出导致性能下降的进程
    • 设计一个进程监控方案,包括异常进程检测和告警

总结

本集教程详细介绍了Linux系统中的进程监控工具,包括:

  • 进程查看工具pspgreppstree
  • 进程动态监控工具tophtopatop
  • 进程资源监控工具pidstatpsutil
  • 进程分析工具stracelsof
  • 高级进程监控工具Glances、Prometheus + Grafana

通过掌握这些工具,系统管理员可以及时发现和解决进程相关问题,确保系统的稳定运行。在实际应用中,应根据具体场景选择合适的监控工具,并结合定期检查和自动化监控,建立完善的进程监控体系。

进程监控是系统管理的重要组成部分,定期的进程监控和维护可以提高系统性能,避免因进程问题导致的服务中断和业务损失。

« 上一篇 网络监控工具 下一篇 » 系统性能分析