香港服务器如何使用vmstat和iostat命令分析系统性能?

香港服务器vmstat和iostat是Linux系统性能分析中最常用且强大的命令行工具,能够提供系统资源使用的实时快照和详细统计信息。掌握这两个工具的使用方法,是系统管理员和开发···

香港服务器vmstat和iostat是Linux系统性能分析中最常用且强大的命令行工具,能够提供系统资源使用的实时快照和详细统计信息。掌握这两个工具的使用方法,是系统管理员和开发人员必备的技能。

一、vmstat命令深度解析

1.1 vmstat基础用法

基本语法:

bash

vmstat [选项] [时间间隔] [采样次数]

常用示例:

bash

# 显示一次系统状态快照vmstat# 每2秒采样一次,共采样5次vmstat 2 5# 显示活跃和非活跃内存信息vmstat -a 1 3# 显示磁盘分区统计vmstat -d# 显示内存的详细信息vmstat -s# 显示磁盘读写分区统计vmstat -D

1.2 vmstat输出字段详解

标准输出解读:

bash

$ vmstat 1 3procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 1  0      0 1258124 210432 1534232    0    0     5    12   42   84  8  3 89  0  0
 0  0      0 1257128 210432 1534236    0    0     0     0  123  245  5  2 93  0  0
 2  0      0 1256124 210432 1534240    0    0     0     4  118  231  7  3 90  0  0

字段详细解释:

Procs(进程)

  • r:运行队列中的进程数(等待CPU的进程)

    • 正常值:0-(CPU核心数×2)

    • 警告值:持续 > CPU核心数 × 2

    • 问题表现:CPU资源不足

  • b:处于不可中断睡眠状态的进程数

    • 正常值:0

    • 警告值:持续 > 0

    • 问题表现:I/O阻塞

Memory(内存)

  • swpd:使用的虚拟内存大小(KB)

  • free:空闲的物理内存大小(KB)

  • buff:用作缓冲的内存大小(KB)

  • cache:用作缓存的内存大小(KB)

Swap(交换分区)

  • si:从磁盘交换到内存的数据量(KB/s)

    • 正常值:0

    • 警告值:持续 > 0

    • 问题表现:物理内存不足

  • so:从内存交换到磁盘的数据量(KB/s)

    • 正常值:0

    • 警告值:持续 > 0

    • 问题表现:物理内存不足

I/O(输入输出)

  • bi:从块设备接收的块数(blocks/s)

    • 监控重点:磁盘读取活动

  • bo:发送到块设备的块数(blocks/s)

    • 监控重点:磁盘写入活动

System(系统)

  • in:每秒中断次数

  • cs:每秒上下文切换次数

    • 正常范围:与系统负载相关

    • 警告值:异常高峰值

CPU(处理器)

  • us:用户进程占用CPU时间百分比

  • sy:系统内核占用CPU时间百分比

  • id:空闲CPU时间百分比

  • wa:等待I/O的CPU时间百分比

    • 正常值:< 5%

    • 警告值:持续 > 10%

    • 问题表现:磁盘I/O瓶颈

  • st:被虚拟化环境偷取的时间百分比

1.3 vmstat实战分析场景

CPU瓶颈分析:

bash

# 监控CPU使用情况,重点关注r、us、sy列vmstat 1 10# 分析示例:# 如果 r > CPU核心数,且 us + sy > 80%,说明CPU资源紧张# 如果 wa 持续较高,说明I/O等待影响CPU效率

内存瓶颈分析:

bash

# 监控内存和交换分区使用vmstat -a 1 5# 分析示例:# 如果 si 和 so 持续大于0,说明物理内存不足,系统在使用交换分区# 如果 free 持续减少,cache持续增加,说明内存压力增大

I/O瓶颈分析:

bash

# 监控I/O活动vmstat 1 5# 分析示例:# 如果 bi 和 bo 持续较高,同时 wa 也高,说明磁盘I/O繁忙# 如果 b 列有数值,说明有进程因I/O而阻塞

二、iostat命令深度解析

2.1 iostat基础用法

基本语法:

bash

iostat [选项] [时间间隔] [采样次数]

常用示例:

bash

