linux基础——磁盘I/O
Posted 爱可可的人生记录仪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux基础——磁盘I/O相关的知识,希望对你有一定的参考价值。
磁盘
磁盘是可以持久化存储的设备,在 Linux 中,磁盘实际上是作为一个块设备来管理的,也就是以块为单位读写数据,并且支持随机读写。每个块设备都会被赋予两个设备号,分别是主、次设备号。主设备号用在驱动程序中,用来区分设备类型;而次设备号则是用来给多个同类设备编号。
通用块层
和VFS类似,Linux 通过一个统一的通用块层,来管理各种不同的块设备。其实是在文件系统和磁盘驱动中间的一个块设备抽象层。有两个功能,1.跟虚拟文件系统的功能类似。向上,为文件系统和应用程序,提供访问块设备的标准接口;向下,把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来管理这些设备的驱动程序。2.通用块层还会给文件系统和应用程序发来的 I/O 请求排队,并通过重新排序、请求合并等方式,提高磁盘读写的效率。I/O排序的过程也被称为IO调度,Linux 内核支持四种 I/O 调度算法,分别是 NONE、NOOP、CFQ 以及 DeadLine。NONE不做处理,NOOP先入先出的队列,常见于SSD。CFQ是现在很多版本的默认调度算法,它为每个进程维护了一个 I/O 调度队列,并按照时间片来均匀分布每个进程的 I/O 请求,适用于大量进程的系统。DeadLine 分别为读、写请求创建了不同的 I/O 队列,可以提高机械磁盘的吞吐量,并确保达到最终期限(deadline)的请求被优先处理,多用在 I/O 压力比较重的场景,比如数据库等。
I/O栈
可以把 Linux 存储系统的 I/O 栈,由上到下分为三个层次,分别是文件系统层、通用块层和设备层。
文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。
通用块层,包括块设备 I/O 队列和 I/O 调度器。它会对文件系统的 I/O 请求进行排队,再通过重新排序和请求合并,然后才要发送给下一级的设备层。
设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。
磁盘性能指标
使用率,是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。
饱和度,是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
IOPS(Input/Output Per Second),是指每秒的 I/O 请求数。
吞吐量,是指每秒的 I/O 请求大小。
响应时间,是指 I/O 请求从发出到收到响应的间隔时间。
性能测试工具fio
磁盘 I/O 观测
iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的使用率、IOPS、吞吐量等各种常见的性能指标,当然,这些指标实际上来自 /proc/diskstats。
注意指标:%util ,就是磁盘 I/O 使用率。r/s+ w/s ,就是 IOPS。rkB/s+wkB/s ,就是吞吐量。r_await+w_await ,就是响应时间。
进程 I/O 观测
pidstat和iotop
参考资料:倪朋飞,Linux性能优化实战
部分内容来自网络,如有侵权请联系作者删除。
以上是关于linux基础——磁盘I/O的主要内容,如果未能解决你的问题,请参考以下文章