磁盘
代码语言:txt复制作者: 张首富
时间: 2021-05-24
w x: y18163201
什么是磁盘?
磁盘(disk)是指利用磁记录技术存储数据的存储器.
磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。--摘自百度百科。
磁盘的发展历程
时间 | 发展内容 |
---|---|
1956年 | IBM的IBM 305 RAMAC是现代硬盘的雏形,它相当于两个冰箱的体积,不过其存储容量只有5MB。 |
1973年 | 这一年IBM 3340问世,它拥有“温彻斯特”这个绰号,来源于它的两个30MB存储单元,恰好是当时出名的“温彻斯特来福枪”的口径和填弹量。至此,硬盘的基本架构被确立。 |
1980年 | 两位前IBM员工创立的公司开发出5.25英寸规格的5MB硬盘ST506,这是首款面向台式机的产品,而该公司正是希捷科技公司(Seagate)。 |
1980年代末 | IBM推出MR(Magneto Resistive磁阻)技术令磁头灵敏度大大提升,使盘片的存储密度较之前的20Mbpsi(bit/每平方英寸)提高数十倍,该技术为硬盘容量的巨大提升奠定基础。1991年,IBM应用该技术推出首款3.5英寸的1GB硬盘。 |
1970年到1991年 | 硬盘碟片的存储密度以每年25%~30%的速度增长;从1991年开始增长到60%~80%;至今,速度提升到100%甚至是200%。从1997年开始的惊人速度提升得益于IBM的GMR(Giant Magneto Resistive,巨磁阻)技术,它使磁头灵敏度进一步提升,进而提高了存储密度。 |
1993年 | 康诺(Conner Peripherals)推出CP30344硬盘容量是340MB。 |
1995年 | 为了配合Intel的LX芯片组,昆腾与Intel携手发布UDMA 33接口——EIDE标准将原来接口数据传输率从16.6MB/s提升到了33MB/s同年,希捷开发出液态轴承(FDB,Fluid Dynamic Bearing)电动机。所谓的FDB就是指将陀螺仪上的技术引进到硬盘生产中,用厚度相当于头发直径十分之一的油膜取代金属轴承,减轻硬盘噪音与发热量。 |
1996年 | 希捷收购康诺(Conner Peripherals)。 |
1998年2月 | UDMA 66规格面世。 |
2000年10月 | 迈拓(Maxtor)收购昆腾。 |
2003年1月 | 日立宣布完成20.5亿美元的收购IBM硬盘事业部项目,并成立日立环球存储科技公司(Hitachi Global Storage Technologies, Hitachi GST)。 |
2005年 | 日立环储和希捷都宣布了将开始大量采用磁盘垂直写入技术(perpendicular recording),该原理是将平行于盘片的磁场方向改变为垂直(90度),更充分地利用的存储空间。 |
2005年12月21日 | 希捷宣布收购迈拓(Maxtor)。 |
2007年1月 | 日立环球存储科技宣布将会发售全球首只1Terabyte的硬盘,比原先的预定时间迟了一年多。硬盘的售价为399美元,平均每美分可以购得27.5MB硬盘空间。 |
2011年3月 | 西部数据以43亿美元的价格,收购日立环球存储科技[8]。 |
2011年4月 | 希捷宣布与三星强化策略伙伴关系,传统的硬盘逐渐地被固态硬盘所取代。[9]。 |
2011年12月 | 希捷宣布收购了三星旗下的硬盘业务[10]。 |
---摘自维基百科。
目前主要使用的磁盘类型
按照硬盘材质来划分
按照硬盘材质来划分主要分为两大类: HDD(hard Disk Driver)、SSD(solid State Disk)
HDD 机械硬盘
机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。
磁头可沿盘片的半径方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操作。信息通过离磁性表面很近的磁头,由电磁流来改变极性方式被电磁流写到磁盘上,信息可以通过相反的方式读取。硬盘作为精密设备,尘埃是其大敌,所以进入硬盘的空气必须过滤。
SSD 固态硬盘
用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。被广泛应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空、导航设备等领域。
SSD 和 HDD 的对比
1、防震抗摔性:机械硬盘都是磁碟型的,数据储存在磁碟扇区里。而固态硬盘是使用闪存颗粒(即内存、MP3、U盘等存储介质)制作而成,所以SSD固态硬盘内部不存在任何机械部件,这样即使在高速移动甚至伴随翻转倾斜的情况下也不会影响到正常使用,而且在发生碰撞和震荡时能够将数据丢失的可能性降到最小。相较机械硬盘,固硬占有绝对优势。
2、数据存储速度:机械硬盘的速度约为120MB/S,SATA协议的固态硬盘速度约为500MB/S,NVMe协议(PCIe 3.0×2)的固态硬盘速度约为1800MB/S,NVMe协议(PCIe 3.0×4)的固态硬盘速度约为3500MB/S。
3、功耗:固态硬盘的功耗上也要低于机械硬盘。
4、重量:固态硬盘在重量方面更轻,与常规1.8英寸硬盘相比,重量轻20-30克。
5、噪音:由于固硬属于无机械部件及闪存芯片,所以具有了发热量小、散热快等特点,而且没有机械马达和风扇。
按照接口来划分
目前磁盘类型通过接口划分主要有下面几种:IDE、SATA、SCSI、SAS、FC、SSD
IDE 类型
IDE是俗称的并口;
IDE(Integrated Drive Electronics集成驱动器电子)的缩写,它的本意是指把控制器与盘体集成在一起的硬盘驱动器,是一种硬盘的传输接口,它有另一个名称叫做ATA(Advanced Technology Attachment),这两个名词都有厂商在用,指的是相同的东西。
IDE的规格后来有所进步,而推出了EIDE(Enhanced IDE)的规格名称,而这个规格同时又被称为Fast ATA。所不同的是Fast ATA是专指硬盘接口,而EIDE还制定了连接光盘等非硬盘产品的标准。而这个连接非硬盘类的IDE标准,又称为ATAPI接口。而之后再推出更快的接口,名称都只剩下ATA的字样,像是Ultra ATA、ATA/66、ATA/100等。
早期的IDE接口有两种传输模式,一个是PIO(Programming I/O)模式,另一个是DMA(Direct Memory Access)。虽然DMA模式系统资源占用少,但需要额外的驱动程序或设置,因此被接受的程度比较低。后来在对速度要求愈来愈高的情况下,DMA模式由于执行效率较好,操作系统开始直接支持,而且厂商更推出了愈来愈快的DMA模式传输速度标准。而从英特尔的430TX芯片组开始,就提供了对Ultra DMA 33的支持,提供了最大33MB/sec的的数据传输率,以后又很快发展到了ATA 66,ATA 100以及迈拓提出的ATA 133标准,分别提供66MB/sec,100MB/sec以及133MB/sec的最大数据传输率。值得注意的是,迈拓提出的ATA 133标准并没能获得业界的广泛支持,硬盘厂商中只有迈拓自己才采用ATA 133标准,而日立(IBM),希捷和西部数据则都采用ATA 100标准,芯片组厂商中也只有VIA,SIS,ALi以及nViidia对次标准提供支持,芯片组厂商中英特尔则只支持ATA 100标准。
各种IDE标准都能很好的向下兼容,例如ATA 133兼容ATA 66/100和Ultra DMA33,而ATA 100也兼容Ultra DMA 33/66。
要特别注意的是,对ATA 66以及以上的IDE接口传输标准而言,必须使用专门的80芯IDE排线,其与普通的40芯IDE排线相比,增加了40条地线以提高信号的稳定性。
接口展示
SATA类型
SATA(Serial ATA)口的硬盘又叫串口硬盘;
2001年,由Intel、APT、Dell、IBM、希捷、迈拓这几大厂商组成的Serial ATA委员会正式确立了Serial ATA 1.0规范
2002年,虽然串行ATA的相关设备还未正式上市,但Serial ATA委员会已抢先确立了Serial ATA 2.0规范(SATA II)。
Serial ATA采用串行连接方式,串行ATA总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。串行接口还具有结构简单、支持热插拔的优点。
串口硬盘是一种完全不同于并行ATA的新型硬盘接口类型,由于采用串行方式传输数据而知名。相对于并行ATA来说,就具有非常多的优势。
a, Serial ATA以连续串行的方式传送数据,一次只会传送1位数据。这样能减少SATA接口的针脚数目,使连接电缆数目变少,效率也会更高。 b, 实际上,Serial ATA 仅用四支针脚就能完成所有的工作,分别用于连接电缆、连接地线、发送数据和接收数据,同时这样的架构还能降低系统能耗和减小系统复杂性。 c, Serial ATA的起点更高、发展潜力更大,Serial ATA 1.0定义的数据传输率可达150MB/s;这比最快的并行ATA(即ATA/133)所能达到133MB/s的最高数据传输率还高;而在Serial ATA 2.0的数据传输率达到300MB/s;最终SATA将实现600MB/s的最高数据传输率。
在选购主板时,其实并无必要太在意IDE接口传输标准有多快,其实在ATA 100,ATA 133以及SATA 150下硬盘性能都差不多,因为受限于硬盘的机械结构和数据存取方式,硬盘的性能瓶颈是硬盘的内部数据传输率而非外部接口标准,目前主流硬盘的内部数据传输率离ATA 100的100MB/sec都还差得很远。所以要按照自己的具体需求选购。
接口展示
SATA II类型
SATA的速度是每秒1.5Gbps(150MB/sec),SATA2(Serial ATA 2.0规范)的速度是每秒3Gbps(300MB/sec)。SATAⅡ接口主板能插SATA硬盘,SATA接口主板不能插SATAⅡ盘硬,这都是向下兼容的。
SATA II是在SATA的基础上发展起来的,其主要特征是外部传输率从SATA的1.5G进一步提高到了3G,此外还包括NCQ(Native Command Queuing,原生命令队列)、端口多路器(Port Multiplier)、交错启动(Staggered Spin-up)等一系列的技术特征。单纯的外部传输率达到3Gbps并不是真正的SATA II。
SATA II的关键技术就是3Gbps的外部传输率和NCQ技术。 NCQ技术可以对硬盘的指令执行顺序进行优化,避免像传统硬盘那样机械地按照接收指令的先后顺序移动磁头读写硬盘的不同位置,与此相反,它会在接收命令后对其进行排序,排序后的磁头将以高效率的顺序进行寻址,从而避免磁头反复移动带来的损耗,延长硬盘寿命。
另外并非所有的SATA硬盘都可以使用NCQ技术,除了硬盘本身要支持 NCQ之外,也要求主板芯片组的SATA控制器支持NCQ。此外,NCQ技术不支持FAT文件系统,只支持NTFS文件系统。
由于SATA设备市场比较混乱,不少SATA设备提供商在市场宣传中滥用“SATA II”的现象愈演愈烈,例如某些号称“SATA II”的硬盘却仅支持3Gbps而不支持NCQ,而某些只具有1.5Gbps的硬盘却又支持NCQ。所以,由希捷(Seagate)所主导的SATA-IO(Serial ATA International Organization,SATA国际组织,原SATA工作组)又宣布了SATA 2.5规范,收录了原先SATA II所具有的大部分功能——从3Gbps和NCQ到交错启动(Staggered Spin-up)、热插拔(Hot Plug)、端口多路器(Port Multiplier)以及比较新的eSATA(External SATA,外置式SATA接口)等等。
值得注意的是,部分采用较早的仅支持1.5Gbps的南桥芯片(例如VIA VT8237和NVIDIA nForce2 MCP-R/MCP-Gb)的主板在使用SATA II硬盘时,可能会出现找不到硬盘或蓝屏的情况。不过大部分硬盘厂商都在硬盘上设置了一个速度选择跳线,以便强制选择1.5Gbps或3Gbps的工作模式(少数硬盘厂商则是通过相应的工具软件来设置),只要把硬盘强制设置为1.5Gbps,SATA II硬盘照样可以在老主板上正常使用。
SATA硬盘在设置RAID模式时,一般都需要安装主板芯片组厂商所提供的驱动,但也有少数较老的SATA RAID控制器在打了最新补丁的某些版本的Windows XP系统里不需要加载驱动就可以组建RAID。
SCSI 类型
SCSI的英文全称为“Small Computer System Interface”(小型计算机系统接口),是同IDE(ATA)完全不同的接口,IDE接口是普通PC的标准接口,而SCSI并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术。SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点,但较高的价格使得它很难如IDE硬盘般普及,因此SCSI硬盘主要应用于中、高端服务器和高档工作站中。
接口展示
SAS 类型
SAS(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术。和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。
SAS的接口技术可以向下兼容SATA。具体来说,二者的兼容性主要体现在物理层和协议层的兼容。
a). 在物理层,SAS接口和SATA接口完全兼容,SATA硬盘可以直接使用在SAS的环境中,从接口标准上而言,SATA是SAS的一个子标准,因此SAS控制器可以直接操控SATA硬盘,但是SAS却不能直接使用在SATA的环境中,因为SATA控制器并不能对SAS硬盘进行控制; b). 在协议层,SAS由3种类型协议组成,根据连接的不同设备使用相应的协议进行数据传输。其中串行SCSI协议(SSP)用于传输SCSI命令;SCSI管理协议(SMP)用于对连接设备的维护和管理;SATA通道协议(STP)用于SAS和SATA之间数据的传输。因此在这3种协议的配合下,SAS可以和SATA以及部分SCSI设备无缝结合。
(Backplane)既可以连接具有双端口、高性能的SAS驱动器,也可以连接高容量、低成本的SATA驱动器。所以SAS驱动器和SATA驱动器可以同时存在于一个存储系统之中。但需要注意的是,SATA系统并不兼容SAS,所以SAS驱动器不能连接到SATA背板上。由于SAS系统的兼容性,使用户能够运用不同接口的硬盘来满足各类应用在容量上或效能上的需求,因此在扩充存储系统时拥有更多的弹性,让存储设备发挥最大的投资效益。
在系统中,每一个SAS端口可以最多可以连接16256个外部设备,并且SAS采取直接的点到点的串行传输方式,传输的速率高达3Gbps,估计以后会有6Gbps乃至12Gbps的高速接口出现。
SAS的接口也做了较大的改进,它同时提供了3.5英寸和2.5英寸的接口,因此能够适合不同服务器环境的需求。
SAS依靠SAS扩展器来连接更多的设备,目前的扩展器以12端口居多,不过根据板卡厂商产品研发计划显示,未来会有28、36端口的扩展器引入,来连接SAS设备、主机设备或者其他的SAS扩展器。
和传统并行SCSI接口比较起来,SAS不仅在接口速度上得到显著提升(现在主流Ultra 320 SCSI速度为320MB/sec,而SAS才刚起步速度就达到300MB/sec,未来会达到600MB/sec甚至更多),而且由于采用了串行线缆,不仅可以实现更长的连接距离,还能够提高抗干扰能力,并且这种细细的线缆还可以显著改善机箱内部的散热情况。
SAS目前的不足主要有以下方面
硬盘、控制芯片种类少:
只有希捷、迈拓以及富士通等为数不多的硬盘厂商推出了SAS接口硬盘,品种太少,其他厂商的SAS硬盘多数处在产品内部测试阶段。此外周边的SAS控制器芯片或者一些SAS转接卡的种类更是不多,多数集中在LSI以及Adaptec公司手中。
硬盘价格太贵:
比起同容量的Ultra 320 SCSI硬盘,SAS硬盘要贵了一倍还多。一直居高不下的价格直接影响了用户的采购数量和渠道的消化数量,而无法形成大批量生产的SAS 硬盘,其成本的压力又会反过来促使价格无法下降。
如果用户想要做个简单的RAID级别,那么不仅需要购买多块SAS硬盘,还要购买昂贵的RAID卡,价格基本上和硬盘相当。
实际传输速度变化不大:
SAS硬盘的接口速度并不代表数据传输速度,受到硬盘机械结构限制,现在SAS硬盘的机械结构和SCSI硬盘几乎一样。目前数据传输的瓶颈集中在由硬盘内部机械机构、硬盘存储技术、磁盘转速,所决定的硬盘内部数据传输速度,也就是80MBsec左右,SAS硬盘的性能提升不明显。
用户追求成熟、稳定的产品:
从现在已经推出的产品来看,SAS硬盘更多的被应用在高端4路服务器上,而4路以上服务器用户并非一味追求高速度的硬盘接口技术,最吸引他们的应该是成熟、稳定的硬件产品,虽然SAS接口服务器和SCSI接口产品在速度、稳定性上差不多,但目前的技术和产品都还不够成熟。
不过随着英特尔等主板芯片组制造商、希捷等硬盘制造商以及众多的服务器制造商的大力推动,SAS的相关产品技术会逐步成熟,价格也会逐步滑落,早晚都会成为服务器硬盘的主流接口。
接口展示
磁盘的结构(HDD)
可以看见,硬盘拆开后,里面存在多张磁盘和多个读写磁头,加入一张磁盘有8张磁盘,就会有16个盘面和16个读写磁头了,所有的盘面构成了磁盘组合。
磁盘组合由一个或多个圆盘组成,他们围绕一根中心主轴旋转,圆盘的上下表面涂抹了一层磁性材料,二进制位被存储在这些磁性材料上。其中,0和1在磁材料中表现位不同的模式。
磁头,磁道,扇区,柱面介绍
磁头(head)
主要就是读取磁盘表面磁方向和改变其方向,每个盘面有一个磁头,它极其贴近地悬浮在盘面上,但是绝对不与盘面接触,否则会损坏磁头和盘面;
磁道(track)
磁道是单个盘面上的同心圆,当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道,一个盘面上的磁道可以有成千上万个。相邻磁道之间并不是紧挨着的,这是因为磁化单元相隔太近时磁性会产生相互影响,同时也为磁头的读写带来困难。
柱面(cylinder)
在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面。
扇区(sector)
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区,叫做引导扇区。扇区是被间隙(gap)分割的圆的片段,间隙未被磁化成0或者1。注意,扇区是读写磁盘最基本的单位,如果一个扇区因为某种原因被破坏,那么整个扇区的数据都会受影响。
磁盘容量的计算
Megatron747磁盘是一个典型的vintage-2008的大容量驱动器,它具有以下特性:8个圆盘,16个盘面,每个盘面有65536个磁道,每个磁道(平均)有256个扇区,每个扇区可以存储4096个字节(byte)
16个盘面,乘以65536个磁道,乘以256个扇区,再乘以4096字节,即16_65536_256*4096=2^40 byte,也就是1TB的容量。
磁盘性能评价的指标
磁盘 I/O 的概念
I/O 的概念,从字面来理解就是输入 /输出。操作系统从上层到底层,各个层次之间均存在。比如:cpu 有 I/O、内存由 I/O、WMM 有 I/O、底层磁盘也是有 I/O,这就是广义上的 I/O。通常情况下,一个上层的 I/O可能会产生针对磁盘的多个 I/O。也就是说上层 I/O是稀疏的,下层 I/O是密集的。
磁盘的 I/O,顾名思义就是磁盘的输入输出。输入指的是对磁盘写入数据,输出指的是从磁盘读出数据。我们常见的磁盘类型有 ATA、SATA、FC、SCSI、SAS,如图1所示。这几种磁盘中,服务器常用的是 SAS 和 FC 磁盘,一些高端存储也使用 SSD 盘。每一种磁盘的性能是不一样的。
注意:
要想给磁盘 I/O设置报警我们就需要先测量出来这个磁盘 I/O 的性能是怎么样的。
磁盘的性能评价指标
SAN(storage Area Network,存储区域网络)和NAS 存储(network Attached Storage,网络附加存储)一般都具备2 个评价指标:iops
和带宽
,这两个指标独立又相互关联,体现存储系统性能的最主要指标是 IOPS(也是我们要重点介绍的对象)。
IOPS:
Input/output Per second 、美标的输入输出量(读写次数),是衡量磁盘性能的主要指标之一。IOPS 是指单位时间内系统能处理的 I/O 请求数量,I/O请求通常为读或写数据操作请求。
随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。
磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
数据吞吐量(Throughput)
指单位时间内可以成功传输的数据数量。
对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。
磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。
IOPS 与吞吐量的关系
每秒 I/O 吞吐量= IOPS * 平均 I/O SIZE。
从公式可以看出:I/O SIZE 越大,IOPS 越高,那么每秒 I/O 的吞吐量就越高。
因此,我们会认为 IOPS 和吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。
IOPS 细分为如下几个指标
- Toatal IOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。
- Random Read IOPS,100%随机读负载情况下的IOPS。
- Random Write IOPS,100%随机写负载情况下的IOPS。
- Sequential Read IOPS,100%顺序读负载情况下的IOPS。
- Sequential Write IOPS,100%顺序写负载情况下的IOPS。
IOPS计算公式
对于磁盘来说一个完整的IO操作是这样进行的:
当控制器对磁盘发出一个IO操作命令的时候,磁盘的驱动臂(Actuator Arm)带读写磁头(Head)离开着陆区(Landing Zone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的磁道(Track)的正上方;此过程称为寻址
,此过程消耗的时间被称为寻址时间
。
找到对应磁道还不能马上读取数据,这时候磁头要等到磁盘盘片(Platter)
旋转到初始数据块所在的扇区(Sector)
落在读写磁头正上方
的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(Rotational Delay)
;
接下来就随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(Data Transfer)
,对应的时间称为传送时间(Transfer Time)
。
完成这三个步骤之后一次IO操作也就完成了。
相关指标
我们在买磁盘的时候经常看到厂家宣传单上写到平均寻址时间
、盘片旋转速度(转速)
、最大传送速度
,那么这三个指标分别对应的其实就是我们上面讲到的 一个完成的 IO 操作对应的三个时间。
寻址时间:
考虑到被读写的数据可能在磁盘的任意一个磁道,既有可能在磁盘的最内圈(寻址时间最短),也可能在磁盘的最外圈(寻址时间最长),所以在计算中我们只考虑平均寻址时间,也就是磁盘参数中标明的那个平均寻址时间,这里就采用当前最多的10krmp硬盘的5ms。
旋转延时:
和寻址一样,当磁头定位到磁道之后有可能正好在要读写扇区之上,这时候是不需要额外额延时就可以立刻读写到数据,但是最坏的情况确实要磁盘旋转整整一圈之后磁头才能读取到数据,所以这里我们也考虑的是平均旋转延时,对于10krpm的磁盘就是(60s/10k)*(1/2) = 2ms。
传送时间:
磁盘参数提供我们的最大的传输速度,当然要达到这种速度是很有难度的,但是这个速度却是磁盘纯读写磁盘的速度,因此只要给定了单次 IO的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是IO Chunk Size / Max Transfer Rate。
计算单次IO时间的公式
了解了这么多,我们就能得到单词计算 I/O 时间的公式了。
代码语言:txt复制IO Time = Seek Time 60 sec/Rotational Speed/2 IO Chunk Size/Transfer Rate
于是我们可以这样计算出IOPS。
代码语言:txt复制IOPS = 1/IO Time = 1/(Seek Time 60 sec/Rotational Speed/2 IO Chunk Size/Transfer Rate)
对于给定不同的IO大小我们可以得出下面的一系列的数据
代码语言:txt复制 4K (1/7.1 ms = 140 IOPS)
5ms (60sec/15000RPM/2) 4K/40MB = 5 2 0.1 = 7.1
8k (1/7.2 ms = 139 IOPS)
5ms (60sec/15000RPM/2) 8K/40MB = 5 2 0.2 = 7.2
16K (1/7.4 ms = 135 IOPS)
5ms (60sec/15000RPM/2) 16K/40MB = 5 2 0.4 = 7.4
32K (1/7.8 ms = 128 IOPS)
5ms (60sec/15000RPM/2) 32K/40MB = 5 2 0.8 = 7.8
64K (1/8.6 ms = 116 IOPS)
5ms (60sec/15000RPM/2) 64K/40MB = 5 2 1.6 = 8.6
从上面的数据可以看出,当单次IO越小的时候,单次IO所耗费的时间也越少,相应的IOPS也就越大。
上面我们的数据都是在一个比较理想的假设下得出来的,这里的理想的情况就是磁盘要花费平均大小的寻址时间和平均的旋转延时,这个假设其实是比较符合我们实际情况中的随机读写,在随机读写中,每次IO操作的寻址时间和旋转延时都不能忽略不计,有了这两个时间的存在也就限制了IOPS的大小。现在我们考虑一种相对极端的顺序读写操作,比如说在读取一个很大的存储连续分布在磁盘的的文件,因为文件的存储的分布是连续的,磁头在完成一个读IO操作之后,不需要从新的寻址,也不需要旋转延时,在这种情况下我们能到一个很大的IOPS值,如下:
代码语言:txt复制 4K (1/0.1 ms = 10000 IOPS)
0ms 0ms 4K/40MB = 0.1
8k (1/0.2 ms = 5000 IOPS)
0ms 0ms 8K/40MB = 0.2
16K (1/0.4 ms = 2500 IOPS)
0ms 0ms 16K/40MB = 0.4
32K (1/0.8 ms = 1250 IOPS)
0ms 0ms 32K/40MB = 0.8
64K (1/1.6 ms = 625 IOPS)
0ms 0ms 64K/40MB = 1.6
相比第一组数据来说差距是非常的大的,因此当我们要用IOPS来衡量一个IO系统的系能的时候我们一定要说清楚是在什么情况的IOPS,也就是要说明读写的方式以及单次IO的大小,当然在实际当中,特别是在OLTP的系统的,随机的小IO的读写是最有说服力的。
磁盘 I/O 的读写类型
大体上讲,I/O 的类型可以分为:读/写 I/O、大/小块 I/O、连续/随机 I/O, 顺序/并发 I/O。在这几种类型中,我们主要讨论一下:大/小块 I/O、连续/随机 I/O, 顺序/并发 I/O。
大/小块 I/O
这个数值指的是控制器指令中给出的连续读出扇区数目的多少。如果数目较多,如 64,128 等,我们可以认为是大块 I/O;反之,如果很小,比如 4,8,我们就会认为是小块 I/O,实际上,在大块和小块 I/O 之间,没有明确的界限。
连续/随机 I/O
连续 I/O 指的是本次 I/O 给出的初始扇区地址和上一次 I/O 的结束扇区地址是完全连续或者相隔不多的。反之,如果相差很大,则算作一次随机 I/O
连续 I/O 比随机 I/O 效率高的原因是:在做连续 I/O 的时候,磁头几乎不用换道,或者换道的时间很短;而对于随机 I/O,如果这个 I/O 很多的话,会导致磁头不停地换道,造成效率的极大降低。
顺序/并发 I/O
从概念上讲,并发 I/O 就是指向一块磁盘发出一条 I/O 指令后,不必等待它回应,接着向另外一块磁盘发 I/O 指令。对于具有条带性的 RAID(LUN),对其进行的 I/O 操作是并发的,例如:raid 0 1(1 0),raid5 等。反之则为顺序 I/O。
磁盘 I/O 的性能监控工具
IOPS的测试benchmark工具主要有Iometer, IoZone, FIO等,,可以综合用于测试磁盘在不同情形下的IOPS。对于应用系统,需要首先确定数据的负载特征,然后选择合理的IOPS指标进行测量和对比分析,据此选择合适的存储介质和软件系统。
磁盘 I/O 性能测试工具
fio
Fio(Flexible I/O Tester) 是一款由 Jens Axboe 开发的用于测评和压力/硬件验证的自由开源的软件。
它支持 19 种不同类型的 I/O 引擎 (sync、mmap、libaio、posixaio、SG v3、splice、null、network、 syslet、guasi、solarisaio,以及更多), I/O 优先级(针对较新的 Linux 内核),I/O 速度,fork 的任务或线程任务等等。它能够在块设备和文件上工作。
Fio 接受一种非常简单易于理解的文本格式的任务描述。软件默认包含了几个示例任务文件。 Fio 展示了所有类型的 I/O 性能信息,包括完整的 IO 延迟和百分比。
它被广泛的应用在非常多的地方,包括测评、QA,以及验证用途。它支持 Linux 、FreeBSD 、NetBSD、 OpenBSD、 OS X、 OpenSolaris、 AIX、 HP-UX、 Android 以及 Windows。
安装
centos/redhat
代码语言:txt复制yum -y install fio
ubuntu
代码语言:txt复制apt-get install fio
fio 参数
参数 | 说明 |
---|---|
-direct=1 | 表示测试时忽略I/O缓存,数据直写。 |
-iodepth=128 | 表示使用异步I/O(AIO)时,同时发出I/O数的上限为128。 |
-rw=randwrite | 表示测试时的读写策略为随机写(random writes)。其它测试可以设置为:randread(随机读random reads)read(顺序读sequential reads)write(顺序写sequential writes)randrw(混合随机读写mixed random reads and writes) |
-ioengine=libaio | 表示测试方式为libaio(Linux AIO,异步I/O)。应用程序使用I/O通常有两种方式:同步同步的I/O一次只能发出一个I/O请求,等待内核完成才返回。这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决。通常会用16~32根线程同时工作将iodepth塞满。异步异步的I/O通常使用libaio这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。 |
-bs=4k | 表示单次I/O的块文件大小为4KiB。默认值也是4KiB。测试IOPS时,建议将bs设置为一个较小的值,如4k。测试吞吐量时,建议将bs设置为一个较大的值,如1024k。 |
-size=1G | 表示测试文件大小为1GiB。 |
-numjobs=1 | 表示测试线程数为1。 |
-runtime=1000 | 表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写完。 |
-group_reporting | 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。 |
-filename=iotest | 指定测试文件的名称,例如iotest。 |
-name=Rand_Write_Testing | 表示测试任务名称为Rand_Write_Testing,可以随意设定。 |
测试随机读
代码语言:txt复制fio -numjobs=1 -iodepth=128 -direct=1 -ioengine=libaio -sync=1 -rw=randread -bs=4K -size=1G -time_based -runtime=60 -name=Fio -directory=/home/zsf/test
测试随机写
代码语言:txt复制fio -numjobs=1 -iodepth=128 -direct=1 -ioengine=libaio -sync=1 -rw=randwrite -bs=4K -size=1G -time_based -runtime=60 -name=Fio -directory=/home/zsf/test
测试随机读吞吐
代码语言:txt复制fio -numjobs=1 -iodepth=128 -direct=1 -ioengine=libaio -sync=1 -rw=randread -bs=1M -size=1G -time_based -runtime=60 -name=Fio -directory=/home/zsf/test
测试随机写吞吐:
代码语言:txt复制fio -numjobs=1 -iodepth=128 -direct=1 -ioengine=libaio -sync=1 -rw=randwrite -bs=1M -size=1G -time_based -runtime=60 -name=Fio -directory=/mnt
hdparm
它用来在基于 Linux的系统上获取或设置硬盘参数,包括测试读性能以及缓存性能等。
代码语言:txt复制# hdparm -Tt /dev/sdb
/dev/sdb:
Timing cached reads: 15094 MB in 2.00 seconds = 7557.04 MB/sec 2s 内从缓存中读取的数据量
Timing buffered disk reads: 3194 MB in 3.00 seconds = 1064.33 MB/sec 3s 内从硬盘设备中读取的数据量
磁盘 I/O 性能监测工具
nmon
安装
centos/redhat
代码语言:txt复制yum -y install nmon
使用
代码语言:txt复制nmon 命令之后输入 d
prometheus node_exporter grafana 监控磁盘 IO
磁盘 I/O性能调优
主要关注 IOPS 和吞吐量以及磁盘的 busy% 这三个数值。如果 IOPS 和吞吐量均很低,磁盘的 busy% 也很低,我们会认为磁盘压力过小,造成吞吐量和 IOPS 过低;只有在 IOPS 和吞吐量均很低,磁盘的 busy% 很高(接近 100%)的时候,我们才会从磁盘 I/O 方面分析 I/O 性能。
磁盘的排列组合 RAID
介绍
通常在讨论不同RAID保护类型的性能的时候,结论都会是RAID-1提供比较好的读写性能,RAID-5读性能不错,但是写入性能就不如RAID-1,RAID-6保护级别更高,但写性能相对更加差,RAID10是提供最好的性能和数据保护,不过成本最高等等。其实决定这些性能考虑的因素很简单,它就是RAID Write Penalty(写惩罚)。本文从原理上解释了不同RAID保护级别的写惩罚,以及通过写惩罚计算可用IOPS的方法。
RAID 组合的几种方式
RAID 0
RAID0 是一种非常简单的的方式,它将多块磁盘组合在一起形成一个大容量的存储。当我们要写数据的时候,会将数据分为N份,以独立的方式实现N块磁盘的读写,那么这N份数据会同时并发的写到磁盘中,因此执行性能非常的高。
RAID0 的读写性能理论上是单块磁盘的N倍(仅限理论,因为实际中磁盘的寻址时间也是性能占用的大头)
但RAID0的问题是,它并不提供数据校验或冗余备份,因此一旦某块磁盘损坏了,数据就直接丢失,无法恢复了。因此RAID0就不可能用于高要求的业务中,但可以用在对可靠性要求不高,对读写性能要求高的场景中。
RAID 1
RAID1 是磁盘阵列中单位成本最高的一种方式。因为它的原理是在往磁盘写数据的时候,将同一份数据无差别的写两份到磁盘,分别写到工作磁盘和镜像磁盘,那么它的实际空间使用率只有50%了,两块磁盘当做一块用,这是一种比较昂贵的方案。
RAID1其实与RAID0效果刚好相反。RAID1 这种写双份的做法,就给数据做了一个冗余备份。这样的话,任何一块磁盘损坏了,都可以再基于另外一块磁盘去恢复数据,数据的可靠性非常强,但性能就没那么好了。
RAID 5
这是目前用的最多的一种方式。
因为 RAID5 是一种将 存储性能、数据安全、存储成本 兼顾的一种方案。
RAID5模式中,不需要用单独的磁盘写校验码了。它把校验码信息分布到各个磁盘上。例如,总共有N块磁盘,那么会将要写入的数据分成N份,并发的写入到N块磁盘中,同时还将数据的校验码信息也写入到这N块磁盘中(数据与对应的校验码信息必须得分开存储在不同的磁盘上)。一旦某一块磁盘损坏了,就可以用剩下的数据和对应的奇偶校验码信息去恢复损坏的数据。
RAID5校验位算法原理:P = D1 xor D2 xor D3 … xor Dn (D1,D2,D3 … Dn为数据块,P为校验,xor为异或运算)
RAID5的方式,最少需要三块磁盘来组建磁盘阵列,允许最多同时 坏一块 磁盘。如果有两块磁盘同时损坏了,那数据就无法恢复了。
RAID6
为了进一步提高存储的高可用,聪明的人们又提出了RAID6方案,可以在有两块磁盘同时损坏的情况下,也能保障数据可恢复。
为什么RAID6这么牛呢,因为RAID6在RAID5的基础上再次改进,引入了双重校验的概念。
RAID6除了每块磁盘上都有同级数据XOR校验区以外,还有针对每个数据块的XOR校验区,这样的话,相当于每个数据块有两个校验保护措施,因此数据的冗余性更高了。
但是RAID6的这种设计也带来了很高的复杂度,虽然数据冗余性好,读取的效率也比较高,但是写数据的性能就很差。因此RAID6在实际环境中应用的比较少。
RAID 10
RAID10其实就是RAID1与RAID0的一个合体。
RAID10兼备了RAID1和RAID0的有优点。首先基于RAID1模式将磁盘分为2份,当要写入数据的时候,将所有的数据在两份磁盘上同时写入,相当于写了双份数据,起到了数据保障的作用。且在每一份磁盘上又会基于RAID0技术讲数据分为N份并发的读写,这样也保障了数据的效率。
但也可以看出RAID10模式是有一半的磁盘空间用于存储冗余数据的,浪费的很严重,因此用的也不是很多。
整体对比下区别
RAID-5 Write Penalty的例子:
存储方案规划的过程中,最基本的考虑因素有两个,性能和容量。性能上的计算看可以分为IOPS和带宽需求。计算IOPS,抛开存储阵列的缓存和前端口不谈。计算后端物理磁盘的IOPS不能简单的把物理磁盘的最大IOPS相加而获得。原因是,对于不同的RAID级别,为了保证当有物理磁盘损坏的情况下可以恢复数据,数据写入的过程中都需要有一些特别的计算。比如对于RAID-5,条带上的任意磁盘上的数据改变,都会重新计算校验位。如下图所示,一个7 1的RAID-5的条带中,七个磁盘存储数据,最后一个磁盘存储校验位。
对于一个数据的写入,我们假设在第五个磁盘上写入的数据为1111,如下图所示。那么整个RAID-5需要完成写入的过程分为以下几步:
- 读取原数据0110,然后与新的数据1111做XOR操作: 0110 XOR 1111 = 1001
- 读取原有的校验位0010
- 用第一步算出的数值与原校验位再做一次XOR操作: 0010 XOR 1001 = 1011
- 然后将1111新数据写入到数据磁盘,将第三步计算出来的新的校验位写入校验盘。
由上述几个步骤可见,对于任何一次写入,在存储端,需要分别进行两次读 两次写,所以说RAID-5的Write Penalty的值是4。
不同RAID级别的Write Penalty
下表列出了各种RAID级别的Write Penalty值:
RAID | Write Penalty |
---|---|
0 | 1 |
1 | 2 |
5 | 4 |
6 | 6 |
10 | 2 |
RAID-0:直接的条带,数据每次写入对应物理磁盘上的一次写入
RAID-1和10:RAID-1 和RAID-10的写惩罚很简单理解,因为数据的镜像存在的,所以一次写入会有两次。
RAID-5:RAID-5由于要计算校验位的机制存在,需要读数据、读校验位、写数据、写校验位四个步骤,所以RAID-5的写惩罚值是4。
RAID-6:RAID-6由于有两个校验位的存在,与RAID-5相比,需要读取两次校验位和写入两次校验位,所以RAID-6的写惩罚值是6。
read 计算IOPS
根据上文的描述,在实际存储方案设计的过程中,计算实际可用IOPS的过程中必须纳入RAID的写惩罚计算。计算的公式如下:
代码语言:txt复制物理磁盘总的IOPS = 物理磁盘的IOPS × 磁盘数目
可用的IOPS = (物理磁盘总的IOPS × 写百分比 ÷ RAID写惩罚) (物理磁盘总的IOPS × 读百分比)
假设组成RAID-5的物理磁盘总共可以提供500 IOPS,使用该存储的应用程序读写比例是50%/50%,那么对于前端主机而言,实际可用的IOPS是:
代码语言:txt复制(500 ×50% ÷ 4) ( 500 * 50%) = 312.5 IOPS
参考:
https://www.cnblogs.com/sddai/p/8647795.html
https://zhuanlan.zhihu.com/p/89505052
https://blog.csdn.net/tianlesoftware/article/details/6009110
https://zhuanlan.zhihu.com/p/51170719