2025-11-21 Linux进程监控进阶指南:从基础命令到性能分析实战

在Linux系统管理和性能优化中,进程监控是核心技能之一。本文将深入探讨从基础的ps命令到高级的pidstat工具,全面解析进程监控的进阶技巧和实战应用。

## 基础进程监控命令深度解析

### ps命令的进阶用法

ps命令是进程监控的基础,但多数用户只了解其表面功能。

```bash

# 查看完整的进程树结构

ps -ef --forest

# 显示进程的线程信息

ps -eLf

# 按内存使用排序

ps aux --sort=-%mem | head -10

# 按CPU使用排序 

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

# 显示特定用户的进程

ps -u www-data -o pid,ppid,cmd,%mem,%cpu --sort=-%cpu

# 自定义输出格式

ps -eo pid,ppid,user,pmem,pcpu,psr,comm --sort=-pcpu | head -15

```

### 实时进程监控脚本

创建自定义的实时监控脚本,超越top命令的基础功能。

```bash

#!/bin/bash

# advanced_process_monitor.sh

INTERVAL=2

MAX_LINES=20

echo "实时进程监控 - 刷新间隔: ${INTERVAL}秒"

echo "按 Ctrl+C 退出"

echo

while true; do

    clear


    # 显示系统概览

    echo "=== 系统概览 ==="

    uptime

    echo "内存: <"video.maicaixia.cn">$(free -h | awk 'NR==2{print $3"/"$2}')"

    echo "负载: $(cat /proc/loadavg)"

    echo


    # 显示CPU使用前10的进程

    echo "=== CPU使用TOP10 ==="

    ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -11


    echo


    # 显示内存使用前10的进程 

    echo "=== 内存使用TOP10 ==="

    ps -eo pid,ppid,user,%mem,%cpu,comm --sort=-%mem | head -11


    echo


    # 显示I/O等待进程

    echo "=== I/O等待进程 ==="

    ps -eo pid,user,comm,state --sort=-pid | grep -E "(D|UNINTERRUPTIBLE)" | head -5


    sleep $INTERVAL

done

```

## 高级进程监控工具

### pidstat全面解析

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

```bash

# 安装sysstat

# Ubuntu/Debian: sudo apt-get install sysstat

# CentOS/RHEL: sudo yum install sysstat

# 基本用法:每2秒采样一次,共5次

pidstat 2 5

# 监控特定进程

pidstat -p 1234 2 5

# 详细的CPU统计

pidstat -u 1 5

# 内存使用统计

pidstat -r 1 5

# I/O统计

pidstat -d 1 5

# 上下文切换统计

pidstat -w 1 5

# 综合监控:CPU、内存、IO

pidstat -urd 1 5

# 按命令名监控所有同名进程

pidstat -C nginx 1 3

```

### pidstat高级监控脚本

```bash

#!/bin/bash

# comprehensive_pidstat_monitor.sh

MONITOR_PID=${1}

INTERVAL=2

COUNT=30

if [ -z "$MONITOR_PID" ]<"ml0odf9.maicaixia.cn">; then

    echo "用法: $0 <PID>"

    echo "示例: $0 1234"

    exit 1

fi

echo "开始监控进程 $MONITOR_PID,间隔 ${INTERVAL}秒,共 ${COUNT} 次采样"

echo "时间戳 | CPU% | 内存% | 读KB/s | 写KB/s | 线程数 | 主要线程状态"

echo "----------------------------------------------------------------"

# 综合监控循环

pidstat -p $MONITOR_PID -urd -h $INTERVAL $COUNT | \

awk -v pid=$MONITOR_PID '

NR>3 {

    if ($3 == pid) {

        timestamp = $1 " " $2

        cpu = $7

        mem = $8

        kbrd = $9

        kbwr = $10

        threads = "N/A"

        state = "N/A"


        # 获取线程信息

        "ps -L -p " pid " -o state | grep -v STATE | head -5" | getline thread_states

        close("ps -L -p " pid " -o state | grep -v STATE | head -5")


        if (thread_states != "") {

            state = thread_states

        }


        printf "%-15s | %5s | %5s | %7s | %7s | %7s | %s\n",

              timestamp, cpu, mem, kbrd, kbwr, threads, state

    }

}'

```

