Linux 性能监控三板斧:top/vmstat/iostat 快速入门

1. 引言

在 Linux 系统管理和故障排查过程中,性能监控是至关重要的技能。掌握核心监控工具能够帮助系统管理员快速定位性能瓶颈,及时解决系统问题。本文将详细介绍三个最常用且强大的性能监控工具:top、vmstat 和 iostat,通过详细的步骤和实际案例,帮助初学者快速掌握这些工具的使用方法。

2. 环境准备与工具安装

2.1 系统环境检查

首先确认您的 Linux 系统环境,大多数现代 Linux 发行版都预装了这些工具,但某些最小化安装可能需要手动安装。

创建检查脚本文件:check_environment.sh

bash 复制代码
#!/bin/bash

# 检查系统信息
echo "=== 系统信息 ==="
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"

# 检查工具是否已安装
echo -e "\n=== 工具检查 ==="
tools=("top" "vmstat" "iostat")

for tool in "${tools[@]}"; do
    if command -v $tool &> /dev/null; then
        echo "✓ $tool 已安装: $(which $tool)"
    else
        echo "✗ $tool 未安装"
    fi
done

# 检查系统负载
echo -e "\n=== 系统负载 ==="
echo "当前时间: $(date)"
echo "运行时间: $(uptime | awk -F'load average:' '{print $1}')"
echo "系统负载: $(uptime | awk -F'load average:' '{print $2}')"

运行检查脚本:

bash 复制代码
chmod +x check_environment.sh
./check_environment.sh

2.2 工具安装

如果系统中缺少某些工具,使用以下命令安装:

对于 Ubuntu/Debian 系统:

bash 复制代码
sudo apt update
sudo apt install procps sysstat -y

对于 CentOS/RHEL 系统:

bash 复制代码
sudo yum install procps-ng sysstat -y
# 或者对于较新版本使用:
sudo dnf install procps-ng sysstat -y

3. top 命令详解

3.1 top 基础使用

top 命令是 Linux 中最常用的实时系统监控工具,可以动态查看系统整体性能和各个进程的资源占用情况。

创建监控脚本:basic_top_monitor.sh

bash 复制代码
#!/bin/bash

echo "启动基础 top 监控..."
echo "按 'q' 退出监控"

# 启动 top 命令
top -b -n 1 | head -20

运行脚本:

bash 复制代码
chmod +x basic_top_monitor.sh
./basic_top_monitor.sh

3.2 top 输出详解

top 命令的输出分为两个部分:系统概览区和进程列表区。

系统概览区解读:

  • 第一行:系统时间、运行时间、用户数、平均负载
  • 第二行:进程总数(运行中、睡眠中、停止、僵尸)
  • 第三行:CPU 使用情况(用户空间、系统内核、空闲等)
  • 第四行:内存使用情况(总内存、空闲、已使用、缓冲)
  • 第五行:交换分区使用情况

创建详细的 top 解析脚本:detailed_top_analysis.sh

bash 复制代码
#!/bin/bash

echo "=== 详细 top 分析 ==="
echo "采集系统状态数据..."

# 采集 top 输出并保存到临时文件
top -b -n 1 > /tmp/top_output.txt

echo -e "\n--- 系统概览 ---"
head -5 /tmp/top_output.txt

echo -e "\n--- 进程资源占用 TOP 10 ---"
sed -n '7,17p' /tmp/top_output.txt

echo -e "\n--- 关键指标解释 ---"
cat << 'EOF'
关键指标说明:
1. load average: 系统1分钟、5分钟、15分钟的平均负载
2. %Cpu(s): 
   - us: 用户空间CPU占用
   - sy: 内核空间CPU占用  
   - id: CPU空闲时间
   - wa: IO等待时间
3. KiB Mem:
   - total: 总内存
   - free: 空闲内存
   - used: 已用内存
   - buff/cache: 缓冲/缓存内存
EOF

# 清理临时文件
rm -f /tmp/top_output.txt

3.3 top 交互命令

在 top 运行界面中,可以使用以下交互命令:

bash 复制代码
# 启动交互式 top
top

# 交互命令参考:
# h - 显示帮助
# 1 - 显示每个CPU核心的使用情况
# M - 按内存使用排序
# P - 按CPU使用排序
# T - 按运行时间排序
# k - 结束指定进程
# r - 重新设置进程优先级
# z - 彩色/黑白显示切换
# W - 保存当前配置

