我似乎找不到太多关于在 SSD 上使用数据库服务器的 trim 方面的专家信息。我知道我可以启用 RAID 和 LVM 丢弃,并使用fstrim /
cron 作业或discard
ext4 的挂载选项(具体哪个取决于写入行为),但例如 MySQL 的数据文件只能使用,optimize table
然后您必须inno_db_file_per_table
启用。在几百 GB 的表上,optimize table
这将需要一段时间,而且不是一件容易的事情。
数据库(尤其是 MySQL)能正确处理丢弃吗?它们甚至可以发送文件系统认为仍包含数据的文件的丢弃消息吗?
我知道如果不进行修剪,几个月后你的表现确实会下降,并且会导致写入放大,所以我很担心。
答案1
除非您使用的是消费市场上最便宜的 SSD,并且数据库大小可能为 100GB+,否则这对您来说可能不成问题。
写入放大
您必须进行大量的写入才能接近限制现代(即在过去 12 个月内制造的)SSD 的有效寿命。整个行业已经设法将单元耐久性提高到足够高,确定了需要多少备用区域来补偿故障单元,并彻底优化了固件,即使在消费级硬件上,您也应该能够获得至少 3 年的使用寿命,尽管性能很差。对于较旧的 SSD 来说,情况确实如此,但现在情况已不再如此;在大多数情况下,这是旧时代遗留下来的神话。
公平地说,MLC 耐久性在高写入负载下仍然是一个因素。我们所说的高是指在几年内每天多次全盘写入。如果您处于这一性能级别,您可能不再处于“消费者”市场。
细胞重编程性能受到影响
或者,您说您需要 TRIM/Discard。这是 MLC 类型 SSD 众所周知的“缺陷”。但是,多年来固件调整已经减轻了写入这种类型的 SSD 的大部分性能损失。SLC 驱动器仍然可用,并且由于调整使 MLC 驱动器使用寿命更长,使用 SLC 的主要原因不再存在,因此它们现在非常罕见。但是,如果您将足够多的微小写入推送到磁盘,以至于延长了 MLC 的使用寿命,那么 SLC 设备就开始变得有意义了。
如果您在 DB 驱动器上分配了足够的未使用空间,大多数 SSD 固件都足够智能,能够注意到某些块未分配并将其视为额外的备用区域。当后台碎片整理进程启动时,将重新配置备用区域。这将保持高性能。因此,MySQL 中缺少块级丢弃支持并不重要。
答案2
关于 SSD 性能的良好总结和一些优秀参考资料可以在本系列博客文章。
第 6 章中的一般建议可能与您相关,因为我怀疑 TRIM 对数据库的帮助有多大,我认为数据库通常会覆盖块,而不会删除那么多文件。一个好的通用性能调优技巧是:
26. 过度配置对于磨损均衡和性能很有用
只需将驱动器格式化为小于最大物理容量的逻辑分区容量,即可实现过度配置。用户看不到的剩余空间仍将可见并由 SSD 控制器使用。过度配置有助于损耗均衡机制应对 NAND 闪存单元固有的有限使用寿命。对于写入不太繁重的工作负载,10% 到 15% 的过度配置就足够了。对于持续随机写入的工作负载,保持高达 25% 的过度配置将提高性能。过度配置将充当 NAND 闪存块的缓冲区,帮助垃圾收集过程吸收写入峰值。