正确处理写入caching的SATA磁盘?

看到build议禁用用于数据库的单个磁盘上的写入caching是非常常见的,因为否则某些磁盘会确认尚未将其写入磁盘表面的写入。

这意味着一些磁盘在写入到磁盘表面之前不会确认写入(更新:或者在被要求刷新caching时准确地报告。我在哪里可以find这样的磁盘,或者我在哪里可以查找权威信息在哪里可以find这样的磁盘?

我正在设置一些真正受益于使用写入caching的数据库服务器,但是应用程序对价格敏感,而且我宁愿将一些cachingRAID控制器的磁盘子系统成本加倍,因为我没有足够的信息知道我是否可以信任每个驱动器中的caching。

一般来说,直接回答你的问题,我不知道SATA驱动器的任何主要品牌,驱动器本身有错误,相对于启用写入caching的正确操作。 也就是说,从驱动angular度来看,驱动器从caching的angular度来做它应该做的事情。 我还会注意到, 即使启用了写入caching,从SATA电缆上的磁盘写入到物理上正在更新的旋转媒体的延迟仍然非常短(通常约50到100ms)。 这不是像脏的caching数据一次只坐在那里几秒钟……驱动器不断尝试从caching中的脏数据尽快到物理媒体上。 这不仅仅是一个数据安全的问题,而是准备好接受未来写作而不会有任何延迟的一个问题(即:写入发布)。

启用高速caching时出现的问题是,通过SATA电缆写入驱动器的写入顺序和写入到旋转介质的顺序不同。 这永远不会引起问题,除非在高速caching的所有内容都将其写入磁盘之前,您的电源或系统崩溃。 为什么? – >

这里可能出现的问题是相对于文件系统和/或数据库文件内容对这些无序丢失写入的事务健壮性。 实际上,可能失序写入的那些理论上可以破坏事务逻辑的完整性,否则这将通过磁盘写入以非常特定的顺序向媒体发生。

当然,现在,文件系统,数据库,RAID控制器等的devise者都知道(或者肯定应该知道)与写入caching相关的这种现象。 从大多数随机访问typesI / O场景的性能angular度来看,写入caching是非常可取的。 事实上,提供写caching是一个关键因素,它能够对更新的SATA和前几代PATA实现所支持的更先进的本地命令队列( NCQ )有任何实际的益处。 因此,为了保证在这样的关键时刻对物理媒体的命令,文件系统和/或应用程序等可以特别地向媒体请求写高速caching的清空。 在完成这个同步请求时,在正确的关键操作中,根据事务处理系统devise,在(可能的)文件缓冲区,操作系统磁盘caching,物理磁盘caching等所有待处理的事物都实际上在介质上。 也就是说,如果程序员在最上面做出正确的调用,并且这个软件和硬件层链中的每个元素正确地完成了他们的工作,这种情况就会正确地发生。 即:在驱动器,RAID控制器,磁盘驱动器,操作系统caching,文件系统,数据库引擎等方面没有任何错误。这是很多软件都必须正确工作。 另外,在这方面validation正确性是非常困难的,因为几乎在任何情况下,写入顺序根本不重要。停电和崩溃情况是很难testing的。 因此,最终在这个术语的各个层面和/或含义的一个或多个“closures写入caching”中……具有“修复”某些types的问题的声誉。 实际上,closuresRAID控制器或操作系统磁盘caching或驱动器等的写入caching行为可以避免系统中的一个或多个错误…..以及这种传播的来源。

无论如何,回到问题的核心:在SATA下,所有磁盘读/写命令的特定处理和flush cache命令都由SATA规范定义。 此外,驱动器制造商应该为每个驱动器型号或驱动器系列提供详细的文档,描述其实施情况以及符合这些规则的情况,例如希捷Barracuda驱动器的示例。 具体而言,请参阅控制驱动器操作模式的SATA SET FEATURES命令的详细信息,具体而言,选项82h可用于在驱动器级别禁用磁盘高速caching,因为默认情况下肯定是在所有我知道的驱动器上启用写入高速caching。 如果您确实想要禁用caching,则必须在每个驱动器重置或启动时执行此命令,并且通常在操作系统的磁盘驱动程序的控制之下。 您可能会鼓励您的操作系统驱动程序通过IOCTL和/或registry设置types的东西来设置此模式,但这种差异很大。

我的经验是,电池支持的caching磁盘控制器将禁用驱动器上的caching。 我不知道有一种方法来禁用磁盘caching,否则。 即使您可以禁用磁盘caching,性能也会受到严重影响。

对于低成本的光纤,您可以使用廉价的UPS,可以指示您的系统有序closures。

我使用超级电容器而不是电池的RAID系统来维护caching。 电池耗尽,必须受到监控,必须更换,并代表这些方面的潜在失败点。 启动时电容器充电,当UPS电源故障时刷新caching,几乎永远持续,不需要监控等。但是,除非您在贫困线上运营业务(这些日子并不罕见),您应该有UPS以及在故障时能够干净地closures系统的软件 – 在关机之前,我通常会给它5-15分钟(取决于UPS的负载,因此电池可用)。

在雷暴期间,你可能会(或者可能有 – 电力系统正在变得更好)看到灯光闪烁,有时就在他们出去之前。 这是一个称为重合器的装置。 这是一个断路器,当跳闸试图closures打开的开关,以防过载瞬间,这是最重要的。 如果在三次尝试之后未能保持closures,则保持打开状态。 有些可怜的人必须在雨中出去处理。 不要为了他而感到太难过,只做你和我做的两倍,如果是加class,那是两倍,这是危险的工作。

如果磁盘写回caching的误解之一是他们只丢失掉电数据。 情况并非总是如此,特别是在sATA设备上。 如果sATA设备上有错误(例如angular落案例FW错误或控制器错误)并且它重置或被重置在外部,则不能保证挂起后写回caching中的数据仍然可用。

这可能会导致设备出现瞬时错误,重新设置,丢失任何脏caching时发生数据丢失的情况,并且在块级别的驱动程序之上这是沉默的。

更糟糕的是,通过操作系统工具禁用驱动器caching也将在设备重置时丢失,因此即使设备在开始时禁用caching,如果设备被重置,它将重新启用回写caching。 在另一次重置时,设备将丢失数据。

SCSI / SAS驱动器和一些sATA驱动器能够保存回写configuration文件的状态,以确保在重置时属性不会丢失 – 但实际上很less使用。

将块层集成到上层的RAID控制器可以注意到驱动器重置并再次禁用写回caching – 但标准的sATA和SAS控制器不会这样做。

这种限制也适用于其他SET FEATURE和为性能和可靠性而configuration的类似参数。

正如你所说,一个合适的电池支持的RAID控制器将是昂贵的,但你可以在eBay上findDell Perc5 / i控制器,价格为100英镑(150美元),特别是在RAID5控制器的速度下,像Perc5 /我会惊讶你。 我有几个服务器与Perc5 /是和六个磁盘RAID5arrays,他们是我见过的最快的磁盘之一。 特别是对于数据库应用程序,快速磁盘将真正提高性

我会硬着头皮买一个RAID控制器。

JR

据我所知,fsync()伪装是电池支持RAID控制器的属性,而不是驱动器。 RAID控制器包含一个电池,可以为其写入caching提供电源,直到电源恢复到驱动器为止,写入可以安全地提交到磁盘。 这允许控制器立即返回到操作系统,因为它可以保证一定程度的写入写入磁盘。

应该注意的是,如果驱动器写回caching填满,写入将被阻塞,直到caching写回驱动器。 这意味着在持续写入的情况下,caching通常不会有效。

你的应用需要多lessIOPS? 你确定你正在被驱动器写caching所限制,或者驱动器上的一个小的(与你的服务器的内存相比)会有好处吗?