1、概述 node
IO 系统的分层:linux
上图层次比较多,但总的就是三部分。磁盘 (存储)、 VM (volumes management 卷管理)和文件系统 。专有名词很差理解,打个比方说:磁盘就至关于一块待用的空地; LVM 至关于空地上的围墙(把空地划分红多个部分);文件系统则至关于每块空地上建的楼房(决定了有多少房数据库
间、房屋编号如何,能容纳多少人住);而房子里面住的人,则至关于系统里面存的数据。缓存
1.一、文件系统—数据如何存放?安全
对应了上图的 File System 和 Buffer Cache 。网络
File System (文件系统):解决了空间管理的问题 ,即:数据如何存放、读取。数据结构
Buffer Cache :解决数据缓冲的问题。对读,进行 cache ,即:缓存常常要用到的数据;对写,进行buffer ,缓冲必定数据之后,一次性进行写入。异步
1.二、VM —磁盘空间不足了怎么办?memcached
对应上图的 Vol Mgmt 。性能
VM 其实跟 IO 没有必然联系。他是处于文件系统和磁盘(存储)中间的一层。 VM 屏蔽了底层磁盘对上层文件系统的影响 。当没有 VM 的时候,文件系统直接使用存储上的地址空间,所以文件系统直接受限于物理硬盘,这时若是发生磁盘空间不足的状况,对应用而言将是一场噩梦,不得不
新增硬盘,而后从新进行数据复制。而 VM 则能够实现动态扩展,而对文件系统没有影响。另外, VM 也能够把多个磁盘合并成一个磁盘,对文件系统呈现统一的地址空间,这个特性的杀伤力不言而喻。
1.三、存储—数据放在哪儿?如何访问?如何提升IO 速度?
对应上图的 Device Driver 、 IO Channel 和 Disk Device
数据最终会放在这里,所以,效率、数据安全、容灾是这里须要考虑的问题。而提升存储的性能,则能够直接提升物理 IO 的性能
逻辑 IO 是操做系统发起的 IO ,这个数据可能会放在磁盘上,也可能会放在内存(文件系统的 Cache )里。
物理 IO 是设备驱动发起的 IO ,这个数据最终会落在磁盘上。
逻辑 IO 和物理 IO 不是一一对应的。
异步IO :因为异步 IO 请求只是写入了缓存,从缓存到硬盘是否成功不可知,所以异步 IO 至关于把一个IO 拆成了两部分,一是发起请求,二是获取处理结果。所以,对应用来讲增长了复杂性。可是异步 IO 的性能是全部很好的,并且异步的思想贯穿了 IT 系统方方面面。
一、IOPS ,即每秒钟处理的 IO 请求数量。 IOPS 是随机访问类型业务( OLTP 类 )很重要的一个参考指标;
一块物理硬盘能提供多少 IOPS ?
从磁盘上进行数据读取时,比较重要的几个时间是:寻址时间 (找到数据块的起始位置),旋转时间 (等待磁盘旋转到数据块的起始位置),传输时间 (读取数据的时间和返回的时间)。其中寻址时间是固定的(磁头定位到数据的存储的扇区便可),旋转时间受磁盘转速的影响,传输时间受
数据量大小的影响和接口类型的影响(不用硬盘接口速度不一样),可是在随机访问类业务中,他的时间也不多。所以,在硬盘接口相同的状况下, IOPS主要受限于寻址时间和传输时间。
OS 的一次 IO 请求对应物理硬盘一个 IO吗?
在没有文件系统、没有VM(卷管理)、没有RAID,没有存储设备的状况下,这个答案仍是成立的。可是当这么多中间层加进去之后,这个答案就不是这样了。物理硬盘提供的 IO 是有限的,也是整个 IO 系统存在瓶颈的最大根源。因此,若是一块硬盘不能提供,那么多块在一块儿并行处理,
这不就好了吗?确实是这样的。能够看到,越是高端的存储设备的 cache 越大,硬盘越多,一方面经过cache 异步处理IO ,另外一方面经过盘数增长,尽量把一个OS 的IO 分布到不一样硬盘上,从而提升性能 。文件系统则是在 cache 上会影响,而 VM则多是一个 IO 分布到多个不一样设备上( Striping )。
因此,一个 OS 的IO 在通过多个中间层之后,发生在物理磁盘上的IO 是不肯定的。多是一对一个,也可能一个对应多个 。
IOPS 能算出来吗?
对单块磁盘的 IOPS 的计算没有没问题,可是当系统后面接的是一个存储系统时、考虑不一样读写比例, IOPS 则很难计算,而须要根据实际状况进行测试。主要的因素有:
当时上面 N 多因素混合在一块儿之后, IOPS 的值就变得扑朔迷离了。因此,通常须要经过实际应用的测试才能得到。
二、IO Response Time
即 IO 的响应时间。 IO 响应时间是从操做系统内核发出一个 IO 请求到接收到 IO 响应的时间。所以, IO Response time 除了包括磁盘获取数据的时间,还包括了操做系统以及在存储系统内部 IO 等待的时间。通常看,随 IOPS 增长,由于 IO 出现等待, IO 响应时间也会随之增长。对一
个 OLTP 系统, 10ms 之内的响应时间,是比较合理的。下面是一些 IO 性能示例:
须要注意, IOPS 与 IO Response Time 有着密切的联系。通常状况下, IOPS 增长,说明 IO 请求多了, IO Response Time 会相应增长。可是会出现 IOPS 一直增长,可是 IO Response Time 变得很是慢,超过 20ms 甚至几十 ms ,这时候的 IOPS 虽然还在提升,可是意义已经
不大,由于整个 IO 系统的服务时间已经不可取。
三、Throughput 即吞吐量
这个指标衡量标识了最大的数据传输量。如上说明,这个值在顺序访问或者大数据量访问的状况下会比较重要 。尤为在大数据量写的时候。
吞吐量不像 IOPS 影响因素不少,吞吐量通常受限于一些比较固定的因素,如:网络带宽、 IO 传输接口的带宽、硬盘接口带宽等。通常他的值就等于上面几个地方中某一个的瓶颈。
3、IO中的概念:
IO Chunk Size
即单个 IO 操做请求数据的大小。一次 IO 操做是指从发出 IO 请求到返回数据的过程。 IO Chunk Size 与应用或业务逻辑有着很密切的关系。好比像 Oracle 一类数据库,因为其 block size 通常为 8K ,读取、写入时都此为单位,所以, 8K 为这个系统主要的 IO Chunk Size 。
IO Chunk Size小,考验的是 IO 系统的 IOPS 能力; IO Chunk Size 大,考验的时候 IO 系统的 IO 吞吐量。
Queue Deep
熟悉数据库的人都知道, SQL 是能够批量提交的,这样能够大大提升操做效率。 IO 请求也是同样, IO 请求能够积累必定数据,而后一次提交到存储系统,这样一些相邻的数据块操做能够进行合并,减小物理 IO 数。并且Queue Deep 如其名,就是设置一块儿提交的 IO 请求数量的。
通常 Queue Deep 在 IO 驱动层面上进行配置。Queue Deep 与 IOPS 有着密切关系。 Queue Deep 主要考虑批量提交 IO 请求,天然只有 IOPS 是瓶颈的时候才会有意义,若是 IO 都是大 IO ,磁盘已经成瓶颈, Queue Deep 意义也就不大了。通常来讲, IOPS 的峰值会随着 Queue
Deep 的增长而增长 ( 不会很是显著 ) , Queue Deep 通常小于 256 。
随机访问(随机IO )、顺序访问(顺序IO )
随机访问的特色是每次 IO 请求的数据在磁盘上的位置跨度很大 (如:分布在不一样的扇区),所以 N个 很是小的 IO 请求(如: 1K ),必须以 N 次 IO 请求才能获取到相应的数据。
顺序访问的特色跟随机访问相反,它请求的数据在磁盘的位置是连续的 。当系统发起 N个 很是小的 IO 请求(如: 1K )时,由于一次 IO 是有代价的,系统会取完整的一块数据(如 4K 、 8K ),因此当第一次 IO 完成时,后续 IO 请求的数据可能已经有了。这样能够减小 IO 请求的次数。
这也就是所谓的预取。
随机访问和顺序访问一样是有应用决定的。如数据库、小文件的存储的业务,大可能是随机 IO 。而视频类业务、大文件存取,则大多为顺序 IO 。
linux 下文件系统的结构,其中 VFS ( Virtual File System )是 Linux Kernel 文件系统的一个模块,简单看就是一个 Adapter ,对下屏蔽了下层不一样文件系统之间的差别,对上为操做系统提供了统一的接口 .中间部分为各个不一样文件系统的实现。再往下是 Buffer Cache 和 Driver 。
文件系统的结构
各类文件系统实现方式不一样,所以性能、管理性、可靠性等也有所不一样。下面为 Linux Ext2 ( Ext3 )的一个大体文件系统的结构。
Boot Block 存放了引导程序;
super Block存放了整个文件系统的一些全局参数,如:卷名、状态、块大小、块总数等,在mount时候,这些信息被载入内存,umount时被释放;
上图描述了 Ext2 文件系统中很重要的三个数据结构和他们之间的关系。
Inode : Inode 是文件系统中最重要的一个结构。如图,他里面记录了文件相关的全部信息,也就是咱们常说的 meta 信息。包括:文件类型、权限、全部者、大小、 atime 等:
Directory 表明了文件系统中的目录,包括了当前目录中的全部 Inode 信息。其中每行只有两个信息,一个是文件名,一个是其对应的 Inode 。须要注意, Directory 不是文件系统中的一个特殊结构,他实际上也是一个文件,有本身的 Inode ,而它的文件内容信息里面,包括了上面看到的
那些文件名和 Inode 的对应关系。以下图:
Data Block 即存放文件的时间内容块。 Data Block 大小必须为磁盘的数据块大小的整数倍,磁盘通常为 512 字节,所以Data Block 通常为 1K 、 2K 、 4K 。
虽然 Buffer 和 Cache 放在一块儿了,可是在实际过程当中 Buffer 和 Cache 是彻底不一样了。 Buffer 通常对于写而言,也叫“缓冲区”,缓冲使得多个小的数据块可以合并成一个大数据块,一次性写入; Cache 通常对于读并且,也叫“缓存”,避免频繁的磁盘读取。如图为 Linux 的 free 命令,
其中也是把 Buffer 和 Cache 进行区分,这两部分都算在了 free 的内存。
Buffer Cache
Buffer Cache 中的缓存,本质与全部的缓存都是同样,数据结构也是相似,下图为 VxSF 的一个 Buffer Cache 结构。
这个数据结构与 memcached 和 Oracle SGA 的 buffer 何等类似。左侧的 hash chain 完成数据块的寻址,上方的的链表记录了数据块的状态。