## 进程性能深度分析

### 线程级监控

现代应用多为多线程,需要线程级别的监控。

```bash

# 查看进程的线程信息

ps -T -p <PID>

# 使用pidstat监控线程

pidstat -t -p <PID> 1 5

# 使用top监控特定进程的线程

top -H -p <PID>

# 自定义线程监控脚本

#!/bin/bash

# thread_monitor.sh

PID=$1

INTERVAL=2

if [ -z "$PID" ]; then

    echo "请提供进程PID"

    exit 1

fi

echo "监控进程 $PID 的线程,刷新间隔: ${INTERVAL}秒"

echo "按 Ctrl+C 退出"

echo

while true; do

    clear

    echo "=== 进程 $PID 线程状态 ==="


    # 显示线程详情

    ps -T -p $PID -o pid,tid,pcpu,pmem,state,comm


    echo

    echo "=== 线程CPU使用排名 ==="

    ps -T -p $PID -o tid,pcpu <"flmnsvsqexff.maicaixia.cn">--sort=-pcpu | head -10


    echo

    echo "=== 线程状态统计 ==="

    ps -T -p $PID -o state --no-headers | sort | uniq -c


    sleep $INTERVAL

done

```

### 内存使用深度分析

```bash

# 查看进程详细内存映射

pmap -x <PID>

# 查看进程内存使用详情

cat /proc/<PID>/status | grep -E "(VmSize|VmRSS|VmData|VmStk|VmExe)"

# 内存监控脚本

#!/bin/bash

# memory_analysis.sh

PID=$1

if [ -z "$PID" ]; then

    echo "请提供进程PID"

    exit 1

fi

echo "=== 进程 $PID 内存分析 ==="

echo

# 基础内存信息

echo "1. 基础内存信息:"

ps -p $PID -o pid,ppid,comm,%mem,rss,vsz --no-headers

echo

echo "2. 详细内存状态:"

grep -E "(VmSize|VmRSS|VmData|VmStk|VmExe|VmPTE)" /proc/$PID/status

echo

echo "3. 内存映射:"

pmap -x $PID | tail -1

echo

echo "4. 内存使用趋势 (采样5次,间隔2秒):"

for i in {1..5}; do

    RSS=$(ps -p $PID -o rss --no-headers)

    VSZ=$(ps -p $PID -o vsz --no-headers)

    echo "采样 $i: RSS=<"kltyzx.maicaixia.cn">${RSS}KB, VSZ=${VSZ}KB"

    sleep 2

done

```

## 系统资源关联分析

### CPU与进程关联监控

```bash

# 监控每个CPU核心的使用情况

mpstat -P ALL 1 5

# 结合进程监控

#!/bin/bash

# cpu_core_analysis.sh

echo "=== CPU核心与进程关联分析 ==="

echo

# 显示CPU核心数

echo "CPU核心数: $(nproc)"

echo

# 监控各核心负载

echo "各CPU核心使用率:"

mpstat -P ALL 1 1 | grep -E "(CPU|all|[0-9]+)" | awk '{print "CPU" $2 ": " $3 "% 用户, " $4 "% 系统, " $5 "% 空闲"}'

echo

echo "=== 进程CPU亲和性 ==="

# 显示占用CPU最多的进程及其亲和性

ps -eo pid,ppid,comm,psr,pcpu --sort=-pcpu | head -10 | while read line; do

    PID=$(echo $line | awk '{print $1}')

    if [ "$PID" != "PID" ] && [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then

        AFFINITY=$(taskset -cp $PID 2>/dev/null | awk -F': ' '{print $2}')

        echo "$line | 亲和性: $AFFINITY"

    fi

done

```

### I/O性能分析

