Linux 文件 IO 性能监控与分析指南
Linux 文件 I/O 性能监控与分析指南
继 CPU 和网络之后,文件系统 I/O 是影响系统性能的第三大关键领域。无论是数据库响应缓慢、应用加载时间过长,还是日志写入延迟,其根源都可能指向磁盘 I/O 瓶颈。本章将深入探讨文件 I/O 的核心概念、监控指标,并详细拆解 iostat
、sysbench
等一系列核心命令,确保覆盖您提供的所有内容,助您成为 I/O 性能调优专家。
第一部分:文件 I/O 核心概念
在开始监控之前,我们必须理解衡量文件 I/O 性能的关键指标以及其背后的工作原理。
I/O 性能指标
- 读/写速度: 即吞吐量,衡量单位时间内成功传输的数据量。
- 读/写次数 (IOPS): 每秒的读写请求次数。
- I/O 等待时间: 进程因等待 I/O 操作而花费的时间,此值越大,说明文件操作越频繁或设备越慢。
I/O 的两种核心方式
1. 缓存 I/O (Cached I/O)
缓存 I/O,又称为标准 I/O,是大多数文件系统默认的工作模式。其工作流程是,数据先从磁盘复制到内核空间的缓冲区(页缓存),然后再从内核空间缓冲区复制到应用程序的地址空间。
- 读操作:操作系统会检查内核空间的页缓存中是否存在需要的数据。如果已缓存,则直接从缓存中返回数据;否则,系统会先从磁盘读取数据到内核缓冲区,然后再将数据从内核缓冲区复制到用户空间。
- 写操作:应用程序将数据从用户空间复制到内核空间的缓冲区。此时,对于用户程序而言,写操作就已经完成了。至于何时将数据从内核空间真正写回磁盘,则由操作系统决定,除非用户显式调用
sync
同步命令。
优点:
- 在一定程度上分离了内核空间和用户空间,保证了系统本身的运行安全。
- 通过缓存常用数据,可以显著减少实际的磁盘读取次数,从而提升性能。
缺点:
- 在缓存 I/O 机制中,数据无法直接在用户空间和磁盘之间传输。数据在传输过程中,需要在用户空间和内核空间(页缓存)之间进行多次数据拷贝,这会带来较大的 CPU 和内存开销。
2. 直接 I/O (Direct I/O)
直接 I/O 允许应用程序直接访问磁盘,从而绕过内核缓冲区,其主要目的是为了减少一次从内核缓冲区到用户进程地址空间的数据复制操作。像数据库管理系统(如 MySQL、Oracle)这类应用,它们更倾向于在用户空间实现自己的缓存机制,因此通常会选择使用直接 I/O。
第二部分:磁盘 I/O 性能监控与测试
iostat
命令详解
iostat
是一个强大的工具,用于报告 CPU 使用率 和 磁盘 I/O 统计信息。
1. 基本语法
iostat [选项] [间隔时间] [次数]
- 间隔时间:每次报告之间的时间间隔(秒)。
- 次数:报告输出的次数。若省略次数,则持续输出。
2. 常用选项
选项 | 说明 |
---|---|
-c | 仅显示 CPU 使用率统计 |
-d | 仅显示磁盘 I/O 统计 |
-x | 显示扩展的磁盘 I/O 统计(更详细) |
-k | 以 KB/s 为单位显示数据(默认) |
-m | 以 MB/s 为单位显示数据 |
-p DEVICE | 显示指定设备的统计(如 /dev/sda ) |
-t | 在输出中增加时间戳 |
-y | 跳过首次统计(避免显示系统启动以来的平均值) |
3. 输出字段解释
(1) CPU 统计 (iostat -c
)
字段 | 说明 |
---|---|
%user | 用户进程占用 CPU 百分比 |
%nice | 低优先级(nice )进程占用 CPU 百分比 |
%system | 内核进程占用 CPU 百分比 |
%iowait | CPU 等待 I/O 的时间百分比(高则可能磁盘瓶颈) |
%steal | 虚拟化环境下被其他虚拟机占用的 CPU 时间 |
%idle | CPU 空闲时间百分比 |
(2) 磁盘 I/O 统计 (iostat -d
或 iostat -dkx
)
基本磁盘统计 (iostat -d
)
字段 | 说明 |
---|---|
Device | 磁盘设备名(如 sda 、nvme0n1 ) |
tps | 每秒传输次数(I/O 请求数) |
kB_read/s | 每秒读取的数据量(KB/s) |
kB_wrtn/s | 每秒写入的数据量(KB/s) |
kB_dscd/s | 每秒丢弃的数据量(如 SSD 的 TRIM 操作) |
kB_read | 自系统启动以来读取的总数据量(KB) |
kB_wrtn | 自系统启动以来写入的总数据量(KB) |
扩展磁盘统计 (iostat -dx
)
字段 | 说明 |
---|---|
rrqm/s | 每秒合并的读请求数 |
wrqm/s | 每秒合并的写请求数 |
r/s | 每秒完成的读请求数 |
w/s | 每秒完成的写请求数 |
rkB/s | 每秒读取的数据量(KB/s) |
wkB/s | 每秒写入的数据量(KB/s) |
avgrq-sz | 平均每次 I/O 请求的数据大小(扇区数) |
avgqu-sz | 平均 I/O 队列长度 |
await | 平均每次 I/O 请求的等待时间(ms,包括队列+处理时间) |
r_await | 读请求的平均等待时间(ms) |
w_await | 写请求的平均等待时间(ms) |
svctm | 平均每次 I/O 请求的服务时间(ms,仅作参考) |
%util | 设备利用率(0%~100%,接近 100% 表示磁盘饱和) |
关于
await
和svctm
:await
可以理解为 I/O 请求的总响应时间,它包括了队列等待时间和实际的服务时间。如果await
的值远大于svctm
,说明 I/O 请求在队列中等待的时间很长,这通常意味着磁盘 I/O 存在性能问题。
4. 使用示例
# 同时监控 CPU 和磁盘,每秒输出一次,共 5 次
iostat 1 5# 仅监控磁盘 I/O,每 2 秒输出一次
iostat -d 2# 以 MB/s 为单位显示磁盘吞吐量
iostat -d -m 1# 监控指定磁盘(如 /dev/nvme0n1)
iostat -p nvme0n1 1 3# 带时间戳输出,便于记录
iostat -t 1 3
5. 常见问题分析
- 磁盘瓶颈
%util
接近 100%:磁盘 I/O 负载饱和。await
较高(例如 >10ms):磁盘响应慢,可能是硬件性能不足或请求堆积。avgqu-sz
> 1:I/O 请求正在排队,可能存在瓶颈。
- CPU 瓶颈 (I/O 相关)
%iowait
较高:CPU 大量时间在等待 I/O,根源是磁盘速度慢。
- 与其他工具结合:可以使用
iotop
按进程查看磁盘 I/O 使用情况,或使用vmstat
和sar
进行综合监控。 - 注意事项:
iostat
的首次输出是系统启动以来的平均值,后续才是实时数据。可以使用-y
选项跳过首次的平均值统计。
sysbench
性能测试工具
sysbench
是一个多功能的基准测试工具,可用于对 CPU、内存、磁盘和数据库进行压力测试。
1. CPU 测试
此测试用于评估 CPU 的计算能力。
# 计算 20000 以内的所有质数
sysbench cpu --cpu-max-prime=20000 run
- 关键指标:
events per second
(每秒事件数),越高越好。
2. 内存测试
此测试用于评估内存的读写速度。
sysbench memory --memory-block-size=1K --memory-total-size=10G run
- 关键指标:
MiB/s
(吞吐量)。
3. 磁盘 I/O 测试
这是一个三步过程:
步骤一:生成测试文件
sysbench fileio --file-total-size=1G prepare
步骤二:运行测试
# 运行随机读写测试
sysbench fileio --file-total-size=1G --file-test-mode=rndrw run
- 关键指标:
read/write throughput (MB/s)
(读/写吞吐量) 和IOPS
(每秒 I/O 操作数)。
步骤三:清理测试文件
sysbench fileio cleanup
一个更复杂的示例:
# 准备测试文件
sysbench --num-threads=4 --max-time=60 --test=fileio --file-num=10 --file-total-size=10G --file-test-mode=rndrw prepare# 同时使用 iostat 进行监控
iostat -dkx 1 300
第三部分:磁盘空间与分区使用情况
swapon
:查看交换分区
Swap 分区通常被称为交换分区,它是一块特殊的硬盘空间。当系统物理内存不足时,操作系统会从内存中取出一部分暂时不用的数据放入交换分区,从而为当前运行的进程腾出内存空间。一般来说,swap 分区的容量建议是物理内存的 2 倍,但不超过 2GB。
swapon -s
df
:查看文件系统使用情况
该命令用于查看文件系统的硬盘挂载点和空间使用情况。
# 以人类可读的格式显示
df -h# 同时显示文件系统类型
df -Th
du
:查看目录和文件大小
该命令用于统计目录或文件占用的磁盘空间大小。
-h
: 以人类可读的格式显示。-s
: 仅显示总计大小。-c
: 显示几个目录或文件的磁盘空间大小,并统计它们的总和。-a
: 显示目录下的所有文件和目录的大小。--max-depth=N
: 指定显示目录的层级深度。
示例:
# 显示当前所在目录的总大小
du -s# 以人类可读格式显示 /home 目录的总大小
du -s -h /home# 显示多个目录的大小并汇总
du -c /var/log /tmp# 查看当前目录下一级子文件和子目录分别占用的磁盘容量
du -lh --max-depth=1
相关文章:
Linux 文件 IO 性能监控与分析指南
Linux 文件 I/O 性能监控与分析指南 继 CPU 和网络之后,文件系统 I/O 是影响系统性能的第三大关键领域。无论是数据库响应缓慢、应用加载时间过长,还是日志写入延迟,其根源都可能指向磁盘 I/O 瓶颈。本章将深入探讨文件 I/O 的核心概念、监控…...
ABP VNext + Apache Flink 实时流计算:打造高可用“交易风控”系统
ABP VNext Apache Flink 实时流计算:打造高可用“交易风控”系统 🌐 📚 目录 ABP VNext Apache Flink 实时流计算:打造高可用“交易风控”系统 🌐一、背景🚀二、系统整体架构 🏗️三、实战展示…...
前端面试题-HTML篇
1. 请谈谈你对 Web 标准以及 W3C 的理解和认识。 我对 Web 标准 的理解是,它就像是互联网世界的“交通规则”,由 W3C(World Wide Web Consortium,万维网联盟) 这样一个国际性组织制定。这些规则规范了我们在编写 HTML…...
JS数组 concat() 与扩展运算符的深度解析与最佳实践
文章目录 前言一、语法对比1. Array.prototype.concat()2. 扩展运算符(解构赋值) 二、性能差异(大规模数组)关键差异原因 三、适用场景建议总结 前言 最近工作中遇到了一个大规模数组合并相关的问题,在数据合并时有些…...

