深入理解磁盘I/O

磁盘I/O原理

在这里插入图片描述
磁盘每个盘片为双面,每个面上分布一圈一圈的同心圆磁道,磁道由扇区组成。外围的扇区更宽,扇区的存储空间是一样的,一般每个扇区600字节,数据存储区512字节,其余存放控制信息。磁臂头移动遍历磁道,盘片旋转遍历扇区。
寻道时间:将磁臂头移动到指定磁道上所经历的时间
旋转延迟时间:盘片转动时扇区移动到磁头下所经历的时间
传输时间:将数据从磁盘读出或写入数据所经历的时间(与每次读/写的字节数和磁盘转速有关)

随机I/O:有一串随机数据文件(在磁盘上的位置分布随机的数据文件),需要从磁盘上一一读取。这样寻道时间很长,会导致I/O读取时间过长。
比如,在磁道2扇区3读取了第一个数据文件,接下来,磁头臂向外移动去磁道14扇区5读取第二个数据文件,接下来磁头臂又要向里移动到磁道8扇区4读取第三个数据文件,之前读取第二个数据文件时从磁道2移到14,现在又从磁道14移到8,可见这样重复走了8-14的磁道。可以知道,如果后面还有数据存在于走过的磁道上,会有很多的重复寻道,极大增加了寻道时间。

顺序I/O:就像是随机I/O的优化版,我们可以将我们要读取的数据文件按照其磁盘存放顺序排序,从第一个文件的位置开始向一个方向读取,我们依次读完每个磁道直到所有文件读取完,不必再有随机I/O带来的重复寻道时间。

在许多的开源框架如 Kafka、HBase 中,都通过追加写的方式来尽可能的将随机 I/O 转换为顺序 I/O,以此来降低寻址时间和旋转延时

提升磁盘I/O速度

磁盘高速缓存

目前,磁盘I/O速度远低于对内存的访问速度,为了提高磁盘I/O速度,利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。

存储管理相关

  • 分页存储管理:将一个进程的逻辑地址空间分成若干大小相等的片,称为页或页面,并给各页加上编号0,1,2等。
  • 分段存储管理:编译程序将作业的地址空间划分为若干个段,如主程序段MAIN,子程序段X,数据段D及段栈S等。每个段大小可以不一样。分段地址由段号和段内地址组成。
  • 段页式存储管理方式:组合分段和分页管理,先将用户程序分为若干段,再把每个段分为若干页。段页式地址结构由段号,段内页号,业内地址三部分组成。
  • 虚拟存储器:程序作业很大,内存容量无法容纳,因此在应用程序运行前,仅将当前要运行的少数页面装入内存便可运行,其余暂留磁盘,程序运行时,需要哪个页面的数据,就再调入内存,如果内存空间已满,则利用置换功能将老页面调出。

相应的也把内存空间(虚拟存储器)分成与页面大小相等的存储块,称为(物理)块或页框,同样加以编号。虚拟存储器和高速缓存空间(Disk Cache)类似。

当有进程访问某部分程序和数据时,会先在内存(缓存)中读取其所在的页面,没有则由OS将磁盘中的所需页面调入内存。当内存空间已满,应选择将哪个页面调出内存,由页面置换算法确定。
置换算法
在这里插入图片描述

  • 最佳(Optimal)置换算法:淘汰未来最长时间不再被访问的页面(理想算法)
  • 先进先出(FIFO)页面置换算法:淘汰最先进入的页面
  • 最近最久未使用(LRU)置换算法:淘汰最长时间未使用的页面
  • CLOCK置换算法:
    简单CLOCK:LRU近似算法,从上次淘汰页面后,到现在还没有被使用过的页面会被淘汰
    改进的CLOCK置换算法:是从上次淘汰页面后,到现在还没有被使用过且未被修改过的页面会被淘汰(如果被修改过则将该页重新写回磁盘)
  • 最少使用(LFU)置换算法:和LRU算法差不多,只是页面的使用情况采用移位寄存器方式存储,具体的使用次数无法得知,移位最小的即为淘汰的页面。
提升磁盘I/O速度的其他方法
  • 提前读
    在读取当前块数据的情况下,将下一块数据也读入缓冲区中。
    在一些DBMS中会使用提前读(通常叫动态预读)的方式,DBMS可能注意到select语句正以顺序或或几乎顺序的方式访问索引或表页,于是DBMS 便开始向前多读取几个页。
  • 延迟写
    维护一个空闲缓冲区队列,每次会将缓冲区队列头的数据写回磁盘,将新加入的数据放入缓冲区队列末尾。
  • 优化物理块分布
    存储文件时,将文件所在的物理块在磁盘上连续分布,减少磁头在多个磁道间的无效移动,大大提高两个物理块的连续访问速度。
  • 虚拟盘
    利用内存空间去仿真磁盘,是易失性存储器(断电数据丢失),俗称内存条。通常用于存放临时文件,如编译程序所产生的目标程序等。与高速缓存的区别:虚拟盘中的内容由用户控制,而磁盘高速缓存的内容由OS控制。

参考:
磁盘i/o
http://www.dataguru.cn/article-11561-1.html
顺序随机I/O原理
http://blog.itpub.net/24486203/viewspace-2130182/

