可以正确处理写缓存的SATA磁盘?


15

很常见的建议是禁用用于数据库的单个磁盘上的写缓存,因为否则,某些磁盘会确认尚未写入磁盘表面的写操作。

这意味着某些磁盘只有在将其写入磁盘表面后才会确认写入(更新:或者在被要求刷新缓存时它们准确地报告。在哪里可以找到这些磁盘,或者在哪里可以找到权威信息?在哪里可以找到这样的磁盘?

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


linux允许通过hdparam逐个驱动器禁用写缓存。对于SATA驱动器,我认为必须编写脚本以在每次重新启动时重新应用。如果我仍然可以达到我们的性能要求,而无需使用电池供电的RAID控制器,那么我可以采取这种方式。我更喜欢在可能的情况下使用软件RAID,因为它更简单,更便宜。无论哪种方式,我肯定都会有UPS。
eas

Answers:


15

一般来说,在直接回答您的问题时,我不知道任何主要的SATA驱动器品牌都知道该驱动器本身在启用写入缓存的情况下与正常操作有关。也就是说,仅从驱动器角度来看,驱动器会执行从缓存角度来看应该执行的操作。我还要指出的是,即使写入缓存启用,从对SATA电缆旋转介质的物理更新磁盘写入延迟还很短(约50毫秒至100毫秒典型值)。并不是脏缓存数据一次只能坐在那里几秒钟.....驱动器不断尝试从缓存中获取脏数据尽快移到物理媒体上。这不仅是数据安全性的问题,而且是随时准备接受将来的写入而没有任何延迟(即:写入发布)的问题之一。

启用缓存时出现的问题是,通过SATA电缆对驱动器的写入顺序与对旋转介质的写入顺序不相同。除非您断电或系统崩溃,然后缓存的所有内容都存储到磁盘上,否则这永远不会造成问题。为什么?->

此处可能出现的问题与文件系统和/或数据库文件内容对这些乱序丢失的写入的事务鲁棒性有关。实际上,那些可能丢失的无序写入理论上可能破坏事务逻辑的完整性,否则,如果以非常特定的顺序对介质进行磁盘写入,就可以保证事务逻辑的完整性。

现在,当然,文件系统,数据库,RAID控制器等的设计人员已经知道(或者肯定应该知道)这种与写缓存有关的现象。从性能的角度来看,在大多数随机访问类型I / O场景中,写缓存是非常理想的。实际上,具有可用的写缓存是能够对更高级的本机命令队列(NCQ)产生任何真正好处的关键要素)在较新的SATA和最近几代的PATA实施中受支持。因此,为了保证在这样的某些关键时刻对物理介质的排序,文件系统和/或应用程序等可以专门请求刷新对介质的写缓存。在完成此同步请求后-根据事务系统设计,在正确的关键操作上,实际上(潜在地)文件缓冲区,OS磁盘缓存,物理磁盘缓存等所有未决事项实际上已在介质上耗尽。也就是说,如果程序员在顶部进行了正确的调用,并且此软件和硬件层链的每个元素都正确地完成了工作,则这正确地发生了。即:在驱动器,RAID控制器,磁盘驱动器,操作系统缓存,文件系统,数据库引擎等方面,这方面没有错误。这是很多必须完全正确运行的软件。此外,在这方面验证正确性非常困难,因为在几乎任何情况下,通常在任何情况下写入顺序都根本无关紧要...。而且电源故障和崩溃情况很难构建。因此,最终,在该术语的各个层和/或含义中的一个或多个层上“关闭写缓存”。...具有“修复”某些类型问题的声誉。实际上,关闭RAID控制器或OS磁盘高速缓存或驱动器等的写缓存行为是为了避免系统中的一个或多个错误……以及此类威胁的来源。以及电源故障和崩溃情况很难进行测试。因此,最终,在该术语的各个层和/或含义中的一个或多个层上“关闭写缓存”。...具有“修复”某些类型问题的声誉。实际上,关闭RAID控制器或OS磁盘高速缓存或驱动器等的写缓存行为是为了避免系统中的一个或多个错误……以及此类威胁的来源。以及电源故障和崩溃情况很难进行测试。因此,最终,在该术语的各个层和/或含义中的一个或多个层上“关闭写缓存”。...具有“修复”某些类型问题的声誉。实际上,关闭RAID控制器或OS磁盘高速缓存或驱动器等的写缓存行为是为了避免系统中的一个或多个错误……以及此类威胁的来源。