3.4 top 高级用法

创建高级监控脚本:advanced_top_monitor.sh

bash 复制代码
#!/bin/bash

echo "=== top 高级监控 ==="
echo "监控周期: 30秒"
echo "输出文件: /tmp/top_monitor.log"

# 监控30秒,每2秒采样一次
top -b -d 2 -n 15 > /tmp/top_monitor.log &

echo "监控进行中..."
sleep 30

echo -e "\n=== 监控结果分析 ==="
echo "总采样次数: $(grep -c "top -" /tmp/top_monitor.log)"

# 分析CPU使用率
echo -e "\n--- CPU 使用率统计 ---"
grep "%Cpu(s)" /tmp/top_monitor.log | awk '
BEGIN { count=0; us_sum=0; sy_sum=0; id_sum=0 }
{
    us_sum += $2; 
    sy_sum += $4; 
    id_sum += $8; 
    count++
}
END {
    printf "平均用户空间CPU: %.2f%%\n", us_sum/count
    printf "平均内核空间CPU: %.2f%%\n", sy_sum/count  
    printf "平均空闲CPU: %.2f%%\n", id_sum/count
}'

# 分析内存使用
echo -e "\n--- 内存使用统计 ---"
grep "MiB Mem" /tmp/top_monitor.log | awk '
BEGIN { count=0; total_sum=0; free_sum=0; used_sum=0 }
{
    total_sum += $4; 
    free_sum += $6; 
    used_sum += $8; 
    count++
}
END {
    printf "平均总内存: %.2f MiB\n", total_sum/count
    printf "平均空闲内存: %.2f MiB\n", free_sum/count
    printf "平均已用内存: %.2f MiB\n", used_sum/count
    printf "平均内存使用率: %.2f%%\n", (used_sum/total_sum)*100
}'

4. vmstat 命令详解

4.1 vmstat 基础使用

vmstat 用于报告虚拟内存统计信息,可以监控进程、内存、分页、块IO、陷阱和CPU活动。

创建 vmstat 监控流程图

graph TD A[启动vmstat监控] --> B{选择监控模式}; B -->|一次性快照| C[vmstat 1]; B -->|定时监控| D[vmstat 间隔 次数]; B -->|详细模式| E[vmstat -s]; C --> F[分析系统当前状态]; D --> G[收集时间序列数据]; E --> H[查看详细统计信息]; F --> I[识别性能瓶颈]; G --> I; H --> I; I --> J[生成监控报告]; style A fill:#2d5c7a,color:white style B fill:#4e7ea1,color:white style C fill:#2d5c7a,color:white style D fill:#2d5c7a,color:white style E fill:#2d5c7a,color:white style F fill:#4e7ea1,color:white style G fill:#4e7ea1,color:white style H fill:#4e7ea1,color:white style I fill:#7a2d2d,color:white style J fill:#a14e4e,color:white

创建基础 vmstat 监控脚本:basic_vmstat.sh

bash 复制代码
#!/bin/bash

echo "=== vmstat 基础监控 ==="
echo "显示系统虚拟内存统计信息"

# 显示一次系统状态
echo -e "\n--- 当前系统状态 ---"
vmstat

echo -e "\n--- 带时间戳的监控(5次,间隔2秒)---"
vmstat -t 2 5

echo -e "\n--- 详细内存统计 ---"
vmstat -s

4.2 vmstat 输出字段详解

创建 vmstat 字段解析脚本:vmstat_field_analysis.sh

bash 复制代码
#!/bin/bash

echo "=== vmstat 输出字段详细解析 ==="

cat << 'EOF'
Procs(进程):
  r: 运行队列中的进程数
  b: 处于不可中断睡眠状态的进程数

Memory(内存):
  swpd: 使用的虚拟内存大小
  free: 空闲物理内存大小  
  buff: 用作缓冲的内存大小
  cache: 用作缓存的内存大小

Swap(交换分区):
  si: 从磁盘交换到内存的数据量(KB/s)
  so: 从内存交换到磁盘的数据量(KB/s)

IO(块设备):
  bi: 从块设备接收的块数(块/s)
  bo: 发送到块设备的块数(块/s)

System(系统):
  in: 每秒中断次数
  cs: 每秒上下文切换次数

CPU(中央处理器):
  us: 用户进程占用CPU时间百分比
  sy: 内核进程占用CPU时间百分比  
  id: 空闲CPU时间百分比
  wa: 等待IO的CPU时间百分比
  st: 虚拟机偷取时间百分比
