IO

一、概述 

  IO 系统的分层:

  1、  三层结构

    上图层次比较多,但总的就是三部分。磁盘 (存储)、 VM (volumes management 卷管理)和文件系统 。专有名词不好理解,打个比方说:磁盘就相当于一块待用的空地; LVM 相当于空地上的围墙(把空地划分成多个部分);文件系统则相当于每块空地上建的楼房(决定了有多少房

  间、房屋编号如何,能容纳多少人住);而房子里面住的人,则相当于系统里面存的数据。

  1.1、文件系统—数据如何存放?

     对应了上图的 File System 和 Buffer Cache 。

    File System (文件系统):解决了空间管理的问题 ,即:数据如何存放、读取。

    Buffer Cache :解决数据缓冲的问题。对读,进行 cache ,即:缓存经常要用到的数据;对写,进行buffer ,缓冲一定数据以后,一次性进行写入。

  1.2、VM —磁盘空间不足了怎么办?

    对应上图的 Vol Mgmt 。

    VM 其实跟 IO 没有必然联系。他是处于文件系统和磁盘(存储)中间的一层。 VM 屏蔽了底层磁盘对上层文件系统的影响 。当没有 VM 的时候,文件系统直接使用存储上的地址空间,因此文件系统直接受限于物理硬盘,这时如果发生磁盘空间不足的情况,对应用而言将是一场噩梦,不得不

  新增硬盘,然后重新进行数据复制。而 VM 则可以实现动态扩展,而对文件系统没有影响。另外, VM 也可以把多个磁盘合并成一个磁盘,对文件系统呈现统一的地址空间,这个特性的杀伤力不言而喻。

  1.3、存储—数据放在哪儿?如何访问?如何提高IO 速度?

     对应上图的 Device Driver 、 IO Channel 和 Disk Device

    数据最终会放在这里,因此,效率、数据安全、容灾是这里需要考虑的问题。而提高存储的性能,则可以直接提高物理 IO 的性能

  2. Logical IO vs Physical IO

     逻辑 IO 是操作系统发起的 IO ,这个数据可能会放在磁盘上,也可能会放在内存(文件系统的 Cache )里。

     物理 IO 是设备驱动发起的 IO ,这个数据最终会落在磁盘上。

         逻辑 IO 和物理 IO 不是一一对应的。

  异步IO :由于异步 IO 请求只是写入了缓存,从缓存到硬盘是否成功不可知,因此异步 IO 相当于把一个IO 拆成了两部分,一是发起请求,二是获取处理结果。因此,对应用来说增加了复杂性。但是异步 IO 的性能是所有很好的,而且异步的思想贯穿了 IT 系统方方面面。

