很常见的建议是禁用用于数据库的单个磁盘上的写缓存,因为否则,某些磁盘会确认尚未写入磁盘表面的写操作。
这意味着某些磁盘只有在将其写入磁盘表面后才会确认写入(更新:或者在被要求刷新缓存时它们准确地报告。在哪里可以找到这些磁盘,或者在哪里可以找到权威信息?在哪里可以找到这样的磁盘?
我正在设置一些真正可以从使用写缓存中受益的数据库服务器,但是该应用程序对价格敏感,因此我不愿意将磁盘子系统的成本用于某些缓存RAID控制器,因为我没有足够的信息来加倍知道我是否可以信任每个驱动器中的缓存。
很常见的建议是禁用用于数据库的单个磁盘上的写缓存,因为否则,某些磁盘会确认尚未写入磁盘表面的写操作。
这意味着某些磁盘只有在将其写入磁盘表面后才会确认写入(更新:或者在被要求刷新缓存时它们准确地报告。在哪里可以找到这些磁盘,或者在哪里可以找到权威信息?在哪里可以找到这样的磁盘?
我正在设置一些真正可以从使用写缓存中受益的数据库服务器,但是该应用程序对价格敏感,因此我不愿意将磁盘子系统的成本用于某些缓存RAID控制器,因为我没有足够的信息来加倍知道我是否可以信任每个驱动器中的缓存。
Answers:
一般来说,在直接回答您的问题时,我不知道任何主要的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和/或“注册表设置”类型的东西来设置此模式,但这千差万别。
我的经验是,电池支持的缓存磁盘控制器将禁用驱动器缓存。我不知道一种禁用磁盘缓存的方法。即使您可以禁用磁盘上的缓存,性能也会大大降低。
对于低成本的光影,您可以使用价格便宜的UPS,该UPS可以向系统发出信号以指示其有序关闭。
我使用具有超级电容器而不是电池的RAID系统来维护高速缓存。电池磨损,必须进行监控,必须更换,并且在这些方面都可能造成故障。电容器在启动时会充电,在UPS断电时会刷新缓存,几乎可以永久使用,不需要监控等。但是,除非您在贫困线上经营企业(如今并不罕见),否则您应该拥有UPS以及能够在出现故障时彻底关闭系统的软件-我通常会给它5至15分钟的时间(具体取决于UPS负载,因此取决于可用的电池),然后再关闭电源。
在雷雨期间,您可能(或可能有-电源系统正在变得更好)看到灯光闪烁,有时只是在灯光熄灭之前。这是一种称为重合器的设备。这是一个断路器,当跳闸时,它会尝试闭合断开的开关,以防过载是瞬态的,而大多数情况是这样。如果在尝试三遍后仍无法保持关闭状态,则保持打开状态。那个可怜的家伙必须在雨中出去应对。别为他感到难过,而所做的只有我和我的两倍,而如果加班则是我的两倍,这是危险的工作。
如果磁盘回写缓存存在误解之一,那就是它们只会在掉电时丢失数据。并非总是如此,尤其是在sATA设备上。如果sATA设备上有错误(例如,极端情况下的固件错误或控制器错误),并且已重置或从外部重置,则无法保证挂起后回写缓存中的数据仍然可用。
这可能导致设备出现瞬态错误,被重置,丢失任何脏缓存时都会发生数据丢失,并且在驱动程序块级别以上处于静默状态的情况。
更糟糕的是,通过OS工具禁用驱动器缓存也将在重置设备时丢失,因此,即使设备在一天开始时禁用了缓存,但如果重置了设备,它将重新启用回写缓存。再次重置时,设备将丢失数据。
SCSI / SAS驱动器和某些sATA驱动器具有保存回写配置文件状态的能力,以确保不会丢失所有重置属性,但实际上很少使用。
将块层集成到上层的RAID控制器可以注意到驱动器重置并再次禁用回写缓存-但是标准sATA和SAS控制器不会这样做。
此限制也适用于其他SET FEATURE和配置用于性能和可靠性的类似参数。
据我了解,fsync()伪造是电池供电的RAID控制器而非驱动器的属性。RAID控制器包含一块电池,该电池可以为其写入缓存供电,直到驱动器恢复供电并且可以将写入安全地提交到磁盘为止。这使得控制器可以立即返回到OS,因为它在某种程度上保证了写入将被写入磁盘。
应该注意的是,如果驱动器的写回缓存已满,写操作将阻塞,直到将缓存写回到驱动器为止。这意味着在持续写入的情况下,缓存通常不那么有效。
您的应用程序需要多少IOPS?您确定受到驱动器写缓存的限制,还是驱动器上的磁盘空间较小(与服务器的内存相比)会有所帮助?