队列深度
相对于 CPU 来说,硬盘属于慢速设备,所有操作系统会给每个硬盘分配一个专门的队列用于缓冲 IO 请求。—— 该说法有待考究:磁盘本身是支持并行写入的。队列深度更象是操作系统特性,而非磁盘特性;
在某个时刻,有 N个inflight 的IO 请求,包括在队列中的 IO 请求、磁盘正在处理的 IO 请求。 N就是队列深度。
增加队列深度
加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。加大队列深度 →提高利用率 →获得 IOPS 和MBPS 峰值 →注意响应时间在可接受的范围内。
1)使用异步 IO ,同时发起多个 IO 请求,相当于队列中有多个 IO 请求。
2)多线程发起同步 IO 请求,相当于队列中有多个 IO 请求。
3)增大应用 IO 大小,到达底层之后,会变成多个 IO 请求,相当于队列中有多个 IO 请求队列深度增加了。
常见问题
Q:Queue Depth 决定速度?
A:对磁盘的命令数量也是有重要意义的。而将多个命令批量运行,也是新一代硬盘的功能。当 Queue Depth 增加时,表示更大量文件的 访问或是多个用户对磁盘的访问;
Q:队列深度增加,但是磁盘的性能却下降?
A:队列深度增加了, IO 在队列的等待时间也会增加,导致 IO 响应时间变大,这需要权衡。
磁盘缓存
#!/bin/sh # 查看 hdparm -W /dev/sdxN # 启用 hdparm -W1 /dev/sdxN # 关闭 hdparm -W0 /dev/sdxN
注意:在部分磁盘中,当主机重启后,该配置会被重置。因此在配置后,可根据需要重启主机,以进行验证配置是否会被重置;
硬盘的工作方式
硬盘的工作方式如下:
1)收到 IO 请求,得到地址和数据大小。
2)移动磁头(寻址)。
3)找到相应的磁道(寻址)。
4)读取数据。
5)传输数据。
磁盘的随机 IO 服务时间 = 寻道时间 + 旋转时间 + 传输时间
对于 10000 转速的 SATA 硬盘来说,一般寻道时间是 7 ms ,旋转时间是 3 ms ,64KB 的传输时间是 0.8 ms ,则 SATA 硬盘每秒可以进行随机 IO 操作是 1000/ (7+3+0.8 )=93 。所以,我们估算SATA 硬盘 64KB 随机写的 IOPS 是93 。一般的硬盘厂商都会标明顺序读写的 MBPS (吞吐量)。
我们在列出 IOPS 时,需要说明 IO 大小、寻址空间、读写模式、顺序 /随机和队列深度。一般常用的 IO 大小是 4KB ,这是因为文件系统常用的块大小是 4KB 。
提高性能的方法
硬盘厂商提高硬盘性能的方法主要是降低服务时间(延迟)。
1)提高转速(降低旋转时间和传输时间)。
2)增加 Cache (降低写延迟,但不会提高 IOPS )。
3)提高单磁道密度(变相提高传输时间)。