磁盘层面的操作原理
转载于硬盘的物理格式化与 & 磁盘工作原理与IO性能分析
最近在深入文件系统方面试图寻找分布式文件系统方面有没有能针对特定任务性能突破的点,然后发现对深入到磁盘操作,内核文件系统操作的知识欠缺,读了很多文章,在此做个总结。
机械磁盘结构
无论哪种机械硬盘,都主要由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份组成。其中所有的盘片都固定在一个旋转轴上,这个轴即盘片主轴。而所有盘片之间是绝对平行的,在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离比头发 丝的直径还小。所有的磁头连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向动作,而盘片以每分钟数千转到上万转的速度在高速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作。
机械磁盘工作原理
硬盘在逻辑上被划分为磁头、柱面以及扇区,磁盘上文件的位置也是通过这几个去标识的。
- 盘面 每一个这样的有效盘面都有一个盘面号,在硬盘系 统中,盘面号又叫磁头号。因为每一个有效盘面都有一个对应的读写磁头
- 磁道 磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道。磁道是“看”不见的,只是盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完毕。
- 柱面 所有盘面上的同一磁道构成一个圆柱。因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换,电子切换相当快,比在机械上磁头向邻近磁道移动快得多,所以,数据 的读/写按柱面进行,而不按盘面进行。
- 扇区操作系统以扇区形式将信息存储在硬盘上,每个扇区包括512个字节的数据和一些其他信息。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。
磁盘读写原理
系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。
系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。
相信了解了磁盘工作原理之后,就不难理解为什么磁盘随机读写和顺序读写速度上存在那么大的差距了,因为数据随机存储将会导致磁盘读写数据时多次机械移动磁头臂,移动磁头臂寻找磁道的这个时间称为寻道时间,而一般硬盘的平均寻道时间在7.5~ 14ms,它比盘片旋转寻找扇区的时间还要长(当前磁盘已经可达15000rpm),因此,想要提高磁盘的IO读写性能,需在软件上下功夫,如何减少磁盘的随机读写。这里可以简单列举几个方法:
- 减少文件个数,使用大文件,尤其linux ext系列文件系统
- 数据库表不要存储太大数据,可以采用分表方式减少单表容量,因为表太大数据库索引的原理就会导致磁盘随机读写增多
- 提升每次写磁盘的数据大小,数据先缓存到buffer,等满了或超时了再写磁盘
- 使用fsck.ext4 -fn /dev/sda可以检测磁盘碎片率,利用e4defrag工具手动进行碎片整理
格式化磁盘在做什么?
简单的说,高级格式化就是和操作系统有关的格式化,低级格式化就是和操作系统无关的格式化。高级格式化主要是对硬盘的各个分区进行磁道格式化,在逻辑上划分磁道。而低级格式化是物理级的格式化,主要用于划分硬盘的磁面柱、建立扇区数和选择扇区间隔比。硬盘要先低级格式化后才能高级格式化,刚出厂的硬盘已经经过了低级格式化。一般情况下,只有怀道太多,导致读取数据时出现错误等才进行低级格式化。很多主板的CMOS中都提供了低级格式化的功能,一般在HDDLowLevelFormat选项中。
磁盘控制器、磁盘控制器驱动和磁盘驱动
这三个概念很容易化混淆。
- 磁盘控制器 这个是个物理硬件,与总线连接,类似与PCI/SATA接口
- 磁盘控制器驱动 这个是驱动程序,CPU通过调动该驱动,控制磁盘控制器进而控制磁盘驱动再进而操作手臂等寻址读数据。这个驱动程序就有着块到扇区的映射。
- 磁盘驱动 这是个物理装置,就是磁盘上除了盘面手臂之外的一个控制器,和磁盘是一体的。
三者之间的关系:
- CPU从内存中载入磁盘控制器驱动程序,生成SCSI或ATA指令;
- CPU通过主板上的导线发送SCSI或ATA指令给同样位于主板上的磁盘控制器。
- 磁盘控制器通过线缆将指令发送给磁盘驱动器并维护底层指令交互状态机。
- 磁盘驱动器接受指令控制磁盘驱动器控制电路转动磁头读写磁盘上的数据。
磁盘块,IO Block
扇区是磁盘物理层面的概念,操作系统是不直接与扇区交互的,而是与多个连续扇区组成的磁盘块交互。由于扇区是物理层面的概念,所以无法在系统中进行大小的更改。
文件系统读写数据的最小单位,也叫磁盘簇。扇区是磁盘最小的物理存储单元,操作系统将相邻的扇区组合在一起,形成一个块,对块进行管理。每个磁盘块可以包括2. 4、8、16、32 或 64 个扇区。磁盘块是操作系统所使用的逻辑概念,而非磁盘的物理概念。磁盘块的大小可以通过命令 stat /boot
来查看。
$ sudo stat /boot
File: /boot
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 655361 Links: 3
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-07-06 20:19:45.487160301 +0800
Modify: 2019-07-06 20:19:44.835160301 +0800
Change: 2019-07-06 20:19:44.835160301 +0800
Birth: -
其中 IO Block 就是磁盘块大小,本例中是 4096 Bytes,一般也是 4K。
为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个磁盘块中只能放置一个文件,因此文件所占用的空间,只能是磁盘块的整数倍,那就意味着会出现文件的实际大小,会小于其所占用的磁盘空间的情况。
那么怎么映射磁盘块,就是用磁盘控制器,其作用除了控制读取数据,控制磁头等作用外,还有个功能就是映射扇区和磁盘块的关系。