![SATA 磁盘可以正确处理写入缓存吗?](https://linux22.com/image/483776/SATA%20%E7%A3%81%E7%9B%98%E5%8F%AF%E4%BB%A5%E6%AD%A3%E7%A1%AE%E5%A4%84%E7%90%86%E5%86%99%E5%85%A5%E7%BC%93%E5%AD%98%E5%90%97%EF%BC%9F.png)
禁用用于数据库的单个磁盘上的写缓存的建议很常见,因为否则某些磁盘将确认尚未到达磁盘表面的写入。
这意味着某些磁盘在写入到磁盘表面之前不会确认写入(更新:或者在要求刷新缓存时它们会准确报告。我在哪里可以找到这样的磁盘,或者在哪里可以找到有关在哪里可以找到这样的磁盘的权威信息?
我正在设置一些真正受益于使用写入缓存的 DB 服务器,但是应用程序对价格敏感,而且我宁愿不为某些缓存 RAID 控制器而将磁盘子系统的成本翻倍,因为我没有足够的信息来了解是否可以信任每个驱动器中的缓存。
答案1
一般来说,直接回答你的问题,我并不知道任何主要品牌的 SATA 驱动器本身在启用写入缓存的情况下存在与正常运行相关的错误。也就是说,仅从驱动器的角度来看,驱动器会按照缓存的角度执行其应该执行的操作。我还想指出的是即使写缓存是启用后,从 SATA 电缆上的磁盘写入到旋转介质物理更新的延迟仍然很短(通常约为 50 到 100 毫秒)。脏缓存数据不会一次在那里停留几秒钟.....驱动器会不断尝试从缓存尽快写入物理介质。这不仅仅是数据安全的问题,而且是随时准备接受未来的写入而无任何延迟(即:写入发布)的问题。
启用缓存时出现的问题是,通过 SATA 电缆写入驱动器的顺序与写入旋转介质的顺序不同。除非在缓存的所有内容写入磁盘之前断电或系统崩溃,否则这永远不会造成问题。为什么?->
这里可能出现的问题与文件系统和/或数据库文件内容对这些无序丢失写入的事务稳健性有关。实际上,这些可能丢失的无序写入理论上可能会破坏事务逻辑的完整性,而这种完整性本来可以通过以非常特定的顺序写入介质来保证。
现在,文件系统、数据库、RAID 控制器等的设计人员当然知道(或者肯定应该知道)与写入缓存相关的这种现象。从性能的角度来看,在大多数随机访问类型 I/O 场景中,写入缓存是极其理想的。事实上,拥有写入缓存是能够真正为更高级的本机命令队列带来好处的关键要素(全国资格考试),该功能在较新的 SATA 和最近几代 PATA 实现上均受支持。因此,为了保证物理介质在某些关键时刻的有序性,文件系统和/或应用程序等可以专门请求将写入缓存刷新到介质。在完成此同步请求后,所有来自(潜在)文件缓冲区、操作系统磁盘缓存、物理磁盘缓存等的待处理内容实际上都按照事务系统设计在正确的关键操作中出现在介质上。也就是说,如果程序员在顶部进行了正确的调用,并且此软件和硬件层链的每个元素都正确执行了其工作,则这种情况就会正确发生。即:驱动器、RAID 控制器、磁盘驱动程序、操作系统缓存、文件系统、数据库引擎等在这方面没有错误。这是很多软件,它们都必须完全正常工作。此外,验证这方面的正确性非常困难,因为在几乎任何情况下,写入顺序通常都无关紧要……并且电源故障和崩溃场景是难以构建的测试。因此,最终“关闭写入缓存”在一个或多个不同层面和/或该术语的含义上...享有“修复”某些问题之名。实际上,关闭 RAID 控制器或 OS 磁盘缓存或驱动器等的写入缓存行为可以避免系统中出现一个或多个错误...以及此类传说的来源。
无论如何,回到问题的核心:在 SATA 下,所有磁盘读写命令和刷新缓存命令的具体处理都是由SATA 规格。此外,驱动器制造商应为每种驱动器型号或驱动器系列提供详细的文档,描述其实施情况和对这些规则的遵守情况,例如此示例希捷梭子鱼驱动器。特别是,请参阅 SATA设置功能控制驱动器操作模式的命令,特别是选项 82h,可用于在驱动器级别禁用磁盘缓存,因为默认情况下,我知道所有驱动器上都启用了写入缓存。如果您确实想禁用缓存,则必须在每次驱动器重置或启动时执行此命令,并且通常由操作系统的磁盘驱动程序控制。您可能能够鼓励您的操作系统驱动程序通过 IOCTL 和/或注册表设置类型的东西来设置此模式,但这有很大的不同。
答案2
磁盘写回缓存的一个误解是它们只会在断电时丢失数据。情况并非总是如此,尤其是在 SATA 设备上。如果 SATA 设备出现错误(例如极端情况下的固件错误或控制器错误)并且重置或从外部重置,则无法保证写回缓存中的数据在挂起后仍然可用。
这可能导致设备出现瞬态错误、重置、因任何脏缓存丢失而发生数据丢失的情况,而这在驱动程序的块级别之上却是静默的。
更糟糕的是,通过操作系统工具禁用驱动器缓存也会在设备重置时丢失,因此即使设备在一天开始时禁用了缓存,如果设备重置,它将重新启用写回缓存。在另一次重置时,设备将丢失数据。
SCSI/SAS 驱动器和一些 SATA 驱动器能够保存写回配置文件的状态,以确保在重置后属性不会丢失 - 但实际上很少使用这种方法。
将块层集成到上层的 RAID 控制器可以注意到驱动器重置并再次禁用写回缓存 - 但标准 sATA 和 SAS 控制器不会这样做。
此限制也适用于为性能和可靠性而配置的其他 SET FEATURE 和类似参数。
答案3
根据我的经验,电池供电的缓存磁盘控制器将禁用驱动器上的缓存。我不知道如何以其他方式禁用磁盘上的缓存。即使您可以禁用磁盘上的缓存,性能也会受到很大影响。
对于低成本的选择,您可以使用廉价的UPS,它可以向您的系统发出信号,要求其有序关闭。
答案4
正如您所说,一个合适的电池供电 RAID 控制器会很贵,但您可以在 eBay 上以 100 英镑(150 美元)的价格找到戴尔 Perc5/i 控制器,尤其是对于 RAID5,像 Perc5/i 这样的控制器的速度会让您惊叹不已。我有几台带有 Perc5/is 和六个磁盘 RAID5 阵列的服务器,它们是我见过的最快的磁盘之一。特别是对于数据库应用程序,快速磁盘将真正提高性能。
我会咬紧牙关,购买一个 RAID 控制器。
JR