# 显示一次CPU和设备统计信息iostat# 每2秒显示一次扩展统计,共显示3次iostat -x 2 3# 显示CPU和设备统计,每3秒一次iostat -c -d 3# 显示设备使用率和扩展统计iostat -dx 1 5# 以MB为单位显示数据iostat -m 1 3# 显示特定设备统计iostat -x sda sdb 1 3

2.2 iostat输出字段详解

基本输出解读:

bash

$ iostat
Linux 5.4.0-42-generic (server) 	08/15/2024 	_x86_64_	(4 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           8.45    0.01    2.89    0.35    0.00   88.30Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               5.12        45.23       120.45    4523456   12045678sdb               2.34        12.34        56.78    1234567    5678901

CPU统计字段:

  • %user:用户级CPU使用率

  • %nice:调整优先级的进程CPU使用率

  • %system:系统级(内核)CPU使用率

  • %iowait:等待I/O完成的CPU时间百分比

  • %steal:虚拟化环境中被偷取的CPU时间

  • %idle:空闲CPU时间百分比

设备基本统计字段:

  • tps:每秒传输次数(I/O请求数)

  • kB_read/s:每秒读取数据量(KB)

  • kB_wrtn/s:每秒写入数据量(KB)

  • kB_read:读取数据总量(KB)

  • kB_wrtn:写入数据总量(KB)

扩展统计输出(-x选项):

bash

$ iostat -x 1 1Linux 5.4.0-42-generic (server) 	08/15/2024 	_x86_64_	(4 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           8.45    0.01    2.89    0.35    0.00   88.30Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              2.12    3.00     45.23    120.45     0.12     1.23  5.36  29.05    1.23    2.34   0.01    21.34    40.15   0.85   0.43

扩展统计字段详解:

请求率统计

  • r/s:每秒完成的读请求数

  • w/s:每秒完成的写请求数

  • rrqm/s:每秒合并的读请求数

  • wrqm/s:每秒合并的写请求数

  • %rrqm:读请求合并百分比

  • %wrqm:写请求合并百分比

吞吐量统计

  • rkB/s:每秒读取数据量(KB)

  • wkB/s:每秒写入数据量(KB)

响应时间统计

  • r_await:读请求平均等待时间(毫秒)

    • 正常值:< 10ms(SSD),< 20ms(HDD)

    • 警告值:> 50ms

  • w_await:写请求平均等待时间(毫秒)

  • aqu-sz:平均请求队列长度

    • 正常值:< 1

    • 警告值:持续 > 2

请求大小统计

  • rareq-sz:读请求平均大小(KB)

  • wareq-sz:写请求平均大小(KB)

服务时间统计

  • svctm:平均每次I/O操作的服务时间(毫秒)

    • 注意:该指标在较新内核中已不建议使用

利用率统计

  • %util:设备带宽利用率百分比

    • 正常值:< 60%

    • 警告值:持续 > 80%

    • 瓶颈值:接近100%

2.3 iostat实战分析场景

磁盘性能瓶颈识别:

bash

# 监控磁盘I/O性能iostat -x 1 5# 分析要点:# 1. 如果 %util > 80%,说明磁盘接近饱和# 2. 如果 r_await 或 w_await > 50ms,说明响应时间过长# 3. 如果 aqu-sz > 2,说明请求在排队

识别读写模式:

bash

# 分析读写比例和模式iostat -x 1 3# 分析要点:# 1. 如果 r/s 远大于 w/s,说明读密集型# 2. 如果 w/s 远大于 r/s,说明写密集型# 3. 观察 rareq-sz 和 wareq-sz 了解I/O大小

三、综合性能分析实战

3.1 性能问题诊断脚本

创建综合监控脚本:

bash

#!/bin/bash# performance-monitor.shecho "=== 系统性能综合分析 ==="echo "开始时间: $(date)"echo "采样间隔: 2秒"echo "采样次数: 5次"echo ""echo "--- CPU和内存概览 (vmstat) ---"vmstat 2 5echo ""echo "--- 磁盘I/O详细统计 (iostat) ---"iostat -x 2 5echo ""echo "--- 关键性能指标总结 ---"echo "分析时间: $(date)"# 提取关键指标进行分析echo "性能指标分析:"echo "1. CPU空闲率: $(iostat -c 1 1 | awk 'NR==4 {print $6}')%"echo "2. I/O等待率: $(iostat -c 1 1 | awk 'NR==4 {print $4}')%"echo "3. 内存交换活动: $(vmstat 1 2 | awk 'NR==4 {print $7 " KB/s (si) / " $8 " KB/s (so)"}')"

3.2 常见性能问题模式识别

CPU瓶颈模式:

bash

# 监控命令vmstat 1 5# 识别特征:# r列持续 > CPU核心数 × 2# us + sy > 80%# id < 20%

内存瓶颈模式:

bash

# 监控命令vmstat -a 1 5# 识别特征:# si > 0 或 so > 0(交换活动)# free内存持续减少# cache内存持续增加

磁盘I/O瓶颈模式:

bash

# 监控命令iostat -x 1 5# 识别特征:# %util > 80%# r_await 或 w_await > 50ms# aqu-sz > 2

3.3 实时性能监控仪表板

创建实时监控脚本:

bash

#!/bin/bash# real-time-monitor.shclearecho "=== 实时性能监控仪表板 ==="echo "按 Ctrl+C 退出监控"echo ""while true; do
    echo "时间: $(date '+%H:%M:%S')"
    echo "--- CPU和内存状态 ---"
    vmstat 1 1 | tail -1 | awk '{printf "运行队列: %s, 阻塞进程: %s, 空闲内存: %s MB, 交换: in=%s/s out=%s/s\n", $1, $2, $4/1024, $7, $8}'
    
    echo "--- 磁盘I/O状态 ---"
    iostat -x 1 1 | grep -E "(sd|nvme)" | head -2 | while read line; do
        if [[ $line == Device* ]]; then
            echo "设备    | 读IOPS | 写IOPS | 读吞吐 | 写吞吐 | 利用率"
            echo "--------|--------|--------|--------|--------|--------"
        else
            echo $line | awk '{printf "%-6s | %6.1f | %6.1f | %6.1f | %6.1f | %5.1f%%\n", $1, $2, $3, $4, $5, $14}'
        fi
    done
    
    echo "----------------------------------------"
    sleep 2
    cleardone

四、高级分析与调优技巧

4.1 性能基准测试

创建性能基准脚本:

bash

#!/bin/bash# performance-baseline.shecho "开始性能基准测试..."echo "测试时长: 30秒"echo ""# 记录开始时间start_time=$(date +%s)# 运行vmstat在后台收集数据vmstat 1 30 > /tmp/vmstat_baseline.log &# 运行iostat在后台收集数据iostat -x 1 30 > /tmp/iostat_baseline.log &# 等待测试完成wait# 分析基准数据echo "=== 性能基准报告 ==="echo "测试时间: $(date)"echo ""# 分析CPU基准echo "CPU使用率基准:"awk 'NR>2 {user+=$13; system+=$14; iowait+=$16} END {print "平均用户CPU: " user/(NR-2) "%"; print "平均系统CPU: " system/(NR-2) "%"; print "平均I/O等待: " iowait/(NR-2) "%"}' /tmp/vmstat_baseline.logecho ""# 分析内存基准echo "内存使用基准:"awk 'NR>2 {free+=$4} END {print "平均空闲内存: " free/(NR-2)/1024 " MB"}' /tmp/vmstat_baseline.logecho ""# 分析磁盘基准echo "磁盘I/O基准:"awk '/sd/ {r_iops+=$2; w_iops+=$3; util+=$14} END {print "平均读IOPS: " r_iops/NR; print "平均写IOPS: " w_iops/NR; print "平均利用率: " util/NR "%"}' /tmp/iostat_baseline.log# 清理临时文件rm /tmp/vmstat_baseline.log /tmp/iostat_baseline.log

4.2 性能阈值告警

创建阈值监控脚本:

bash

#!/bin/bash# performance-alert.sh# 性能阈值配置CPU_THRESHOLD=80MEMORY_THRESHOLD=90IO_UTIL_THRESHOLD=80IO_AWAIT_THRESHOLD=50# 收集当前性能数据cpu_idle=$(iostat -c 1 1 | awk 'NR==4 {print $6}')memory_usage=$(free | awk 'NR==2 {printf "%.0f", $3/$2 * 100}')io_util=$(iostat -x 1 1 | grep -E "(sd|nvme)" | head -1 | awk '{print $14}')io_await=$(iostat -x 1 1 | grep -E "(sd|nvme)" | head -1 | awk '{print $10}')# 检查阈值并告警alerts=()if (( $(echo "$cpu_idle < $((100 - CPU_THRESHOLD))" | bc -l) )); then
    alerts+=("CPU使用率过高: $((100 - ${cpu_idle%.*}))%")fiif [ $memory_usage -gt $MEMORY_THRESHOLD ]; then
    alerts+=("内存使用率过高: ${memory_usage}%")fiif (( $(echo "$io_util > $IO_UTIL_THRESHOLD" | bc -l) )); then
    alerts+=("磁盘利用率过高: ${io_util}%")fiif (( $(echo "$io_await > $IO_AWAIT_THRESHOLD" | bc -l) )); then
    alerts+=("磁盘响应时间过长: ${io_await}ms")fi# 输出告警if [ ${#alerts[@]} -gt 0 ]; then
    echo "🚨 性能告警 - $(date)"
    for alert in "${alerts[@]}"; do
        echo "  • $alert"
    done
    # 这里可以添加邮件、短信等通知机制else
    echo "✅ 系统性能正常 - $(date)"fi

4.3 性能趋势分析

创建趋势分析脚本:

bash

#!/bin/bash# performance-trend.shLOG_FILE="/var/log/performance_trend.log"INTERVAL=300  # 5分钟while true; do
    timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    # 收集性能数据
    vmstat_data=$(vmstat 1 1 | tail -1)
    iostat_data=$(iostat -x 1 1 | grep -E "(sd|nvme)" | head -1)
    
    # 解析关键指标
    cpu_idle=$(echo $vmstat_data | awk '{print $15}')
    memory_free=$(echo $vmstat_data | awk '{print $4/1024}')  # MB
    io_util=$(echo $iostat_data | awk '{print $14}')
    io_await=$(echo $iostat_data | awk '{print $10}')
    
    # 记录到日志文件
    echo "$timestamp,$cpu_idle,$memory_free,$io_util,$io_await" >> $LOG_FILE
    
    # 保持日志文件大小(保留最近1000条记录)
    tail -n 1000 $LOG_FILE > ${LOG_FILE}.tmp && mv ${LOG_FILE}.tmp $LOG_FILE
    
    sleep $INTERVALdone

五、实际案例解析

5.1 案例1:数据库服务器性能分析

问题描述: 数据库查询响应变慢

分析步骤:

bash

# 1. 综合监控vmstat 1 5iostat -x 1 5# 2. 重点关注指标:# - vmstat: r, b, wa, si, so# - iostat: %util, r_await, w_await, aqu-sz# 3. 可能的问题:# - 如果 wa 高且 %util 高 → 磁盘I/O瓶颈# - 如果 r 高且 us 高 → CPU计算瓶颈# - 如果 si/so 高 → 内存不足

5.2 案例2:Web服务器性能分析

问题描述: 网站访问缓慢

分析步骤:

bash

# 1. 监控系统资源vmstat 1 3iostat -x 1 3# 2. 网络连接监控结合ss -snetstat -ant | grep :80 | wc -l# 3. 可能的问题:# - 高CPU使用率(us)→ 应用逻辑复杂# - 高I/O等待(wa)→ 静态资源读取慢# - 高上下文切换(cs)→ 进程/线程过多

总结

vmstat和iostat是Linux系统性能分析的利器,掌握它们的使用方法可以帮助你:

  1. 快速定位瓶颈:识别CPU、内存、磁盘I/O中的性能瓶颈

  2. 实时监控系统:了解系统实时运行状态

  3. 性能趋势分析:跟踪系统性能变化趋势

  4. 容量规划:为系统扩容提供数据支持

最佳实践建议:

  • 建立性能基线,了解系统正常状态

  • 设置合理的性能阈值和告警机制

  • 结合其他工具(top、htop、sar等)进行综合分析

  • 定期进行性能趋势分析,预测潜在问题

通过系统化的性能监控和分析,你可以在问题影响业务之前及时发现并解决,确保系统的稳定高效运行。

生成文章图片 (58).jpg

您好:云优数据云计算 www.yunyoushuju.cn 2核2G6M最低19.9元/月 欢迎开机

发表评论

评论列表
未查询到任何数据!