EOF

echo -e "\n=== 实际监控示例 ==="
echo "监控10秒,每秒采样一次..."
vmstat 1 10

4.3 vmstat 高级监控

创建高级 vmstat 监控脚本:advanced_vmstat_monitor.sh

bash 复制代码
#!/bin/bash

MONITOR_DURATION=30
INTERVAL=2
COUNT=$((MONITOR_DURATION / INTERVAL))

echo "=== vmstat 高级监控 ==="
echo "监控时长: ${MONITOR_DURATION} 秒"
echo "采样间隔: ${INTERVAL} 秒"
echo "采样次数: ${COUNT} 次"

# 创建监控日志文件
LOG_FILE="/tmp/vmstat_monitor_$(date +%Y%m%d_%H%M%S).log"
echo "日志文件: ${LOG_FILE}"

echo -e "\n开始监控..." | tee -a ${LOG_FILE}
vmstat -t ${INTERVAL} ${COUNT} | tee -a ${LOG_FILE}

echo -e "\n=== 监控数据分析 ===" | tee -a ${LOG_FILE}

# 分析运行队列
echo -e "\n--- 运行队列分析 ---" | tee -a ${LOG_FILE}
awk 'NR>2 {sum_r+=$1; max_r=($1>max_r)?$1:max_r} END {
    printf "平均运行队列长度: %.2f\n", sum_r/(NR-2)
    printf "最大运行队列长度: %d\n", max_r
}' ${LOG_FILE} | tee -a ${LOG_FILE}

# 分析内存使用
echo -e "\n--- 内存使用分析 ---" | tee -a ${LOG_FILE}
awk 'NR>2 {sum_swpd+=$3; sum_free+=$4; sum_buff+=$5; sum_cache+=$6} END {
    count=NR-2
    printf "平均虚拟内存使用: %.2f KB\n", sum_swpd/count
    printf "平均空闲内存: %.2f KB\n", sum_free/count
    printf "平均缓冲内存: %.2f KB\n", sum_buff/count
    printf "平均缓存内存: %.2f KB\n", sum_cache/count
}' ${LOG_FILE} | tee -a ${LOG_FILE}

# 分析CPU使用率
echo -e "\n--- CPU 使用率分析 ---" | tee -a ${LOG_FILE}
awk 'NR>2 {sum_us+=$13; sum_sy+=$14; sum_id+=$15; sum_wa+=$16} END {
    count=NR-2
    printf "平均用户CPU: %.2f%%\n", sum_us/count
    printf "平均系统CPU: %.2f%%\n", sum_sy/count
    printf "平均空闲CPU: %.2f%%\n", sum_id/count
    printf "平均等待IO CPU: %.2f%%\n", sum_wa/count
}' ${LOG_FILE} | tee -a ${LOG_FILE}

echo -e "\n详细监控日志已保存至: ${LOG_FILE}"

5. iostat 命令详解

5.1 iostat 基础使用

iostat 用于监控系统输入输出设备和CPU的使用情况,特别适合分析磁盘IO性能问题。

创建 iostat 监控流程图

graph LR A[启动iostat监控] --> B{监控目标选择}; B --> C[CPU监控]; B --> D[设备监控]; B --> E[分区监控]; C --> F[iostat -c]; D --> G[iostat -d]; E --> H[iostat -p]; F --> I[CPU使用分析]; G --> J[设备IO分析]; H --> K[分区IO分析]; I --> L[性能报告]; J --> L; K --> L; style A fill:#2d5c7a,color:white style B fill:#4e7ea1,color:white style C fill:#2d5c7a,color:white style D fill:#2d5c7a,color:white style E fill:#2d5c7a,color:white style F fill:#4e7ea1,color:white style G fill:#4e7ea1,color:white style H fill:#4e7ea1,color:white style I fill:#7a2d2d,color:white style J fill:#7a2d2d,color:white style K fill:#7a2d2d,color:white style L fill:#a14e4e,color:white

创建基础 iostat 监控脚本:basic_iostat.sh

bash 复制代码
#!/bin/bash

echo "=== iostat 基础监控 ==="

echo -e "\n--- CPU 使用情况报告 ---"
iostat -c

echo -e "\n--- 设备使用情况报告 ---"
iostat -d

echo -e "\n--- 显示扩展统计信息 ---"
iostat -x

