对于不同类型的磁盘,顺序读写均优于随机读写,且4K对齐读写效率更高。但是其中的原因却不尽相同。

机械硬盘

IO方式 :顺序读写 > 随机读写

机械硬盘寻道时间无法忽略,顺序读写减少了磁盘寻道的时间。顺序读写在操作系统页缓存的作用(预读和回写)下,也会有更高的读写效率。

IO单位 :64KB >= 4KB > 1KB
  1. IO单位越大,读写相同的数据,系统调用的次数就越少
  2. 读操作:在机械硬盘的时代,在读取数据少的时候,很可能寻道时间远超过传输时间,那么基本上就是读取次数固定,比如硬盘如果iops是100,那么用1KB的块读,就是100KB/s,用64KB的块读,就是6.4MB/s。上述针对随机读,如果是顺序读,则由于操作系统预读取,读取速率不会差别太大,但是有大量系统调用的效率消耗。
  3. 写操作:磁盘IO单位是block(4k),写入1kb也会写入4KB,所以写入1kb的消耗与4kb相同。而且写入1kb会破坏顺序写,接着写入时,磁头需要倒回找到上一个block的起点,读取上一个block到内存中进行修改再写入。64kb的写入可以顺序写入多个block,避免了随机4kb写入,同时一定程度上保证了存储的连续性,在操作系统的预读取的作用下也会有更好的读取效率。

固态硬盘

SSD相对与机械磁盘,没有寻道时间。

IO方式 :顺序读写 > 随机读写

顺序读的优势在于:操作系统的利用页缓存预加载的能力,可以将多次IO转换为一次IO。
其顺序写的优势除了操作系统页缓存的作用外(将写入缓存在页缓存中,从而合并对于一个Block的写入,减少IO次数),还有:减少SSD的垃圾回收消耗。闪存不支持in-place update:你更新一个数据,不可以直接在原有数据上改,而要写到新的空白的地方,并把原有数据标记为失效。参考:

IO单位 :64KB >= 4KB > 1KB
  1. IO单位越大,读写相同的数据,系统调用的次数就越少
  2. 读操作:4KB > 1KB是因为磁盘最小IO单位是1KB,读取1KB的时间和4KB的时间相同,实际上读取1KB也会读取4KB到内存中,所以这里主要是减少系统调用的次数。64KB>=4KB是因为减少系统调用和IO次数,多读取的数据作为缓存(当然这是指这64KB在磁盘上顺序存储,且都对应用程序有用的情况)。
  3. 写操作:SSD读写以page为单位4KB,所以即使你读写的数据量小于4KB,那么也会读写4KB数据。所以写1kb也会占用一个page,而且接着写入时需要擦除上一个不满的page,造成GC消耗。在SSD中64KB写比4KB写快是因为,4KB写导致盘片内部数据较乱,gc消耗大。

4kb对齐

4KB填补对于当前的这次写入是没有副作用的(也就多copy<4k的数据),对于下一次写入也是没有副作用的,但是如果下一次写入是这种情况,就会因为填补而少写一个4k;

VHD的随机读写性能测试 java 随机读写4k_缓存