二、IO的性能指标

  1、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 则很难计算,而需要根据实际情况进行测试。主要的因素有:

    • 存储系统本身有自己的缓存 。缓存大小直接影响 IOPS ,理论上说,缓存越大能 cache 的东西越多,在 cache 命中率保持的情况下, IOPS 会越高。
    • RAID级别 。不同的 RAID 级别影响了物理 IO 的效率。
    • 读写混合比例 。对读操作,一般只要 cache 能足够大,可以大大减少物理 IO ,而都在 cache 中进行;对写操作,不论 cache 有多大,最终的写还是会落到磁盘上。因此, 100% 写的 IOPS 要越是小于 100% 的读的 IOPS 。同时, 100% 写的 IOPS 大致等同于存储设备能提供的物理的 IOPS 。
    • 一次IO 请求数据量的多少 。一次读写 1KB 和一次读写 1MB ,显而易见,结果是完全不同的。

  当时上面 N 多因素混合在一起以后, IOPS 的值就变得扑朔迷离了。所以,一般需要通过实际应用的测试才能获得。

  2、IO Response Time

    即 IO 的响应时间。 IO 响应时间是从操作系统内核发出一个 IO 请求到接收到 IO 响应的时间。因此, IO Response time 除了包括磁盘获取数据的时间,还包括了操作系统以及在存储系统内部 IO 等待的时间。一般看,随 IOPS 增加,因为 IO 出现等待, IO 响应时间也会随之增加。对一

  个 OLTP 系统, 10ms 以内的响应时间,是比较合理的。下面是一些 IO 性能示例:

    • 一个8K 的 IO 会比一个 64K 的 IO 速度快 ,因为数据读取的少些。
    • 一个64K 的 IO 会比 8 个 8K 的 IO 速度快 ,因为前者只请求了一个 IO 而后者是 8 个 IO 。
    • 串行IO 会比随机 IO  ,因为串行 IO 相对随机 IO 说,即便没有 Cache ,串行 IO 在磁盘处理上也会少些操作。

     需要注意, IOPS 与 IO Response Time 有着密切的联系。一般情况下, IOPS 增加,说明 IO 请求多了, IO Response Time 会相应增加。但是会出现 IOPS 一直增加,但是 IO Response Time 变得非常慢,超过 20ms 甚至几十 ms ,这时候的 IOPS 虽然还在提高,但是意义已经

  不大,因为整个 IO 系统的服务时间已经不可取。

  3、Throughput 即吞吐量

    这个指标衡量标识了最大的数据传输量。如上说明,这个值在顺序访问或者大数据量访问的情况下会比较重要 。尤其在大数据量写的时候。

    吞吐量不像 IOPS 影响因素很多,吞吐量一般受限于一些比较固定的因素,如:网络带宽、 IO 传输接口的带宽、硬盘接口带宽等。一般他的值就等于上面几个地方中某一个的瓶颈。

 三、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 等:

      • 直接索引:直接指向实际内容信息,公有 12 个。因此如果,一个文件系统 block size 为 1k ,那么直接索引到的内容最大为 12k  
      • 间接索引
      • 两级间接索引 三级间接索引
     

    Directory 代表了文件系统中的目录,包括了当前目录中的所有 Inode 信息。其中每行只有两个信息,一个是文件名,一个是其对应的 Inode 。需要注意, Directory 不是文件系统中的一个特殊结构,他实际上也是一个文件,有自己的 Inode ,而它的文件内容信息里面,包括了上面看到的

  那些文件名和 Inode 的对应关系。如下图:

    Data Block 即存放文件的时间内容块。 Data Block 大小必须为磁盘的数据块大小的整数倍,磁盘一般为 512 字节,因此Data Block 一般为 1K 、 2K 、 4K 。

五、Buffer & Cache

    虽然 Buffer 和 Cache 放在一起了,但是在实际过程中 Buffer 和 Cache 是完全不同了。 Buffer 一般对于写而言,也叫“缓冲区”,缓冲使得多个小的数据块能够合并成一个大数据块,一次性写入; Cache 一般对于读而且,也叫“缓存”,避免频繁的磁盘读取。如图为 Linux 的 free 命令,

  其中也是把 Buffer 和 Cache 进行区分,这两部分都算在了 free 的内存。

  Buffer Cache

    Buffer Cache 中的缓存,本质与所有的缓存都是一样,数据结构也是类似,下图为 VxSF 的一个 Buffer Cache 结构。
  

      这个数据结构与 memcached 和 Oracle SGA 的 buffer 何等相似。左侧的 hash chain 完成数据块的寻址,上方的的链表记录了数据块的状态。

六、块设备、字符设备、裸设备

  •  块设备能支持缓冲和随机读写 。即读取和写入时,可以是任意长度的数据。最小为 1byte 。对块设备,你可以成功执行下列命令: dd if=/dev/zero of=/dev/vg01/lv bs=1  count=1 。即:在设备中写入一个字节。硬件设备是不支持这样的操作的(最小是 512 ),这个时候,操作系统首先完成一个读取(如 1K ,操作系统最小的读写单位,为硬件设备支持的数据块的整数倍),再更改这 1k 上的数据,然后写入设备。
  • 字符设备只能支持固定长度数据的读取和写入 ,这里的长度就是操作系统能支持的最小读写单位,如 1K ,所以块设备的缓冲功能,这里就没有了,需要使用者自己来完成。由于读写时不经过任何缓冲区,此时执行 dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1 ,这个命令将会出错,因为这里的 bs ( block size )太小,系统无法支持。如果执行 dd if=/dev/zero of=/dev/vg01/lv bs=1024  count=1 ,则可以成功。这里的 block size 有 OS 内核参数决定。
  • 裸设备也叫裸分区,就是没有经过格式化、没有文件系统的一块存储空间。可以写入二进制内容,但是内容的格式、其中信息的组织等问题,需要使用它的人来完成。文件系统就是建立在裸设备之上,并完成裸设备空间的管理。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值