echo -e "\n--- 显示设备使用率和扩展统计 ---"
iostat -dx

echo -e "\n--- 定时监控(3次,间隔2秒)---"
iostat -dx 2 3

5.2 iostat 输出字段详解

创建 iostat 字段解析脚本:iostat_field_analysis.sh

bash 复制代码
#!/bin/bash

echo "=== iostat 输出字段详细解析 ==="

cat << 'EOF'
CPU 统计字段:
  %user: 用户级别CPU使用率
  %nice: nice优先级进程的CPU使用率
  %system: 系统级别CPU使用率
  %iowait: CPU等待IO的时间百分比
  %steal: 虚拟环境中的CPU偷取时间
  %idle: CPU空闲时间百分比

设备统计字段:
  rrqm/s: 每秒合并的读请求数
  wrqm/s: 每秒合并的写请求数
  r/s: 每秒完成的读请求数
  w/s: 每秒完成的写请求数
  rkB/s: 每秒读取的数据量(KB)
  wkB/s: 每秒写入的数据量(KB)
  avgrq-sz: 平均每次设备IO操作的数据量
  avgqu-sz: 平均IO队列长度
  await: 平均每次IO请求等待时间(毫秒)
  r_await: 读请求平均等待时间
  w_await: 写请求平均等待时间
  svctm: 平均每次IO请求的服务时间
  %util: 设备带宽使用率百分比
EOF

echo -e "\n=== 实际监控示例 ==="
echo "显示设备和CPU统计,每秒刷新,共5次..."
iostat -dxc 1 5

5.3 iostat 高级监控与分析

创建高级 iostat 监控脚本:advanced_iostat_monitor.sh

bash 复制代码
#!/bin/bash

MONITOR_DURATION=30
INTERVAL=2
COUNT=$((MONITOR_DURATION / INTERVAL))

echo "=== iostat 高级监控 ==="
echo "监控时长: ${MONITOR_DURATION} 秒"
echo "采样间隔: ${INTERVAL} 秒"
echo "采样次数: ${COUNT} 次"

# 创建监控日志文件
LOG_FILE="/tmp/iostat_monitor_$(date +%Y%m%d_%H%M%S).log"
echo "日志文件: ${LOG_FILE}"

echo -e "\n开始监控..." | tee -a ${LOG_FILE}
iostat -dxct ${INTERVAL} ${COUNT} | tee -a ${LOG_FILE}

echo -e "\n=== 监控数据分析 ===" | tee -a ${LOG_FILE}

# 提取设备名(排除loop设备)
DEVICES=$(iostat -d | awk 'NR>3 && $1 !~ /^loop/ {print $1}' | head -5)

for DEVICE in ${DEVICES}; do
    echo -e "\n--- 设备 ${DEVICE} 分析 ---" | tee -a ${LOG_FILE}
    
    # 分析读写吞吐量
    awk -v dev="${DEVICE}" '$1 == dev {
        read_sum+=$3; write_sum+=$4; 
        read_kb_sum+=$5; write_kb_sum+=$6;
        count++
    } END {
        if(count > 0) {
            printf "平均读操作: %.2f 次/秒\n", read_sum/count
            printf "平均写操作: %.2f 次/秒\n", write_sum/count
            printf "平均读取量: %.2f KB/秒\n", read_kb_sum/count
            printf "平均写入量: %.2f KB/秒\n", write_kb_sum/count
        }
    }' ${LOG_FILE} | tee -a ${LOG_FILE}
    
    # 分析IO延迟和利用率
    awk -v dev="${DEVICE}" '$1 == dev {
        util_sum+=$14; await_sum+=$10;
        count++
    } END {
        if(count > 0) {
            printf "平均设备利用率: %.2f%%\n", util_sum/count
            printf "平均IO等待时间: %.2f 毫秒\n", await_sum/count
        }
    }' ${LOG_FILE} | tee -a ${LOG_FILE}
done

# CPU使用率分析
echo -e "\n--- CPU 使用率分析 ---" | tee -a ${LOG_FILE}
awk '/^avg-cpu:/ {getline; user_sum+=$1; system_sum+=$3; iowait_sum+=$4; idle_sum+=$6; count++} 
END {
    printf "平均用户CPU: %.2f%%\n", user_sum/count
    printf "平均系统CPU: %.2f%%\n", system_sum/count
    printf "平均IO等待CPU: %.2f%%\n", iowait_sum/count
    printf "平均空闲CPU: %.2f%%\n", idle_sum/count
}' ${LOG_FILE} | tee -a ${LOG_FILE}

