当前位置: 首页 > Linux

机械硬盘慢、易坏的问题如何解决?

时间:2023-04-06 11:23:26 Linux

我们使用的计算机的全称叫做电子计算机,前面有electronic这个词,意思是整个计算机中的核心部件基本上都是由电子单元组成的。但机械硬盘是一个特殊的例外,它更多的是一种用机械技术制造的产品。当带有机械技术基因的磁盘应用于计算机,尤其是应用于服务器领域时,暴露出机械技术的两个严重问题:第一,速度慢。如果把内存和CPU的速度比作汽车和飞机,这位老大哥的毫秒级延迟几乎是牛车的水平。二是容易折断。经常听说有人的磁盘坏了,很少听说有人的内存条坏了。笔者在研究生期间有过在实验室拷贝数据的经历,突然断电直接毁坏了一块硬盘。为了保证服务器的稳定高速运行,必须要解决硬盘从娘胎里带出来的这两个缺陷。多硬盘连接的问题简单明了。我们需要解决速度慢和容易损坏的两个问题。自然,如果单打独斗还不够,我们就想到了上去组队,一起装多个硬盘。但问题是,如果给你N块硬盘,让你想出一个技术方案,你会怎么设计?第一种方案是将一个文件分成N块,每块散列到不同的硬盘上。这样在读取文件的时候,N块硬盘可以协同工作,从而达到读取速度提高N倍的效果。这就是RAID0。但是,这种方案并没有解决容易故障的问题。任何硬盘故障都会导致存储系统出现故障。第二种方案还是对文件进行分片,但是所有的分片都存放在一个硬盘上,其他硬盘只存放副本。这样既提高了硬盘的存取速度,又解决了坏的问题。任何一个硬盘坏了,存储系统都可以正常使用,只是速度会稍微降低。但是这种方案带来了一个新的问题,就是实现成本有点高。如果我们用一块256G的硬盘来实现512G的存储容量,至少需要4块硬盘才能实现。有折衷方案吗?是的,而且很多。这里只说最常见的raid5RAID5,同样需要对文件进行分片,但不对存储的数据进行备份,而是单独保存一个验证数据分片。如果文件分为A1A2A3,那么你需要将校验和保存到另一个磁盘。这样,无论A1、A2、A3哪一块丢失,都可以根据另外两块和验证块合成。既保证了数据的安全性,又只使用一块磁盘进行冗余存储。如果我们有8块256GB的硬盘,RAID5方案下磁盘阵列的可用存储空间从用户角度来看是7*256GB,只是“浪费”了一块磁盘的空间,所以目前RAID5被广泛使用~~Raidcard缓存硬盘延迟在毫秒级别。快硬盘即使并行化,也只能提升几倍,无法达到一个数量级的提升。与CPU内存纳秒级的运行频率相比,还是太慢了。在计算机世界里,没有缓存解决不了的速度问题。如果有,则添加另一层。现代磁盘本身基本上都有缓存。此外,在一些比较新的raid卡中,硬件开发者已经制造了一层“内存”,而且还自带电池。这是RAID卡缓存。下面来看看几款主流RAID卡的配置:PERCS120入门级软件阵列卡,主板集成无缓存支持RAID01PERCH330入门级硬件RAID卡,无板载缓存,支持RAID0151050PERCH730主流hardwareRAIDcardwith1GCacheandbatterysupportRAID0156105060PERCH730P高性能硬件RAID卡with2GcacheandbatterysupportRAID0156105060PERCH830同H730P,无内置接口,使用外接接口连接额外的存储磁盘柜就拿目前服务器端曝光率比较高的H730和H730P来说,分别有1G和2G的缓存卡,自带电池。电池的作用是当发现主机意外掉电时,将缓存中的数据快速写回磁盘。写的话,一般的操作系统都是写这个RAID卡,所以速度很快。读也是一样,只要在缓存中,就不会透传到磁盘的机械轴上。另外补充一点,在文件相关的函数中设置DIRECTI/O只能绕过操作系统本身的PageCache,RAID卡中的缓存对于Linux来说可以看作是一个黑盒子。也就是说,操作系统并不知道RAID卡是从缓存中吐出数据,还是真正从硬盘中读取数据。亲手查看你的RAID配置了解了raid的基本原理后,我们就可以实际查看机器上的raid情况了。这是我手头的服务器示例。通过cat/proc/scsi/scsi可以查看raid卡的型号Host:scsi10Channel:02Id:01Lun:00Vendor:DELLModel:PERCH730MiniRev:4.27Type:Direct-AccessANSISCSIrevision:05可以看到我的服务器raid卡用的是PERCH730,这个raid卡有1G缓存和电池。查看我们的硬盘阵列#/opt/MegaRAID/MegaCli/MegaCli64-LDInfo-Lall-aALLVirtualDrive:1(TargetId:1)Name:RAIDLevel:Primary-5,Secondary-0,RAIDLevelQualifier-3Size:1.633TBSector大小:512IsVD仿真:NoParity大小:278.875GBState:OptimalStrip大小:128KB驱动器数量:7Span深度:1RAID级别列指示当前RAID组的RAIN级别。下面比较RAID1:Primary-1,Secondary-0,RAIDLevelQualifier-0RAID1RAID0:Primary-0,Secondary-0,RAIDLevelQualifier-0RAID0RAID5:Primary-5,Secondary-0,RAIDLevelQualifier-3RAID5RAID10:Primary-1,Secondary-3,RAIDLevelQualifier-0从RAID10可以看出,本地RAIDLevel为RAID5。另外,StripSize称为条带大小,我机器上的配置是128KB。如果有一个5??12KB的文件,它会被分成4条,每条128KB。这些条带可能分散在不同的磁盘上。如果一次读取,多个硬盘可以一起转动机械轴,读取速度将提高数倍。不过需要注意的是,如果文件小于stripesize,小于128K,那么RAID下的多个硬盘对文件读取耗时是无济于事的。继续查看组成RAID的所有磁盘状态:#/opt/MegaRAID/MegaCli/MegaCli64-PDList-aALL……Drive'sposition:DiskGroup:1,Span:0,Arm:0DeviceId:1...RawSize:279.396GB[0x22ecb25cSectors]NonCoercedSize:278.896GB[0x22dcb25cSectors]CoercedSize:278.875GB[0x22dc0000Sectors]SectorSize:512LogicalSectorSize:512PhysicalSectorSize:512InquiryData:SEAGATEST300MM0008TT31S42310JR.........驱动器位置:DiskGroup:1,Span:0,Arm:6DeviceId:7Raw大小:279.396GB[0x22ecb25cSectors]非强制大小:278.896GB[0x22dcb25cSectors]强制大小:278.875GB[0x22dc0000Sectors]DiskGroup1共有7块硬盘,每块硬盘大小约为278GB。6块硬盘的总容量约为1.6T,为了保证数据安全,确实是对一块硬盘容量的“浪费”!此外,查询数据还显示了硬盘的制造商和型号。这些硬盘均为希捷300G机械硬盘,根据谷歌查询其转速为每分钟10000转。与本节的机械技术和电子技术相比,稳定性差很多。所以,机械背景的硬盘速度慢,容易坏。为了解决这个问题,RAID技术应运而生。通过一定的冗余原始存储或验证数据提供安全保障,通过增加带有电子基因的缓存,合理调度多个磁盘的机械轴,提高磁盘IO的读写速度。在Linux下,您可以使用MegaCli工具来查看您的RAID组的状态。强烈建议大家实际去看看!练内功练硬盘特技:1、开盘:剥去机械硬盘的硬外衣!2.磁盘分区也暗示技术水平。3、机械硬盘速度慢,容易坏,如何解决?4.拆解SSD结构5.一个新的空文件占用多少磁盘空间?6.一个只有1字节的文件实际占用多少磁盘空间?7、为什么文件太多时ls命令会卡住?8.理解格式化原理9.读取文件一个字节实际会发生多少磁盘IO?10.文件写入一个字节后什么时候开始写磁盘IO?11、机械硬盘的随机IO比你想象的要慢。12、服务器配置固态硬盘比机械硬盘快多少?我的公众号是“练内功练功”。在这里,我不是简单地介绍技术理论,也不是只介绍实践经验。而是理论联系实际,用实践加深对理论的理解,用理论提高技术实践能力。欢迎关注我的公众号,分享给你的朋友吧~~~