引言
利用碎片时间看书和各种资料小结的一些HDD和SSD磁盘的核心要点,最后LINUX文件系统对于磁盘读写的优化尤为重要,当然在固态硬盘成本大幅度降低的今天,这些内容作为了解和梳理即可。
HDD磁盘介绍
机械磁盘从逻辑结构理解为类似一个同心圆的多个圈,从外层到内层进行编号,磁盘通过顺时针顺序编号,逆时针转动磁盘,这样处理是考虑查找磁盘的时候可以直接按照顺序扫描过去,磁头前进方向就是编号递增方向。
在每一个环上按照一定大小划分磁道,磁头在磁道上滑动扫描数据按照上面的图表所示,一个编号对应一个扇区,而划线的部分就是磁道,注意这是磁盘的俯视图,也就是说线的部分是物理磁盘上的“沟壑”,而扇区就是编号内的块。
注意在HDD磁盘中一个扇区就是最小单位的一次读写,为512字节,而且每一个扇区都是512字节,不管扇区是在外层还是内层。
在最早的磁盘当中可以通过下面的公式计算出整个磁盘的大小,因为磁道和扇区的数量是一一对应的:
存储容量=磁头数磁道(柱面)数每道扇区数*每扇区字节数
但是这样的设计有一个显而易见的问题,那就是无论扇区面积大还是小都是固定大小的外层的扇区数据显然被浪费了。
针对这样的问题后续的机械磁盘出现了改进,这项技术叫做ZBR(Zoned Bit Recording,区位记录)技术,这项技术根据一圈的扇区来划分大小,通一个圈内的扇区分布和大小相同,这意味着越是外层的扇区数量越多,而内圈则较少,在划分之后密度均匀分布。
因为磁盘扇区存储形式的改进,如今的硬盘大多使用[[ LBA(Logical Block Addressing)逻辑块寻址模式]],了解这个寻址模式才能了解磁盘的大小的计算方式。
然而现在HDD的磁盘读写受限在随机读写速度上,过去HDD磁盘比较流行的转速为7200转和5400转等等,区别的话是跑的快和跑的慢一点的蚂蚁,虽然有SAS硬盘能突破15000转,但是还是有研究团队研究寻找不同材料或者其他方式突破磁盘物理转速的限制(比如双磁盘转动的方式加快旋转),然而始终无法突破机械磁盘的设计的物理限制。
市面上为什么主流贩卖7200转的磁盘和5400的转速的磁盘而不是别的磁盘,一方面是7200的随机读写性能经过测试是最佳的,同时讨论一块磁盘的性能不能看顺序读写的速度而是要看随机读写的速度。
针对机械磁盘存在一些物理壁垒,自东芝公司在1984年研究出闪存之后,闪存技术不断进步,又经过了5年之后SSD磁盘逐渐走进历史舞台。
为什么是7200转和5400转等等奇怪数字? 这两个数字都要从3600说起, 计算机的前十年几乎所有的硬盘都是3600转的,这个3600又是从哪里来的呢?因为美国的交流电是60Hz的!于是就有了下面的公式
- 60Hz × 1转/Hz ×60秒/分钟 = 3600转/分钟
- 5400 RPM = 3600 RPM × 1.5
- 7200 RPM = 3600 RPM × 2
另外还有一个原因是专利争夺,你会发现转速有15000却没有10000,9000,8000这种数字,其实都是因为整数和500的倍数转速都被专利注册了,但是专利注册者估计没想到转速能破万把。
数据读取方式
HDD的磁盘读取数据顺序:
- 设备将需要读写的扇区和设备号码以及扫描多少个扇区告诉磁盘
- 移动磁头和转动盘片找到对应扇区
- 读取数据,把数据写入缓冲
- 如果所有的扇区扫描完成,读取的操作则完成了
HDD磁盘读写的要点:
从逻辑上来看计算扇区扫描位置和扫描数量计算处理速度是很快的,将扇区内的数据读取或者写入的数据也是相对较快的,然而我们知道因为转速限制的和磁头和盘片物理扫描是非常慢的,整个读写的性能瓶颈是磁头扇区寻址和扫描磁盘所需的物理磁盘开销以及最后带来的随机读写性能的权衡。
读写方式
磁盘扫描的几种情况磁盘扫描的方式直接决定了数据处理读写速度:
- 顺序扫描:顺序扫描就是在一个磁道上直接划过连续的几个扇区,一次扫描就可以获取数据,非常快
- 多次连续顺序扫描:连续顺序扫描值得是针对连续的几个扇区进行多次扫描,这个时间开销主要是在盘片的转动上,虽然依然比较快但是盘片转动依然会有数据影响。
- 随机读写:随机读写的开销主要在磁盘和磁道寻址上,此时不但可能会产生磁盘转动,磁头还需要寻找扇区,随机读写的效率是非常低的
另外,对于单次IO的访问如果获取的数据量超过磁盘请求数据量的上限,则会讲请求由单次的顺序读写,拆分为多次的顺序扫描。
影响硬盘性能的因素
- 磁盘寻道时间:磁盘的平均寻道时间一般在3-15ms。
- 磁盘转速:转速越快
- 磁盘本身的读写性能:和磁盘的设计厂商也有关系,随机读写强的HDD硬盘通常具备更好的IO性能,同时磁盘数据传输的越快传输量越大效果越好(废话)。
SSD磁盘介绍
SSD 的硬盘分为两种,一种是基于闪存颗粒的闪存固态硬盘,另一种是由于历史原因出现在SSD和HDD之间的DRAM存储介质的硬盘。
闪存颗粒的硬盘也就是我们现代笔记本电脑以及移动固态多数使用的硬盘,这种磁盘的最大优点是可以移动,同时数据的保护不依赖电源就可以存储,在闪存颗粒中通常被分为 QLC,MLC,TLC,QLC,哪怕是寿命最短的QLC硬盘也有5-6年的寿命,而MLC寿命最长,往往可以十几年正常工作。
在服务器使用的固态中通常以MLC为主。SSD磁盘的最大特点是不像是HDD一样受到物理冲击有可能造成整块磁盘不可用,但是SSD一旦损坏数据的修复成本很高或者说根本无法修复。虽然对于现在来看 SSD已经非常便宜了,但是HDD的大数据低成本存储依然很受一些用户欢迎。
DRAM是介于机械磁盘和固态硬盘中间的形式,其采用DRAM作为存储单元,它效仿传统硬盘的设计,可被绝大部分操作系统的文件系统工具进行卷设置和管理,并提供工业标准的PCI和FC接口用于连接主机或者服务器,但是最大问题应用范围相对较窄。
Linux和设备的交互流程
这一个流程图有很多细节可以了解,这里我们以简单了解通用块层,IO调度器和磁盘预读机机制为主。
通用块层
通用块层指的是在Linux系统对于HDD和SSD的抽象,HDD和SDD它们被称为块设备。块设备的访问方式有两种,第一种是直接通过挂载的方式通过设备文件直接进行读写,第二种是根据文件系统对于磁盘进行封装以及提供引导入口,当然大部分的软件使用第二种方式。
由于不同类型的块设备处理方式不同,这些设备的处理的需要依赖驱动程序的控制才能实现访问,但是以我们日常使用Windows系统的经验,不可能是一个块设备一个驱动程序,不然我们每一次加入新硬盘都要装一遍驱动。
所以这些设备的处理最终被放到通用块层实现:
IO调度器和预读机制
在hdd中还有两个十分影响性能的机制,IO调度器和预读机制,但是注意针对hdd的预读要比ssd的预读效果要好很多,因为有时候因为排序和预读导致ssd的负面优化。
IO调度器:
IO调度器是针对块设备访问的时候将请求积攒到一定的时间之后在进行一次请求,所以针对IO调度器主要有下面两个重要的工作:
- 合并:把对于多个扇区的访问IO请求合并为一个请求
- 排序:因为每个扇区都有编号,IO调度器会把连续的扇区访问多IO进行排序之后再进行访问,使得磁盘扫描趋近顺序扫描。
注意:IO调度器一般针对并发线程读写或者异步IO过程中等待IO结果的时候回使用IO调度器,
预读机制:
磁盘的磁头在扫描数据的时候,不会只扫描设备要求的几个扇区,而是会多扫描周边的扇区,注意这个预读只有在顺序扫描的时候发挥作用,当预读机制生效的时候如果发现预读的扇区在下一次访问不会用到,那么直接丢弃即可。