echo -e "\n详细监控日志已保存至: ${LOG_FILE}"

6. 综合性能监控实战

6.1 创建综合监控系统

创建综合监控脚本:comprehensive_monitor.sh

bash 复制代码
#!/bin/bash

DURATION=60
INTERVAL=5

echo "=== Linux 系统综合性能监控 ==="
echo "监控时长: ${DURATION} 秒"
echo "采样间隔: ${INTERVAL} 秒"
echo "开始时间: $(date)"

# 创建监控目录
MONITOR_DIR="/tmp/system_monitor_$(date +%Y%m%d_%H%M%S)"
mkdir -p ${MONITOR_DIR}

echo "监控数据目录: ${MONITOR_DIR}"

# 定义监控函数
start_monitoring() {
    echo -e "\n启动监控进程..."
    
    # top 监控
    top -b -d ${INTERVAL} -n $((DURATION / INTERVAL)) > ${MONITOR_DIR}/top.log &
    TOP_PID=$!
    
    # vmstat 监控
    vmstat -t ${INTERVAL} $((DURATION / INTERVAL)) > ${MONITOR_DIR}/vmstat.log &
    VMSTAT_PID=$!
    
    # iostat 监控
    iostat -dxct ${INTERVAL} $((DURATION / INTERVAL)) > ${MONITOR_DIR}/iostat.log &
    IOSTAT_PID=$!
    
    echo "监控进程已启动:"
    echo "Top PID: ${TOP_PID}"
    echo "Vmstat PID: ${VMSTAT_PID}"
    echo "Iostat PID: ${IOSTAT_PID}"
}

# 停止监控函数
stop_monitoring() {
    echo -e "\n停止监控进程..."
    kill ${TOP_PID} ${VMSTAT_PID} ${IOSTAT_PID} 2>/dev/null
    wait
    echo "所有监控进程已停止"
}

# 生成监控报告函数
generate_report() {
    echo -e "\n=== 生成监控报告 ==="
    
    REPORT_FILE="${MONITOR_DIR}/performance_report.txt"
    
    {
        echo "Linux 系统性能监控报告"
        echo "生成时间: $(date)"
        echo "监控时长: ${DURATION} 秒"
        echo "=========================================="
        
        echo -e "\n1. 系统负载分析"
        echo "------------------------------------------"
        grep "load average" ${MONITOR_DIR}/top.log | tail -5
        
        echo -e "\n2. CPU 使用率分析"
        echo "------------------------------------------"
        awk '/%Cpu/ {us_sum+=$2; sy_sum+=$4; id_sum+=$8; count++} 
        END {
            printf "平均用户CPU: %.2f%%\n", us_sum/count
            printf "平均系统CPU: %.2f%%\n", sy_sum/count
            printf "平均空闲CPU: %.2f%%\n", id_sum/count
        }' ${MONITOR_DIR}/top.log
        
        echo -e "\n3. 内存使用分析"
        echo "------------------------------------------"
        awk '/MiB Mem/ {total=$4; used=$8; count++} 
        END {
            if(count>0) printf "平均内存使用率: %.2f%%\n", (used/total)*100
        }' ${MONITOR_DIR}/top.log | tail -1
        
        echo -e "\n4. 进程资源占用 TOP 5"
        echo "------------------------------------------"
        echo "按CPU使用率排序:"
        grep -A 10 "PID USER" ${MONITOR_DIR}/top.log | head -11
        
        echo -e "\n5. 虚拟内存统计"
        echo "------------------------------------------"
        awk 'NR>2 {r_sum+=$1; b_sum+=$2; swpd_sum+=$3; free_sum+=$4; count++} 
        END {
            printf "平均运行队列: %.2f\n", r_sum/count
            printf "平均阻塞进程: %.2f\n", b_sum/count
            printf "平均虚拟内存: %.2f KB\n", swpd_sum/count
            printf "平均空闲内存: %.2f KB\n", free_sum/count
        }' ${MONITOR_DIR}/vmstat.log
        
        echo -e "\n6. 磁盘IO分析"
        echo "------------------------------------------"
        # 获取主要设备名
        DEVICE=$(iostat -d | awk 'NR>3 && $1 !~ /^loop/ {print $1; exit}')
        if [ -n "${DEVICE}" ]; then
            awk -v dev="${DEVICE}" '$1 == dev {
                util_sum+=$14; rkb_sum+=$5; wkb_sum+=$6; count++
            } END {
                if(count>0) {
                    printf "设备: %s\n", dev
                    printf "平均利用率: %.2f%%\n", util_sum/count
                    printf "平均读取: %.2f KB/秒\n", rkb_sum/count
                    printf "平均写入: %.2f KB/秒\n", wkb_sum/count
                }
            }' ${MONITOR_DIR}/iostat.log
        fi
        
    } > ${REPORT_FILE}
    
    echo "监控报告已生成: ${REPORT_FILE}"
    cat ${REPORT_FILE}
}

