香港服务器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.log4.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)"fi4.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系统性能分析的利器,掌握它们的使用方法可以帮助你:
快速定位瓶颈:识别CPU、内存、磁盘I/O中的性能瓶颈
实时监控系统:了解系统实时运行状态
性能趋势分析:跟踪系统性能变化趋势
容量规划:为系统扩容提供数据支持
最佳实践建议:
建立性能基线,了解系统正常状态
设置合理的性能阈值和告警机制
结合其他工具(top、htop、sar等)进行综合分析
定期进行性能趋势分析,预测潜在问题
通过系统化的性能监控和分析,你可以在问题影响业务之前及时发现并解决,确保系统的稳定高效运行。


发表评论
最近发表
标签列表