性能分析工具vmstat

vmstat 虚拟内存监控工具在开发中的运用

vmstat (Virtual Memory Statistics) 是一个强大的系统监控工具,能够提供关于系统虚拟内存、进程、CPU活动等方面的信息。在开发过程中,vmstat 可以帮助排查多种性能问题。

vmstat 能排查的问题

  1. 内存瓶颈问题

    • 检测内存不足导致的频繁交换(Swap)
    • 发现内存泄漏问题
    • 监控空闲内存变化趋势
  2. CPU性能问题

    • 识别CPU使用率过高情况
    • 发现CPU资源争用
    • 监控系统进程和用户进程的CPU使用比例
  3. I/O性能问题

    • 检测磁盘I/O瓶颈
    • 发现过多的等待I/O的进程
    • 监控块设备读写情况
  4. 系统负载问题

    • 识别系统过载情况
    • 监控运行队列长度

vmstat 基本用法

bash 复制代码
vmstat [选项] [时间间隔] [次数]

常用选项:

  • -a:显示活跃和非活跃内存
  • -m:显示slabinfo
  • -s:显示内存统计信息
  • -d:显示磁盘统计信息
  • -p:显示指定磁盘分区的统计信息

实际应用示例

  1. 基本监控(每2秒刷新一次,共5次) vmstat 2 5

  2. 监控系统内存使用情况 vmstat -a 1 5

  3. 监控磁盘I/O vmstat -d 1 3

  4. 持续监控系统状态 vmstat 1

输出字段解析

css 复制代码
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  • procs

    • r: 运行队列中的进程数
    • b: 等待I/O的进程数
  • memory

    • swpd: 使用的虚拟内存量
    • free: 空闲内存量
    • buff: 用作缓冲区的内存量
    • cache: 用作缓存的内存量
  • swap

    • si: 从磁盘交换到内存的量
    • so: 从内存交换到磁盘的量
  • io

    • bi: 从块设备接收的块数
    • bo: 发送到块设备的块数
  • system

    • in: 每秒中断数
    • cs: 每秒上下文切换数
  • cpu

    • us: 用户空间占用CPU百分比
    • sy: 内核空间占用CPU百分比
    • id: 空闲CPU百分比
    • wa: 等待I/O的CPU百分比
    • st: 虚拟机偷取时间百分比

开发中的实际应用场景

  1. 识别内存泄漏

    • 观察free内存持续减少
    • swpd不断增加而si/so有活动
  2. 检测CPU瓶颈

    • us长期高于70%可能应用需要优化
    • sy过高可能系统调用过多
  3. 发现I/O问题

    • wa值高表示I/O等待严重
    • bi/bo值高表示磁盘读写频繁
  4. 系统负载分析

    • r值长期大于CPU核心数表示系统过载

高级技巧

  1. 结合其他工具使用: vmstat 1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'

  2. 监控特定进程的内存使用: vmstat -p /dev/sda1 1 5

  3. 长期监控并记录到文件: vmstat 30 > vmstat.log &

开发中实战分析

vmstat 1

关键指标分析

  1. CPU 使用情况 (cpu列)

    • us(用户态):3-5% (正常)

    • sy(内核态):1-9% (正常)

    • id(空闲):21-48% (逐渐降低)

    • wa(I/O等待):39-71% (严重问题)

      • 超过 20% 即表示 I/O 瓶颈,此处持续高达 50% 以上,说明磁盘是系统瓶颈。
    • st(虚拟机偷取时间):0% (无影响)

  2. 进程队列 (procs列)

    • r(运行队列):0-4 (正常)

    • b(阻塞进程):5-13 (持续高位)

      • 大量进程因等待 I/O 被阻塞。
  3. 内存/交换 (memory/swap列)

    • free(空闲内存):615MB-785MB (充足)
    • swpd(交换分区使用量):0 (未使用交换空间,内存充足)
    • buff/cache:合理利用缓存,无异常。
  4. I/O 统计 (io列)

    • bo(块设备写入):高达 98352 (第一行),后续波动

      • 存在大量磁盘写入操作。
    • bi(块设备读取):基本为0 (读取压力小)。

    • si/so(交换入/出):0 (无交换活动)。

  5. 系统中断 (system列)

    • in(中断次数):约 11k-13k/秒 (正常)
    • cs(上下文切换):约 17k-18k/秒 (正常)

问题诊断结论

  1. 主要瓶颈磁盘 I/O 性能不足

    • wa(I/O 等待) 和持续阻塞进程 (b) 表明磁盘写入速度跟不上请求。

    • 可能原因:

      • 磁盘硬件性能差(如机械硬盘)。
      • 大量小文件写入(未合并 I/O)。
      • RAID/磁盘阵列配置不当。
      • 应用程序频繁同步写入(如日志、数据库事务)。
  2. 次要观察

    • CPU 资源充足(id 空闲率高),但受限于 I/O,无法有效利用。
    • 内存充足,无交换压力。

建议的优化措施

  1. 立即检查磁盘负载
bash 复制代码
  iostat -x 1  # 查看 %util 和 await 确认磁盘利用率
markdown 复制代码
-   如果 `%util` 接近 100%,说明磁盘饱和。
  • 针对性优化

    • 硬件层

      • 替换为 SSD/NVMe 磁盘。
      • 增加磁盘阵列的条带化(RAID 0/10)。
    • 系统层

      • 调整 I/O 调度器(如改为 deadlinenoop):
bash 复制代码
  echo deadline > /sys/block/sdX/queue/scheduler
  • 增加文件系统写入缓存(风险:可能丢数据):
      bash 复制代码
        echo 50 > /proc/sys/vm/dirty_ratio
    • 应用层

      • 减少同步写入(如数据库的 fsync 频率)。
      • 合并小文件写入(批量操作)。
  1. 长期监控

    • 使用 dstatsar 记录历史数据,分析高峰期的 I/O 模式。

补充命令建议

  • 查看具体进程的 I/O 使用:

bash 复制代码
  iotop -o  # 显示正在执行 I/O 的进程
  • 检查磁盘健康状态(如果是机械硬盘):
bash 复制代码
smartctl -a /dev/sdX
相关推荐
未来之窗软件服务14 分钟前
网站访问信息追踪系统在安全与性能优化中的关键作用——网络安全—仙盟创梦IDE
安全·web安全·性能优化·仙盟创梦ide·东方仙盟
五岁小孩2 小时前
Golang 性能分析神器 pprof 详解与实践(图文教程)
性能优化·golang·pprof
猿小蔡3 小时前
Android Memory Monitor内存分析核心指标详解
性能优化
今禾4 小时前
99% 的前端都在用,但你真的懂 Axios 吗?
前端·性能优化·axios
Code季风5 小时前
深入 Spring 性能调优:反射机制与动态代理的优化策略
java·spring·性能优化
zkmall6 小时前
小程序卡顿到丝滑体验:ZKmall开源商城性能优化与兼容修复实战指南
性能优化·小程序
伍哥的传说8 小时前
React性能优化终极指南:memo、useCallback、useMemo全解析
前端·react.js·性能优化·usecallback·usememo·react.memo·react devtools
拾光拾趣录18 小时前
一张 8K 海报差点把首屏拖垮
前端·性能优化
拾光拾趣录18 小时前
为什么我们要亲手“捏”一个 Vue 项目?
前端·vue.js·性能优化
鼠鼠我捏,要死了捏20 小时前
Apache Flink 实时流处理性能优化实践指南
性能优化·apache flink·实时流处理