# 执行监控
start_monitoring

# 等待监控完成
echo -e "\n监控进行中..."
sleep ${DURATION}

# 停止监控
stop_monitoring

# 生成报告
generate_report

echo -e "\n=== 监控完成 ==="
echo "所有监控数据保存在: ${MONITOR_DIR}"

6.2 性能问题诊断案例

创建性能诊断脚本:performance_diagnosis.sh

bash 复制代码
#!/bin/bash

echo "=== 系统性能问题诊断 ==="
echo "诊断开始时间: $(date)"

# 创建诊断报告
REPORT_FILE="/tmp/performance_diagnosis_$(date +%Y%m%d_%H%M%S).txt"

{
    echo "系统性能诊断报告"
    echo "生成时间: $(date)"
    echo "=========================================="
    
    # 1. 系统基本信息
    echo -e "\n1. 系统基本信息"
    echo "------------------------------------------"
    echo "主机名: $(hostname)"
    echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2)"
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(uname -m)"
    echo "当前时间: $(date)"
    echo "运行时间: $(uptime)"
    
    # 2. 系统负载检查
    echo -e "\n2. 系统负载检查"
    echo "------------------------------------------"
    LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}')
    CPU_CORES=$(nproc)
    echo "CPU核心数: ${CPU_CORES}"
    echo "系统负载: ${LOAD_AVG}"
    
    # 计算负载是否过高
    LOAD_1MIN=$(echo ${LOAD_AVG} | awk -F, '{print $1}')
    if (( $(echo "${LOAD_1MIN} > ${CPU_CORES}" | bc -l) )); then
        echo "⚠️ 警告: 系统负载过高"
    else
        echo "✓ 系统负载正常"
    fi
    
    # 3. 内存使用检查
    echo -e "\n3. 内存使用检查"
    echo "------------------------------------------"
    free -h
    
    MEM_USAGE=$(free | awk 'NR==2{printf "%.2f", $3/$2*100}')
    echo "内存使用率: ${MEM_USAGE}%"
    
    if (( $(echo "${MEM_USAGE} > 90" | bc -l) )); then
        echo "⚠️ 警告: 内存使用率过高"
    else
        echo "✓ 内存使用正常"
    fi
    
    # 4. 磁盘空间检查
    echo -e "\n4. 磁盘空间检查"
    echo "------------------------------------------"
    df -h | grep -v tmpfs
    
    # 5. 实时进程检查
    echo -e "\n5. 当前资源占用最高进程"
    echo "------------------------------------------"
    echo "CPU占用TOP 5:"
    ps aux --sort=-%cpu | head -6
    echo -e "\n内存占用TOP 5:"
    ps aux --sort=-%mem | head -6
    
    # 6. 网络连接检查
    echo -e "\n6. 网络连接统计"
    echo "------------------------------------------"
    ss -s
    
    # 7. 当前性能快照
    echo -e "\n7. 当前性能快照"
    echo "------------------------------------------"
    echo "Top 输出:"
    top -bn1 | head -10
    echo -e "\nVmstat 输出:"
    vmstat 1 3
    echo -e "\nIostat 输出:"
    iostat -dx 1 1
    
} > ${REPORT_FILE}

echo "诊断报告已生成: ${REPORT_FILE}"
cat ${REPORT_FILE}

7. 监控工具使用总结

7.1 工具选择指南

根据不同的监控需求,选择合适的工具:

创建工具选择流程图