人工智能与机器学习从理论、技术与实践的多维对比
人工智能(Artificial Intelligence, AI)提出“让机器像人类一样思考”的目标,其核心理论围绕符号系统假设展开——认为智能行为可通过逻辑符号系统(如谓词逻辑、产生式规则)建模。 机器学习(Machine Learning, ML)是人工智能的子集,聚焦于通过数据自动改进算法性能的理…...
Netty 实战篇:手写一个轻量级 RPC 框架原型
本文将基于前文实现的编解码与心跳机制,构建一个简单的 RPC 框架,包括请求封装、响应解析、动态代理调用。为打造微服务通信基础打下基础。 一、什么是 RPC? RPC(Remote Procedure Call,远程过程调用)允许…...

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程
什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…...
亚远景-ISO 21434标准:汽车网络安全实践的落地指南
一、ISO 21434标准概述 ISO 21434是针对道路车辆网络安全的国际标准,旨在确保汽车组织在车辆的整个生命周期内采用结构化方法进行网络安全风险管理。 该标准适用于参与车辆开发的所有利益相关者,包括OEM、一级和二级供应商、汽车软件供应商以及网络安全…...
【动手学深度学习】2.4. 微积分
目录 2.4. 微积分1)导数和微分2)偏导数3)梯度4)链式法则5)小结 . 2.4. 微积分 微积分的起源: 古希腊人通过逼近法(多边形边数↑ → 面积逼近圆)发展出积分的思想。 微分ÿ…...