```bash

# 系统级I/O监控

iostat -x 1 3

# 进程级I/O监控

pidstat -d 1 5

# 深入I/O监控脚本

#!/bin/bash

# io_analysis.sh

INTERVAL=2

COUNT=10

echo "=== 系统I/O监控 ==="

echo "采样间隔: ${INTERVAL}秒, 采样次数: ${COUNT}"

echo

# 系统级I/O统计

echo "1. 系统I/O统计:"

iostat -x $INTERVAL $COUNT | tail -$((COUNT+1))

echo

echo "2. 进程I/O排名:"

pidstat -dl 1 1 |<"baby.maicaixia.cn"> sort -k6 -nr | head -10

echo

echo "3. 块设备详细统计:"

cat /proc/diskstats | head -10

```

## 实战案例:性能问题诊断

### 高CPU使用诊断

```bash

#!/bin/bash

# high_cpu_diagnosis.sh

echo "=== 高CPU使用诊断 ==="

echo

# 找出CPU使用最高的进程

echo "1. CPU使用TOP5进程:"

ps -eo pid,ppid,user,pcpu,pmem,comm --sort=-pcpu | head -6

echo

echo "2. 这些进程的详细状态:"

ps -eo pid,ppid,user,pcpu,pmem,comm --sort=-pcpu | head -6 | tail -5 | while read line; do

    PID=$(echo $line | awk '{print $1}')

    if [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then

        echo "进程 $PID 详情:"

        # 显示进程状态

        ps -p $PID -o state,psr --no-headers | awk '{print "  状态: "$1", 运行CPU: "$2}'

        # 显示线程数

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

        echo "  线程数: $((THREADS-1))"

        # 显示系统调用

        echo "  最近系统调用:"

        strace -c -p $PID 2>&1 | head -5 | tail -3

        echo

    fi

done

echo "3. 系统负载分析:"

echo "  运行队列长度: $(vmstat 1 2 | tail -1 | awk '{print $1}')"

echo "  上下文切换率: $(vmstat 1 2 | tail -1 | awk '{print $12}')/秒"

```

### 内存泄漏诊断

```bash

#!/bin/bash

# memory_leak_diagnosis.sh

echo "=== 内存泄漏诊断工具 ==="

echo

# 监控内存使用增长最快的进程

echo "1. 内存增长监控 (采样3次,间隔5秒):"

for i in {1..3}; do

    echo "采样 $i:"

    ps -eo pid,ppid,comm,rss <"inch.maicaixia.cn">--sort=-rss | head -10

    echo "---"

    sleep 5

done

echo

echo "2. 内存使用异常进程:"

ps -eo pid,ppid,comm,rss,vsz --sort=-rss | head -10 | while read line; do

    PID=$(echo $line | awk '{print $1}')

    RSS=$(echo $line | awk '{print $4}')

    VSZ=$(echo $line | awk '{print $5}')


    if [ "$PID" != "PID" ] && [ -n "$PID" ] && [ "$PID" -eq "$PID" ] 2>/dev/null; then

        # 计算RSS/VSZ比率

        if [ $VSZ -ne 0 ]; then

            RATIO=$(( (RSS * 100) / VSZ ))

            if [ $RATIO -gt 80 ]; then

                echo "警告: 进程 $PID RSS/VSZ 比率过高: $RATIO%"

            fi

        fi

    fi

done

echo

echo "3. 系统内存状态:"

free -h

echo

echo "4. 内存详细统计:"

cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|Buffers|Cached)"

```

## 自动化监控系统

### 进程监控守护脚本