graph TB A[性能监控需求] --> B{监控目标}; B -->|整体系统状态| C[使用 top 命令]; B -->|内存和进程统计| D[使用 vmstat 命令]; B -->|磁盘IO分析| E[使用 iostat 命令]; B -->|综合性能分析| F[使用所有工具]; C --> G[实时查看系统负载
进程资源占用]; D --> H[虚拟内存统计
进程状态跟踪]; E --> I[磁盘吞吐量
IO延迟分析]; F --> J[全面性能诊断
瓶颈定位]; G --> K[生成监控报告]; H --> K; I --> K; J --> K; style A fill:#2d5c7a,color:white style B fill:#4e7ea1,color:white style C fill:#2d5c7a,color:white style D fill:#2d5c7a,color:white style E fill:#2d5c7a,color:white style F fill:#2d5c7a,color:white style G fill:#4e7ea1,color:white style H fill:#4e7ea1,color:white style I fill:#4e7ea1,color:white style J fill:#4e7ea1,color:white style K fill:#a14e4e,color:white

7.2 常用命令速查表

创建命令速查脚本:command_cheatsheet.sh

bash 复制代码
#!/bin/bash

echo "=== Linux 性能监控命令速查表 ==="

cat << 'EOF'

1. top 命令速查:
   top                    # 交互式系统监控
   top -b -n1             # 单次输出,适合脚本
   top -p PID1,PID2       # 监控特定进程
   top -u username        # 监控特定用户进程
   top -H -p PID          # 显示特定进程的所有线程

2. vmstat 命令速查:
   vmstat                 # 显示一次统计信息
   vmstat 2 5             # 每2秒一次,共5次
   vmstat -s              # 显示详细内存统计
   vmstat -d              # 显示磁盘统计
   vmstat -a              # 显示活跃/非活跃内存

3. iostat 命令速查:
   iostat                 # 显示CPU和设备统计
   iostat -c              # 只显示CPU统计
   iostat -d              # 只显示设备统计
   iostat -x              # 显示扩展统计
   iostat -p sda          # 显示特定设备统计
   iostat -m              # 以MB为单位显示

4. 常用组合命令:
   # 实时监控组合
   watch -n1 "iostat -dx 1 1; echo; vmstat 1 1"
   
   # 性能问题快速检查
   top -bn1 | head -20; echo; vmstat 1 3; echo; iostat -dx 1 1
   
   # 历史性能数据分析
   sar -u -r -d -p

5. 关键指标阈值:
   CPU使用率: >80% 警告, >95% 严重
   内存使用率: >85% 警告, >95% 严重
   系统负载: >CPU核心数 警告, >2倍核心数 严重
   磁盘使用率: >85% 警告, >95% 严重
   IO等待: >10% 警告, >30% 严重
EOF

8. 结语

通过本文的详细讲解和实际操作示例,您应该已经掌握了 top、vmstat 和 iostat 这三个 Linux 性能监控核心工具的使用方法。这些工具是系统管理员诊断性能问题、优化系统性能的必备利器。

关键要点总结:

  • top 用于实时监控系统整体状态和进程级资源占用
  • vmstat 专注于虚拟内存、进程和CPU统计信息
  • iostat 提供详细的磁盘IO和CPU使用情况分析
  • 结合使用这三个工具可以全面诊断系统性能瓶颈
  • 定期监控和建立性能基线对系统维护至关重要

建议在日常工作中多加练习这些命令,结合实际场景深入理解各项指标的含义,从而能够快速准确地定位和解决系统性能问题。

相关推荐
LCG元2 小时前
实战案例:服务器磁盘空间告急,如何快速定位和清理"大文件"
linux
以琦琦为中心2 小时前
很好!从 `fdisk -l` 输出可以看到您的磁盘确实是600GB,但只有29.5GB被分配给根分区 `/dev/sda3`。现在我来帮您扩展这个分区。
linux·ubuntu
wc_xue_fei_le2 小时前
11.11DNS主从服务器
linux·服务器·前端
用户31187945592182 小时前
申威SW64系统安装docker-ce-19.03.14.rpm详细教程(附安装包)
linux
white-persist2 小时前
二进制movl及CTF逆向GDB解析:Python(env)环境下dbg从原理到实战
linux·服务器·开发语言·python·网络安全·信息可视化·系统安全
Le_ee2 小时前
Rocky Linux 8 网络配置
linux·运维·服务器
CS_浮鱼3 小时前
【Linux】基础IO
linux·运维·chrome
序属秋秋秋3 小时前
《Linux系统编程之进程基础》【进程状态】
linux·运维·c语言·c++·笔记·操作系统·进程状态
BS_Li3 小时前
【Linux系统编程】进程控制
java·linux·数据库