0%

机械硬盘写入性能分析

现在SSD越来越普遍了,貌似现在写这个有点晚了。
但是,在一些大批量写入的场景下,机械硬盘的性价比还是比较突出的。
或许有一天,机械硬盘会和软盘一样被遗弃,成为历史。

机械硬盘工作原理

物理结构

特性

在老式的机械硬盘中,每个磁道上的扇区数相同,也就是内侧(靠近转轴)磁道上的扇区较短(密集),而外侧磁道上的扇区较长(稀疏)。这样的优点是寻址(seek)时方便,缺点时浪费空间,因为外侧磁道上可以存放更多的扇区。
所以,在新式的机械硬盘中,外侧磁道上的扇区数比内侧的多。也就使得外侧磁道上读写速度大于内侧磁道

写入性能

  • 磁盘寻道
  • 系统调用
  • 内存拷贝
  • 队列深度
  • BLOCK SIZE
  • CHACHE

文件系统

Linux系统分用户空间和内核空间,一次写入操作需要把用户空间的数据通过系统调用拷贝到内核空间,再由内核调度写入磁盘。
一般系统调用和内存拷贝都需要消耗较多的CPU时间。

IO模型

阻塞 I/O

典型的阻塞式I/O就是直接通过write系统调用写数据。

非阻塞 I/O

非阻塞式I/O和阻塞式I/O的区别就是,非阻塞式I/O的请求会立即返回,而不必等待写入操作完成再返回。

同步 I/O

异步 I/O

在Linux系统上有POSIX AIO和libaio两种异步I/O方式。
POSIX AIO是一个在多个线程中执行正常阻塞I / O的用户级实现,因此给出了I / O是异步的错觉。
Libaio是异步I / O操作的内核支持,其中io请求实际上在内核中排队,根据您拥有的磁盘调度程序排序, (使用TCQ或NCQ)作为异步操作转发(以某种最佳顺序希望)到实际磁盘。
所以从性能的角度考虑,libaio更好一些。

写入方式

fwrite

更加通用的方式,通过在用户空间准备缓冲区,减少系统调用。这种做法一般情况下都会有不错的性能表现。但在高速写入的场景下CPU会成为瓶颈,因为多做了一次内存拷贝。

mmap

将用户空间和内核空间做映射,以减少内存拷贝。而且特别适合随机读写。

DIO

绕过内核缓冲区,直接写入磁盘的方式。这是一把双刃剑,使用起来比较麻烦,而且处理不当的话反而会更慢。

AIO

配合DIO可以达到最大性能。

测试与监控工具

iostat

比较专业的系统I/O观测工具。
排队论

iotop

类似于top命令,方便观测实时I/O速度。

dd

简单的写入性能测试工具。

fio

可以测试硬盘的极限性能。

极限写入性能

使用DIO + AIO + 多线程的方式可以达到极限性能。