iostat可以查看linux系统的io数据,基本使用可以看《Linux iostat监测IO状态》,这里摘录一下参数和底层的对应。 iostat性能数据来自/proc/diskstats,磁盘列表数据来自/etc/mtab
相关参数列表
读 | 写 | |
完成的merge的操作数目 | rrqm/s | wrqm/s |
完成的I/O操作数目 | r/s | w/s |
每秒扇区操作数 | rsec/s | wsec/s |
每秒读/写K字节数 | rkB/s | wkB/s |
平均请求扇区的大小 | avgrq-sz | |
平均I/O队列长度 | avgqu-sz | |
平均每次设备I/O操作的等待时间(毫秒) | await | |
平均每次设备I/O操作的服务时间(毫秒) | svctm |
I/O流程图
下图展示了应用的读写调用到写入磁盘的过程以及参数的检测位置:
问题:
为什么在os buffer下来的io是r/s+rrqm和w/s+wrqm呢?
rrqm是在io调度层,当发现io和前面队列中io可以合并,就合并到队列中。因此,在os buffer时的io数量到io调度层后,io数量其实变少了。
r/s和w/s的值为什么比rsec和wsec小?
rs和ws是和物理设备交互(控制器)的次数,rsec和wsec是Linux的一种计数,也就是扇区。图上说,从块设备开始往下都是512字节大小。这个512字节就是扇区大小,这是Linux内核中写死的。到最下层,写物理设备时,每次io不一定就是512字节的,因为大部分物理存储设备都已经不是512字节一个物理块了。因此一个rs可能是多rsec。那么rs的值要小于rsec也就正常了。
avgrq就是(wsec+rsec)/(ws+rs)的值,可以反映出每次io读/写物理设备的sec大小。
总结:
- await和svctm的差很大时,注意操作系统I/O调度的性能。
- fread()是C标准函数,有用户级缓存,内部调用read()。read()是系统函数,有系统缓存。注意区别。
- merge操作位于系统I/O调度层,当操作系统发现不同的读取请求读取的是相同sector的数据,FIleSystem会将这个请求合并。
- 扇区(Sector)是驱动操作的最小单位,是磁盘级别的,可通过 fdisk -l 查看扇区大小。簇(Cluster)也称作块(Block),是文件系统的最小单位,由文件系统定义,可通过 blockdev –getbsz /dev/<dev> 查看。通常block大小是Sector的倍数。
- I/O调度算法:CFQ(完全公平排队I/O调度程序) NOOP(无操作调度程序) Deadline(截止时间调度程序) AS(预料I/O调度程序)。
以上部分内容摘自《磁盘IO满负荷性能分析 》
转载请注明:旅途@KryptosX » iostat和linux的I/O过程
时间: 2024-11-02 14:24:52