无论如何,回到问题的核心:在SATA下,所有磁盘读/写命令和刷新缓存命令的具体处理方式都由SATA规范定义。此外,驱动器制造商应具有每种驱动器型号或驱动器系列的详细文档,以描述其实施和对这些规则的遵守情况,例如希捷梭子鱼驱动器的示例。特别是,请参阅SATA SET FEATURES的详细信息控制驱动器操作模式的命令(特别是选项82h)可用于在驱动器级别禁用磁盘缓存,因为默认情况下,我知道所有驱动器上均已启用写缓存。如果您确实想禁用高速缓存,则此命令必须在每次驱动器重置或加电开始时执行,并且通常在操作系统的磁盘驱动器的控制下进行。您可能可以鼓励您的操作系统驱动程序通过IOCTL和/或“注册表设置”类型的东西来设置此模式,但这千差万别。


5
我的回答的一个编辑注释:硬件RAID控制器相对于许多问题(包括与其内部写入缓存实现有关的问题)而出名。我不知道为什么,但是从广泛使用的角度来讲,RAID控制器似乎是有史以来编写的最多错误的软件。当然,使用非常知名的供应商提供的非常主流的,建立良好的和广泛部署的RAID硬件肯定是值得的。
高杰夫

谢谢杰夫。我已经对此进行了很多阅读,而且我和以前一样感到困惑。我认为我现在正在努力解决的问题与“写入障碍”有关,后者允许应用程序和文件系统指示块层使用各种可用机制来保证正确的写入顺序。不幸的是,壁垒的实施存在各种各样的问题。一方面,LVM显然不支持它们,即使底层设备也支持。另外,在我看来,系统管理员应该可以选择让fsync强制刷新驱动器缓存
eas

@eas-我所指的“写障碍”一词与我在上面的答案中称为“同步”或“刷新”缓存的基本机制相同。就您而言,这可以在文件访问“堆栈”的各个层启动。为了构建真正的写屏障,它必须影响到所有待处理写数据(即脏缓存或写回缓冲区)的所有层,直至物理介质才能按预期工作。当重新排序写操作时,该链中任何断开的链接都会带来潜在的问题。
高杰夫

磁盘可能会将对介质的写入延迟几秒钟,当然,如果还有更多的写入使磁盘高速缓存溢出,则会强制对介质进行写入。NCQ并不严格需要写缓存,它仍然可以有许多写和读命令挂起,并以磁盘认为将获得最佳性能的顺序发出它们,而对于NCQ来说,写顺序没有任何意义,这使得文件系统和数据库需要使用IO屏障。
Baruch Even

3

我的经验是,电池支持的缓存磁盘控制器将禁用驱动器缓存。我不知道一种禁用磁盘缓存的方法。即使您可以禁用磁盘上的缓存,性能也会大大降低。

对于低成本的光影,您可以使用价格便宜的UPS,该UPS可以向系统发出信号以指示其有序关闭。


我上面的评论应该在这里添加。我还在学习这个网站。
eas

有些RAID控制器会一直禁用磁盘缓存,有些则没有,有些则有设置。这种行为从根本上取决于RAID控制器的缓存策略实施情况。在某些实现中,他们确实希望控制对磁盘的写入顺序。我在回答中提到了一些问题。
高杰夫