```bash

#!/bin/bash

# process_monitor_daemon.sh

CONFIG_FILE="process_monitor.conf"

LOG_FILE="process_monitor.log"

ALERT_THRESHOLD_CPU=80

ALERT_THRESHOLD_MEM=70

# 读取配置

load_config() {

    if [ -f "$CONFIG_FILE" ]; then

        source "$CONFIG_<"wall.maicaixia.cn">FILE"

    fi

}

# 监控循环

monitor_loop() {

    while true; do

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


        # 监控关键进程

        ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -20 | while read line; do

            PID=$(echo $line | awk '{print $1}')

            CPU=$(echo $line | awk '{print $4}')

            MEM=$(echo $line | awk '{print $5}')

            COMM=$(echo $line | awk '{print $6}')


            # 跳过标题行

            if [ "$PID" = "PID" ] || [ -z "$PID" ]; then

                continue

            fi


            # 检查阈值

            if (( $(echo "$CPU > $ALERT_THRESHOLD_CPU" | bc -l) )); then

                log_alert "HIGH_CPU" "$PID:$COMM" "$CPU%"

            fi


            if (( $(echo "$MEM > $ALERT_THRESHOLD_MEM" | bc -l) )); then

                log_alert "HIGH_MEM" "$PID:$COMM" "$MEM%"

            fi

        done


        sleep 30

    done

}

# 日志记录

log_alert() {

    local alert_type=$1

    local target=$2

    local value=$3


    local message="[$TIMESTAMP] $alert_type - $target - $value"

    echo "$message" >> "$LOG_FILE"


    # 这里可以添加邮件、短信等告警方式

    echo "ALERT: $message"

}

# 主函数

main() {

    load_config

    echo "启动进程监控守护进程..."

    echo "CPU告警阈值: ${ALERT_THRESHOLD_CPU}%"

    echo "内存告警阈值: ${ALERT_THRESHOLD_MEM}%"

    echo "日志文件: $LOG_FILE"


    monitor_loop

}

# 启动

main "$@"

```

### 性能报告生成

```bash

#!/bin/bash

# performance_report.sh

REPORT_FILE=<"xyz.maicaixia.cn">"performance_report_$(date +%Y%m%d_%H%M%S).txt"

generate_report() {

    {

        echo "=== 系统性能报告 ==="

        echo "生成时间: $(date)"

        echo


        echo "=== 系统概览 ==="

        uptime

        echo "运行时间: $(uptime -p)"

        echo


        echo "=== 内存使用 ==="

        free -h

        echo


        echo "=== CPU使用TOP10 ==="

        ps -eo pid,ppid,user,%cpu,%mem,comm --sort=-%cpu | head -11

        echo


        echo "=== 内存使用TOP10 ==="

        ps -eo pid,ppid,user,%mem,%cpu,comm --sort=-%mem | head -11

        echo


        echo "=== I/O统计 ==="

        pidstat -dl 1 1 | head -20

        echo


        echo "=== 系统负载详情 ==="

        mpstat -P ALL 1 1

        echo


        echo "=== 网络连接统计 ==="

        netstat -s | head -20


    } > "$REPORT_FILE"


    echo "报告已生成: $REPORT_FILE"

}

# 生成报告

generate_report

```

## 最佳实践总结

### 监控策略建议

1. **分层监控**:从系统级到进程级再到线程级

2. **多维度采集**:CPU、内存、I/O、网络等全面监控

3. **趋势分析**:不仅关注瞬时值,更要分析变化趋势

4. **自动化告警**:设置合理的阈值和告警机制

### 常用命令组合

```bash

# 快速系统检查

quick_check() {

    echo "CPU负载: $(uptime | awk -F'load average:' '{print $2}')"

    echo "内存使用: $(free -h | awk 'NR==2{print $3"/"$2}')"

    echo "磁盘使用: $(df -h / | awk 'NR==2{print $3"/"$2" ("$5")"}')"

    echo "高CPU进程:"

    ps -eo pid,comm,%cpu --sort=-%cpu | head -5

}

# 进程详情查询

process_detail() {

    local pid=$1

    echo "进程详情 PID: $pid"

    echo "命令行: $(ps -p $pid -o comm --no-headers)"

    echo "状态: $(ps -p $pid -o state --no-headers)"

    echo "CPU: $(ps -p $pid -o %cpu --no-headers)%"

    echo "内存: $(ps -p $pid -o %mem --no-headers)%"

    echo "线程数: $(ps -L -p $pid | wc -l)"

}

```

通过掌握这些进阶的进程监控技巧,系统管理员可以更快速、更准确地诊断性能问题,优化系统资源使用,确保服务的稳定性和性能。从基础的ps命令到高级的pidstat工具,构建完整的进程监控体系是Linux系统管理的核心能力。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容