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使用情况分析
  • 结合使用这三个工具可以全面诊断系统性能瓶颈
  • 定期监控和建立性能基线对系统维护至关重要

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

相关推荐
小白勇闯网安圈28 分钟前
Vmware的Ubuntu构建极简版Linux发行版
linux
刘某的Cloud33 分钟前
shell脚本-read-输入
linux·运维·bash·shell·read
broad-sky1 小时前
Ubuntu上查看USB相机连接的是哪个口,如何查看
linux·数码相机·ubuntu
秋深枫叶红1 小时前
嵌入式第三十七篇——linux系统编程——线程控制
linux·学习·线程·系统编程
shaohui9731 小时前
ARMv7 linux中断路由以及处理
linux·gic·cpsr·armv7
三小尛1 小时前
linux的开发工具vim
linux·运维·vim
陈陈爱java1 小时前
Conda 常用命令行
linux·windows·conda
twdnote1 小时前
dokcer 环境中集成LibreOffice
linux
ChristXlx2 小时前
Linux安装redis(虚拟机适用)
linux·运维·redis
源文雨2 小时前
PVE实现USB硬盘盒在备份前自动上电/结束后自动断电脚本
linux·运维·服务器·备份·perl·pve·usb硬盘盒