<think>好的,我现在需要帮助用户解决关于Ubuntu系统中磁盘I/O日志存储位置及查看方法的问题。首先,我要确认用户的需求是什么。他们想了解在哪里可以找到磁盘I/O相关的日志,以及有哪些工具或方法可以用来查看这些信息。用户提到了dmesg和iostat,可能已经知道这两个工具,但需要更详细的指导。 首先,我应该回忆一下Ubuntu系统中常见的日志位置。系统日志通常存放在/var/log目录下,比如syslog、kern.log等。这些日志文件可能会记录磁盘I/O相关的错误或警告信息。用户可能需要知道具体是哪个文件,所以需要明确说明路径。 接下来是工具部分。用户提到了dmesg和iostat,这两个确实是常用的工具。dmesg用于查看内核环缓冲区中的消息,包括硬件和驱动相关的信息,而iostat属于sysstat包,可以提供磁盘I/O的统计信息。除此之外,还有一些其他工具如iotop、pidstat、dstat、fio等,用户可能也需要了解这些工具的使用方法,以全面监控和分析I/O性能。 需要检查每个工具的具体用法,比如iostat需要安装sysstat,并且可能需要更新间隔和次数参数。dmesg可以通过管道配合grep过滤出相关消息。另外,像iotop这样的工具可以实时显示进程的I/O使用情况,帮助定位高I/O的进程。 用户还可能希望知道如何安装这些工具,比如sysstat的安装命令是sudo apt-get install sysstat,fio的安装方法等。此外,基准测试工具如fio的使用步骤也需要简要说明,以便用户进行性能测试。 在引用部分,需要根据提供的参考资料,正确标注引用标识。例如,pidstat的用法参考了引用[1],iotop和dmesg的问题在引用[2]中提到,dstat在引用[3],fio在引用[4],iostat中的指标在引用[5]。需要确保每个引用准确对应到相关内容。 还需要考虑用户可能的后续问题,比如如何分析I/O性能瓶颈,或者如何优化磁盘I/O,因此生成相关问题时要涵盖这些方面,帮助用户进一步探索解决方案。 最后,要确保回答结构清晰,分点列出存储位置和查看方法,每个工具的使用步骤简明扼要,语法正确,符合用户的要求。同时,生成的相关问题应引导用户深入理解磁盘I/O监控和优化的各个方面。</think>### Ubuntu 系统磁盘 I/O 日志的存储位置及查看方法 #### 1. **磁盘 I/O 日志的存储位置** - **系统日志文件**: Ubuntu 的磁盘 I/O 相关日志通常存储在系统日志文件中,路径为 `/var/log/syslog` 和 `/var/log/kern.log`。这两个文件记录了内核和系统服务的详细事件,包括磁盘 I/O 错误、硬件故障等信息[^2][^5]。 - 使用命令查看: ```bash cat /var/log/syslog | grep -i 'disk\|io\|sdb' ``` - **内核环缓冲区**: 通过 `dmesg` 命令可以直接查看内核输出的实时日志,包括磁盘驱动、I/O 超时等事件,无需依赖持久化存储的日志文件[^2]。 - 示例: ```bash dmesg | grep -i 'io\|sdb' ``` --- #### 2. **磁盘 I/O 监控工具及使用方法** - **`iostat`(sysstat 包)**: 提供磁盘 I/O 的实时统计信息,如吞吐量、IOPS、延迟等。需先安装 `sysstat`: ```bash sudo apt-get install sysstat ``` - 查看实时统计(间隔 2 秒,共 5 次): ```bash iostat -dx 2 5 ``` - 输出字段解析: - `r/s` 和 `w/s`:每秒读写请求数 - `rkB/s` 和 `wkB/s`:每秒读写数据量 - `await`:I/O 平均等待时间。 - **`dmesg`**: 直接查看内核日志中的磁盘事件: ```bash dmesg | grep -i 'io\|disk\|error' ``` - **`iotop`**: 实时监控进程级磁盘 I/O 使用情况,需安装: ```bash sudo apt-get install iotop ``` - 运行后按 `o` 键仅显示活跃 I/O 进程。 - **`pidstat`**: 结合进程和 I/O 统计,查看具体进程的 I/O 负载: ```bash pidstat -d 1 # 每秒刷新一次[^1] ``` - **`dstat`**: 综合性能监控工具,支持实时查看磁盘 I/O: ```bash dstat -d # 显示磁盘读写速率[^3] ``` - **基准测试工具 `fio`**: 用于评估磁盘 I/O 极限性能,例如测试随机读: ```bash sudo apt-get install fio fio --name=randread --ioengine=libaio --rw=randread --bs=4k --numjobs=4 --size=1G --runtime=60 --time_based --end_fsync=1 ``` 可自定义测试模式(顺序/随机、读/写)[^4]。 --- #### 3. **关键场景示例** - **定位高 I/O 进程**: 若系统卡顿,使用 `iotop` 发现 `[flush-8:16]` 和 `[jbd2/sdb2-8]` 占用 99.99% I/O,说明文件系统正在同步日志或元数据,可能是正常行为[^2]。 - **分析历史 I/O 问题**: 检查 `/var/log/syslog` 中是否有 `I/O error` 或 `device reset` 等关键字,结合 `dmesg` 时间戳排查硬件故障。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值