ITPub博客

首页 > 应用开发 > IT综合 > Linux进程监控进阶:从基础命令到专业级诊断

Linux进程监控进阶:从基础命令到专业级诊断

投稿 IT综合 作者:bhluo 时间:2025-12-23 16:26:18 0 删除 编辑

# Linux进程监控进阶:从基础命令到专业级诊断


## 基础监控:ps命令的深度使用


`ps`命令是进程监控的起点,但多数用户只了解其表面功能。实际上,`ps`支持多种输出格式和筛选条件,能满足不同的监控需求:


```bash

# 基础进程查看

ps aux                     # BSD风格,显示所有用户进程

ps -ef                     # UNIX风格,显示完整格式


# 按CPU或内存排序

ps aux --sort=-%cpu | head -10     # CPU使用率最高的10个进程

ps aux --sort=-%mem | head -10     # 内存使用最高的10个进程


# 树状显示进程关系

ps auxf                     # 显示进程树结构

ps -ejH                     # 显示进程层级(包括线程)


# 自定义输出格式

ps -eo pid,ppid,cmd,%cpu,%mem,etime --sort=-%cpu

# 输出:PID、父PID、命令、CPU%、内存%、运行时间


# 特定进程筛选

ps -C nginx                 # 按进程名筛选

ps -p 1234,5678             # 按PID筛选

ps -U www-data              # 按用户筛选

```


理解进程状态标志对于诊断至关重要:

```bash

# 查看进程状态

ps aux | awk '{print $8}' | sort | uniq -c

# 常见状态:

# R - 运行中

# S - 睡眠中(可中断)

# D - 不可中断睡眠(通常涉及I/O)

# Z - 僵尸进程

# T - 已停止


# 查找僵尸进程

ps aux | awk '$8=="Z" {print $0}'

```


## 实时监控:top与htop的高级技巧


`top`命令提供实时系统概览,但通过配置可以发挥更大作用:


```bash

# 启动top时按特定排序

top -o %CPU                # 按CPU排序

top -o %MEM                # 按内存排序


# 在top交互模式中的实用命令

# 按数字1:显示所有CPU核心使用情况

# Shift + H:显示线程(而非进程)

# c:显示完整命令路径

# M:按内存使用排序

# P:按CPU使用排序


# 批处理模式,适合脚本调用

top -b -n 1 | grep "nginx"  # 单次运行并筛选


# 保存top配置到~/.toprc

# 交互模式下按Shift + W保存当前配置

```


`htop`作为`top`的增强版,提供了更友好的界面:


```bash

# 安装htop(如未安装)

sudo apt install htop      # Ubuntu/Debian

sudo yum install htop      # CentOS/RHEL


# htop实用功能

# F2:进入设置菜单

# F4:进程筛选(如输入"java"只显示Java进程)

# F5:树状显示进程关系

# F6:选择排序字段

# 空格:标记进程,可批量操作

# F9:向标记进程发送信号


# 命令行参数

htop -u www-data          # 只显示指定用户进程

htop -p 1234,5678         # 只显示指定PID

htop -d 10                # 设置刷新间隔为10秒

```


## 专业级监控:pidstat的全面解析


`pidstat`是`sysstat`工具包的一部分,提供详细的进程级统计:


```bash

# 安装sysstat

sudo apt install sysstat   # Ubuntu/Debian

sudo yum install sysstat   # CentOS/RHEL


# 启动数据收集(如果需要)

sudo systemctl enable sysstat

sudo systemctl start sysstat


# 基本用法

pidstat                   # 默认显示CPU统计

pidstat -d               # 显示I/O统计

pidstat -r               # 显示内存统计

pidstat -w               # 显示上下文切换统计


# 综合监控示例

pidstat -urd -h -p 1234 2 5

# 参数解释:

# -u: CPU使用率

# -r: 内存使用

# -d: 磁盘I/O

# -h: 人类可读格式

# -p: 指定PID

# 2: 间隔2秒

# 5: 输出5次


# 监控所有进程的CPU使用

pidstat -u 1 3            # 每秒1次,共3次


# 监控特定进程的I/O

pidstat -d -p 5678 2      # 每2秒监控一次PID 5678的I/O


# 线程级监控

pidstat -t -p 1234        # 显示进程的所有线程统计

```


## 进程I/O监控:iotop与iotop


对于I/O密集型应用,需要专门的工具监控:


```bash

# 安装iotop

sudo apt install iotop    # Ubuntu/Debian

sudo yum install iotop    # CentOS/RHEL


# 基本使用

sudo iotop                # 需要root权限

# 按o:只显示有I/O活动的进程

# 按p:显示线程而非进程

# 按a:显示累计I/O


# 批处理模式

sudo iotop -b -n 5 -d 2   # 非交互模式,每2秒刷新,共5次


# 特定进程监控

sudo iotop -p 1234        # 只监控指定PID

```


## 进程网络活动监控


