我有一个相当老旧的邮件服务器 (CentOS 6),maildirs 中有 4+ Tb 的邮件(因此您可以想象文件数量)。它是 SSD 存储上的 VM (VMware 7)。
我想知道我是否应该关心 FS 碎片?我可以将整个存储 rsync 到新的 VM 磁盘(有效地将碎片化程度降至几乎为零),或者运行在线碎片整理工具(因为这是 XFS),但我是否应该关心?SSD 支持的存储似乎可以原谅任何事情?
答案1
您不应尝试对 SSD 上的文件/文件夹进行碎片整理。碎片整理对固态存储没有任何用处,因此不应使用。“碎片”实际上并不适用于 SSD 中的单元组织。
如果您需要缩小(减少机器占用的空间),您可以在 VMware 中使用 shrink 命令执行此操作。
我经常使用 shrink,但你得试试老款机器。应该可以。
打开终端会话,从那里运行:
sudo vmware-toolbox-cmd disk shrink /
允许收缩完成。有一个终端组件将达到 100%,然后是 VMware GUI 窗口将收缩机器。
收缩将恢复空间并删除机器中未使用的空间,但对性能的影响很小
答案2
碎片整理有何帮助?
当使用旋转磁盘将数据存储在 HDD 上时,碎片整理可显著减少机械寻道时间损失。这些设备上高度碎片化的文件系统可能会变得非常慢。固态设备没有任何寻道损失。然而,现代高速 SSD 通常受到 IOPS 限制,这意味着通过总线发送命令的速率是瓶颈,而不是设备访问实际数据和满足这些请求的能力。
对文件系统进行碎片整理会增加给定文件中连续逻辑扇区的数量。这可以提高性能,即使对于 SSD 也是如此,因为读取文件的一小部分可以通过单个 I/O 请求完成。如果同一部分是碎片化的,则可能需要多个请求。当使用具有严重碎片化的文件系统的超快 SSD 时,这很容易使总线饱和。
然而,还有更好的方法可以提高性能。
改用 TRIM
如果你想提高 SSD 的性能,你必须帮助 SSD 知道哪些块可以擦除,方法是使用修剪。TRIM 命令允许文件系统告诉 SSD 哪些扇区是空的,可以交给垃圾收集器,即使它们上面仍有(未分配的)数据。这大大提高了设备管理存储的能力。在 Linux 上,您可以执行该命令fstrim /var/mail
(或您的分区所在的任何位置)为 SSD 提供可以丢弃的未分配扇区的列表。请参阅fstrim(8)
有关命令使用的更多详细信息。
TRIM 大大提高了 SSD 对抗写入放大并允许更好的磨损平衡。这不会加速读它会从设备读取数据,但会加快写入速度。如果您的驱动器的可用空间很少,那么好处就更少了(毕竟,您没有太多可用扇区)。
固态硬盘有自己的碎片整理方式
因为超速运输SSD 的闪存转换层(闪存控制器的一部分)负责将逻辑扇区映射到物理扇区,在大多数情况下,没有必要对文件系统进行碎片整理。碎片整理所花费的时间和磨损通常不值得。
SSD 会自动尝试优化文件的存储。这种优化受制于 NAND 闪存的限制。要理解这些限制,我们必须先了解一些术语:
细胞是闪存设备中存储数据的最小物理单元。在 SLC 设备中,每个单元存储一个位。MLC 设备中,每个单元存储两个位(通过保持四个不同的电压水平)。TLC 设备存储三个位(通过保持 8 个),QLC 设备存储四个位(通过保持 16 个)。多个单元加上一些额外的单元来保存有助于从单个单元故障中恢复的纠错码,构成了一个页。
页面是一组可以一次读取或写入的单元。页面是 NAND 闪存设备实现物理扇区的方式,大多数页面大小在 512 字节到 4 KiB 之间。页面只有在被擦除(所有位都初始化为 1)后才能写入。如果页面上有数据,则必须先擦除才能覆盖。这是因为单个位只能从 1 更改为 0。相反,只能通过擦除整个页面来完成。但是,无法擦除单个页面。要擦除页面,必须擦除整个页面堵塞。
区块是页面的集合,以数十或数百千字节为单位。128 个单独的 4 KiB 页面可能组成一个 512 KiB 块。对单个块可以采取的唯一操作是擦除。这将擦除它包含的所有页面。任何需要保留的页面中的任何数据都必须移动到已经有一些已擦除页面的另一个块中。这是由闪存控制器透明完成的。如果空闲块很少,控制器可能需要移动一些数据才能写入任何内容,这会持续减慢写入速度。
这就带来了一个问题:为了最有效地优化写入,SSD 需要知道文件系统不再需要哪些扇区。然而,块存储设备甚至没有概念文件系统。它们无法区分不再分配给任何文件但仍包含剩余数据的扇区和仍是文件一部分且必须保留的扇区。因为让 SSD 了解文件系统是一项永无止境的任务,所以最好只是告诉 SSD 文件系统不再需要哪些扇区。现代 SSD 通过 TRIM 支持这一点。
答案3
SSD 不需要花费额外的时间在磁盘的远距离部分之间进行搜索,因此潜在的收益非常小。比如,最多只能稍微减少服务器的 CPU 使用率,也许只是百分之几,这只是一个大胆的猜测。
但这是一个合理的问题;如果对多个小文件的读取可以在块级别合并为一个更大的读取,那么发送到 SSD 的命令就会减少,因此您将获得更多的可用带宽。至少这是值得期待或怀疑的合理事情。读取一个较大的文件也是如此。
但这可能仍然不足以证明采取任何实际行动是合理的,尤其是因为XFS 只能对单个文件进行碎片整理,据我所知,不能将多个小文件分组到连续的存储中(按文件名顺序或其他方式)。
您的文件大多很小,每个单独的文件可能都是一次性写入的,而不是稍后附加的。您说您有 maildir,每封电子邮件一个文件。不像mbox
传统的/var/mail
,每个邮箱一个文件,邮件到达时附加。在这种情况下可能会有碎片,尽管删除邮件至少需要从该点重写文件的尾部。
因此,在这种情况下,您可能没有太多 XFS 可以解决的碎片;大多数文件可能只有一个区。您可以使用 进行检查filefrag /var/mail/**/* | grep -v '1 extent found'
。
如需了解更多详细信息,您可以使用filefrag -e
查看文件的各个范围,或者由于您使用的是 XFS,因此您可以使用xfs_bmap
获取相同的信息。请参阅unix.SE 答案例如输出。
正如@Roger Lipscombe评论,即使逻辑块地址连续,存储文件数据的物理闪存单元也可能不连续;SSD 内部的闪存重映射层可能会在该级别上产生碎片。但这没关系;SSD 固件应该能够以最小的开销读取闪存的必要部分;与内核必须以某种协议(SATA、SAS 或 NVMe)发送命令不同,固件直接连接到原始闪存,读取 2 个独立区域可能不会比读取一个较长区域慢。
答案4
对固态硬盘进行碎片整理并不能提高磁盘性能,因为固态硬盘不像有移动部件的硬盘那样有寻道/磁头移动时间。碎片整理还会增加芯片的磨损,因为芯片的写入次数有限,从而缩短使用寿命。
如果需要缩小分区,则可以在卸载驱动器的情况下进行此操作。