在我公认的少量测试(LSI 9261 RAID控制器,SATA,NL SAS和SAS驱动器)中,我发现当驱动器连接到具有电池/容量支持的高速缓存的RAID控制器时,启用驱动器写高速缓存对仅具有RAID控制器缓存的性能。我还不会说这是一条硬性规定,但是对我来说显然很清楚,RAID控制器禁用驱动器缓存不一定是问题。
丹尼尔·劳森

2

我使用具有超级电容器而不是电池的RAID系统来维护高速缓存。电池磨损,必须进行监控,必须更换,并且在这些方面都可能造成故障。电容器在启动时会充电,在UPS断电时会刷新缓存,几乎可以永久使用,不需要监控等。但是,除非您在贫困线上经营企业(如今并不罕见),否则您应该拥有UPS以及能够在出现故障时彻底关闭系统的软件-我通常会给它5至15分钟的时间(具体取决于UPS负载,因此取决于可用的电池),然后再关闭电源。

在雷雨期间,您可能(或可能有-电源系统正在变得更好)看到灯光闪烁,有时只是在灯光熄灭之前。这是一种称为重合器的设备。这是一个断路器,当跳闸时,它会尝试闭合断开的开关,以防过载是瞬态的,而大多数情况是这样。如果在尝试三遍后仍无法保持关闭状态,则保持打开状态。那个可怜的家伙必须在雨中出去应对。别为他感到难过,而所做的只有我和我的两倍,而如果加班则是我的两倍,这是危险的工作。


2

如果磁盘回写缓存存在误解之一,那就是它们只会在掉电时丢失数据。并非总是如此,尤其是在sATA设备上。如果sATA设备上有错误(例如,极端情况下的固件错误或控制器错误),并且已重置或从外部重置,则无法保证挂起后回写缓存中的数据仍然可用。

这可能导致设备出现瞬态错误,被重置,丢失任何脏缓存时都会发生数据丢失,并且在驱动程序块级别以上处于静默状态的情况。

更糟糕的是,通过OS工具禁用驱动器缓存也将在重置设备时丢失,因此,即使设备在一天开始时禁用了缓存,但如果重置了设备,它将重新启用回写缓存。再次重置时,设备将丢失数据。

SCSI / SAS驱动器和某些sATA驱动器具有保存回写配置文件状态的能力,以确保不会丢失所有重置属性,但实际上很少使用。

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

此限制也适用于其他SET FEATURE和配置用于性能和可靠性的类似参数。


1

如您所说,一个合适的电池备份RAID控制器价格昂贵,但是您可以在eBay上以100英镑(150美元)的价格找到Dell Perc5 / i控制器,尤其是RAID5,像Perc5 / i这样的控制器的速度会让您赞叹不已。我有几台配备Perc5 / is的服务器和六个磁盘RAID5阵列,它们是我见过的最快的磁盘之一。特别是对于数据库应用程序,快速磁盘将真正提高性能。

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

JR


1

据我了解,fsync()伪造是电池供电的RAID控制器而非驱动器的属性。RAID控制器包含一块电池,该电池可以为其写入缓存供电,直到驱动器恢复供电并且可以将写入安全地提交到磁盘为止。这使得控制器可以立即返回到OS,因为它在某种程度上保证了写入将被写入磁盘。

应该注意的是,如果驱动器的写回缓存已满,写操作将阻塞,直到将缓存写回到驱动器为止。这意味着在持续写入的情况下,缓存通常不那么有效。

您的应用程序需要多少IOPS?您确定受到驱动器写缓存的限制,还是驱动器上的磁盘空间较小(与服务器的内存相比)会有所帮助?


我现在正在进行的测试是确定应用程序的性能范围,以便我们确定如何最佳地扩展和扩展。驱动器缓存可能相对较小,但是通过在其上进行写缓存,可以使驱动器(在适当的情况下)能够对写进行重新排序,这看起来可以使持续的写吞吐量提高一倍。
eas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.