网络活动也是进程监控的重要部分:


```bash

# 使用lsof查看进程打开的文件和网络连接

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

lsof -i :80               # 查看使用80端口的进程

lsof -u www-data          # 查看用户打开的文件


# 使用netstat或ss

ss -tulpn | grep :80      # 查看80端口进程

netstat -tulpn | grep java


# 使用nethogs按进程监控带宽

sudo apt install nethogs  # 安装

sudo nethogs eth0         # 监控eth0接口

```


## 进程资源限制与cgroup监控


现代Linux系统使用cgroup进行资源控制:


```bash

# 查看进程的cgroup信息

cat /proc/1234/cgroup     # 查看特定进程的cgroup

<"vo.rycdn.cn"><"mf9.rycdn.cn"><"flf.rycdn.cn">


# systemd管理的进程

systemd-cgls              # 显示cgroup树

systemd-cgtop             # 类似top的cgroup监控


# 查看cgroup内存使用

cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.usage_in_bytes


# 使用cgget查询cgroup参数

cgget -g memory,cpu:system.slice/nginx.service

```


## 性能问题诊断实战


结合多个工具进行问题诊断:


```bash

# 场景:诊断CPU使用率过高

# 步骤1:快速定位

ps aux --sort=-%cpu | head -5


# 步骤2:详细分析

pidstat -u 1 5 -p <高CPU进程PID>


# 步骤3:查看上下文切换

pidstat -w 1 5 -p <PID>


# 步骤4:如果怀疑I/O等待

pidstat -d 1 5 -p <PID>

iotop -p <PID> -b -n 3 -d 1


# 场景:诊断内存泄漏

# 步骤1:监控内存增长

pidstat -r 30 10 -p <PID>


# 步骤2:检查虚拟内存

cat /proc/<PID>/status | grep Vm


# 步骤3:监控swap使用

pidstat -r | grep <进程名>

```


## 自动化监控脚本示例


创建自定义监控脚本:


```bash

#!/bin/bash

# 进程监控脚本

MONITOR_PID=$1

LOG_FILE="/tmp/process_monitor_${MONITOR_PID}.log"

INTERVAL=5

COUNT=10


echo "开始监控进程 $MONITOR_PID" > $LOG_FILE

echo "时间戳,PID,CPU%,内存%,线程数,读取KB/s,写入KB/s" >> $LOG_FILE


for i in $(seq 1 $COUNT); do

    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

    # 获取进程统计

    STATS=$(pidstat -u -r -d -h -p $MONITOR_PID 1 1 | tail -2 | head -1)

<"kltyzx.rycdn.cn"><"baby.rycdn.cn"><"inch.rycdn.cn"><"wall.rycdn.cn">

    

    # 解析数据

    CPU=$(echo $STATS | awk '{print $7}')

    MEM=$(echo $STATS | awk '{print $9}')

    THREADS=$(ps -L -p $MONITOR_PID | wc -l)

    READ_KB=$(echo $STATS | awk '{print $12}')

    WRITE_KB=$(echo $STATS | awk '{print $13}')

    

    echo "$TIMESTAMP,$MONITOR_PID,$CPU,$MEM,$THREADS,$READ_KB,$WRITE_KB" >> $LOG_FILE

    

    sleep $INTERVAL

done


echo "监控完成,结果保存在 $LOG_FILE"

```


## 高级技巧与最佳实践


1. **长期监控与数据收集**

```bash

# 使用sar收集历史数据

sar -u 1 10              # CPU使用率,每秒1次共10次

sar -r 1 10              # 内存使用率

sar -d 1 10              # 磁盘I/O


# 查看历史数据

sar -f /var/log/sa/sa15  # 查看15号的数据

```


2. **进程状态深度解析**

```bash

# 查看进程的/proc信息

ls -la /proc/1234/       # 进程详情目录

cat /proc/1234/stat      # 进程状态信息

cat /proc/1234/io        # 进程I/O统计

cat /proc/1234/smaps     # 内存映射详情

```


3. **性能基准测试**

```bash

# 使用time命令测量进程执行时间

/usr/bin/time -v ls -l   # 详细资源使用统计


# 测量命令执行时间

time (for i in {1..1000}; do echo $i > /dev/null; done)

```


## 总结


从基础的`ps`命令到专业的`pidstat`工具,Linux提供了多层次的进程监控方案。有效的进程管理需要:


1. **选择合适的工具**:根据需求选择从简单到专业的工具链

2. **理解监控指标**:CPU、内存、I/O、上下文切换等指标的实际意义

3. **建立监控体系**:结合实时监控和历史数据分析

4. **掌握诊断流程**:系统化的方法定位性能问题


通过熟练掌握这些工具和技巧,可以快速识别系统瓶颈,优化资源使用,确保服务的稳定性和性能。记住,最好的监控工具是那些你真正理解并能灵活运用的工具。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3106004/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933956