流程自动化引擎:让业务自己奔跑
在当今竞争激烈的商业环境中,企业面临着快速变化的市场需求、日益复杂的业务流程以及不断增长的运营成本。如何优化业务流程、提升效率并降低成本,成为企业持续发展的关键问题。 流程自动化引擎(Process Automation Engine)作为一…...

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力
点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…...

用 Python 模拟雪花飘落效果
用 Python 模拟雪花飘落效果 雪花轻轻飘落,给冬日带来一份浪漫与宁静。本文将带你用一份简单的 Python 脚本,手把手实现「雪花飘落效果」动画。文章深入浅出,零基础也能快速上手,完整代码仅需一个脚本文件即可运行。 目录 前言…...

基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究
摘要:本文聚焦“一切皆零售”理念下的大零售渗透趋势,提出以定制开发开源AI智能名片S2B2C商城小程序为核心工具的渗透策略。通过分析该小程序在需求感应、场景融合、数据驱动等方面的技术优势,结合零售渗透率提升的关键路径,揭示其…...
重拾Scrapy框架
基于Scrapy框架实现 舔狗语录百度翻译 输出结果到txt文档 爬虫脚本 from typing import Iterable, Any, AsyncIteratorimport scrapy import json from post.items import PostItemclass BaidufanyiSpider(scrapy.Spider):name "baidufanyi"allowed_domains [&quo…...
Day 40
单通道图片的规范写法 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset from torchvision import datasets, transforms import matplotlib.pyplot as plt import warnings warnings.filterwarnings(&q…...

XPlifeapp:高效打印,便捷生活
在数字化时代,虽然电子设备的使用越来越普遍,但打印的需求依然存在。无论是学生需要打印课表、资料,还是职场人士需要打印名片、报告,一个高效便捷的打印软件都能大大提高工作效率。XPlifeapp就是这样一款超级好用的手机打印软件&…...

等保测评-Mysql数据库测评篇
Mysql数据库测评 0x01 前言 "没有网络安全、就没有国家安全" 等保测评是什么? 等保测评(网络安全等级保护测评)是根据中国《网络安全法》及相关标准,对信息系统安全防护能力进行检测评估的法定流程。其核心依据《信…...
CSS篇-2
4. position 的值分别是相对于哪个位置定位的? position 属性是 CSS 布局中一个非常核心的概念,它允许我们精确控制元素在文档中的定位方式,从而脱离或部分脱离正常的文档流。理解 position 的不同值以及它们各自的定位基准,是实…...

02.K8S核心概念
服务的分类 有状态服务:会对本地环境产生依赖,例如需要把数据存储到本地磁盘,如mysql、redis; 无状态服务:不会对本地环境产生任何依赖,例如不会存储数据到本地磁盘,如nginx、apacheÿ…...
一套qt c++的串口通信
实现了创建线程使用串口的功能 具备功能: 1.线程使用串口 2.定时发送队列内容,防止粘包 3.没处理接收粘包,根据你的需求来,handleReadyRead函数中,可以通过m_receiveBuffer来缓存接收,然后拆分数据来处理 源码 seri…...
【高频面试题】数组中的第K个最大元素(堆、快排进阶)
文章目录 数组中的第K个最大元素题目描述示例1示例2提示: 解法1(堆维护前k大元素)解法2 手写堆维护解法3(快速选择算法)例题:P1923 【深基9.例4】求第 k 小的数参考 数组中的第K个最大元素 题目描述 给定…...
Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索
Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索 在某家互联网大厂的面试中,面试官A是一位技术老兵,而被面试者谢飞机,号称有丰富的Java开发经验。以下是他们的面试情景: 场景:电商平台的后端开发…...
基于Python的单斜式ADC建模与仿真分析
基于Python的单斜式ADC建模与仿真分析 1 引言 CMOS图像传感器的读出电路中,列级ADC因其面积效率高(每列共享ADC)、功耗低(并行工作降低频率需求)和固定模式噪声小(结构对称性高)等优势成为大像素阵列的首选方案。本文针对50KS/s采样率、10位分辨率的单斜式ADC进行系统…...
笔记本电脑右下角wifi不显示,连不上网怎么办?
解决思路:设备管理器--先禁用wifi6硬件-再启用wifi6硬件(20秒搞定) 笔记本电脑右下角的wifi经常莫名其妙的不显示,连不上网,感觉应该是与什么程序不兼容,导致wifi模块被办掉了,怎么这种情况出现…...

一篇文章玩转CAP原理
CAP 原理是分布式系统设计的核心理论之一,揭示了系统设计中的 根本性权衡。 一、CAP 的定义 CAP 由三个核心属性组成,任何分布式系统最多只能同时满足其中两个: 一致性(Consistency) 所有节点在同一时刻看到的数据完全…...

Vue-收集表单信息
收集表单信息 Input label for 和 input id 关联, 点击账号标签 也能聚焦 input 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>表单数据</title><!-- 引入Vue --><scrip…...
私服 nexus 之间迁移 npm 仓库
本文介绍如何将一个 Nexus 特定仓库中的 npm 包内容迁移到另一个 Nexus 特定仓库。此过程适用于需要重构仓库结构或合并仓库的场景。 迁移脚本 以下是完整的迁移脚本,它会自动完成以下操作: 从源仓库获取所有 npm 包列表下载每个包的 .tgz 文件解压并…...
微服务及容器化设计--可扩展的架构设计
引言 在当今快速发展的技术环境中,企业需要构建能够适应变化、支持快速迭代且可靠的软件系统。传统的单体应用架构在面对高并发、大规模部署和复杂业务逻辑时往往力不从心。微服务架构结合容器化技术应运而生,成为现代可扩展系统设计的主流选择。本文将…...

vscode开发stm32,main.c文件中出现很多报错影响开发解决日志
本质上为 .vscode/c_cpp_properties.json文件和Makefile文件中冲突,两者没有同步。 将makefile文件中的内容同步过来即可,下面给出一个json文件的模板,每个人的情况不同,针对性修改即可 {"configurations": [{"na…...

嵌入式鸿蒙系统中水平和垂直以及图片调用方法
利用openharmony操作的具体现象: 第一:Column 作用:沿垂直方向布局的容器。 第二:常用接口 Column(value?: {space?: string | number}) 参数: 参数名参数类型必填参数描述spacestring | number否纵向布局元素垂直方向间距。 从API version 9开始,space为负数或者ju…...