Alexander Asked: 2022-12-20 12:16:26 +0800 CST2022-12-20 12:16:26 +0800 CST 2022-12-20 12:16:26 +0800 CST 在 SSD(很多文件)上对 XFS 进行碎片整理是否值得? 772 我在 maildirs 中有 4+ Tb 邮件的相当旧的邮件服务器 (CentOS 6)(所以你可以想象文件的数量)。它是 SSD 存储上的 VM (VMware 7)。 我想知道我是否应该关心 FS 碎片?我可以将整个存储 rsync 到新的 VM 磁盘(有效地使碎片几乎为零),或者运行在线碎片整理工具(因为这是 XFS),但我应该关心吗?SSD 支持的存储似乎可以原谅任何事情? ssd email 4 个回答 Voted forest 2022-12-21T14:59:06+08:002022-12-21T14:59:06+08:00 碎片整理有何帮助? 在使用旋转磁盘的 HDD 上存储数据时,碎片整理会显着减少机械寻道时间损失。这些设备上高度碎片化的文件系统会变得非常慢。固态设备没有任何寻道惩罚。然而,现代高速 SSD 通常受 IOPS 限制,这意味着通过总线发送命令的速率是瓶颈,而不是设备访问实际数据和服务这些请求的能力。 对文件系统进行碎片整理会增加给定文件中连续逻辑扇区的数量。这可以提高性能,即使对于 SSD 也是如此,因为读取文件的一小部分可以通过单个 I/O 请求完成。如果同一部分是零散的,则可能需要多个请求。当使用极快的 SSD 和严重碎片化的文件系统时,这很容易使总线饱和。 但是,有更好的方法来提高性能。 改为使用 TRIM 如果你想提高 SSD 的性能,你必须帮助 SSD 知道哪些块可以使用TRIM擦除。TRIM 命令允许文件系统告诉 SSD 哪些扇区是空的并且可以移交给垃圾收集器,即使它们上面仍然有(未分配的)数据。这大大提高了设备管理存储的能力。在 Linux 上,您可以执行命令fstrim /var/mail(或您的分区所在的任何位置)为 SSD 提供可以丢弃的未分配扇区列表。有关fstrim(8)命令用法的更多详细信息,请参见。 TRIM 大大提高了 SSD 抵抗写入放大的能力,并允许更好的磨损均衡。这不会加快从设备读取的速度,但会加快写入速度。如果您的驱动器的可用空间非常小,那么收益就会减少(毕竟,您不会有很多可用扇区)。 固态硬盘有自己的碎片整理形式 因为 SSD 的FTL(闪存转换层,闪存控制器的一部分)负责将逻辑扇区映射到物理扇区,所以在大多数情况下没有必要对文件系统进行碎片整理。碎片整理和磨损所花费的时间通常是不值得的。 SSD 将自动尝试优化文件存储。此优化受 NAND 闪存的限制。为了理解这些限制,我们必须描述一些术语: 单元是闪存设备中存储数据的最小物理单元。在 SLC 设备中,每个单元存储一个位。MLC 器件,每个单元存储两个(通过保持四个不同的电压电平)。TLC 设备存储三个(按住 8 个),QLC 存储四个(按住 16 个)。多个单元格,加上一些额外的内容来保存有助于从单个单元格的故障中恢复的纠错码,组成一个页面。 页面是可以立即读取或写入的单元格的集合。页是 NAND 闪存设备实现物理扇区的方式,大多数页的大小在 512 字节到 4 KiB 之间。页面只有在被擦除后才能写入(所有位都初始化为 1)。如果页面上有数据,则必须先擦除才能覆盖它。这是因为单个位只能从 1 更改为 0。反之只能通过擦除整个页面来完成。但是,无法擦除单个页面。要擦除一页,您必须擦除整个块。 块是页面的集合,以数十或数百 KB 为单位。128 个单独的 4 KiB 页面可以组成一个 512 KiB 块。可以对单个块执行的唯一操作是擦除。这将擦除它包含的所有页面。任何需要保留的页面中的任何数据都必须移动到另一个已经有一些已擦除页面的块。这是由闪存控制器透明地完成的。如果您的空闲块很少,控制器可能需要移动一些数据才能写入任何内容,这会减慢连续写入的速度。 这就带来了一个问题:为了最有效地优化写入,SSD 需要知道文件系统不再需要哪些扇区。然而,块存储设备甚至没有文件系统的概念。他们无法区分不再分配给任何文件但仍包含剩余数据的扇区和仍然是文件一部分且必须保留的扇区。因为让 SSD 识别文件系统将是一项 Sisyphean 任务,所以最好简单地告诉 SSD 文件系统不再需要哪些扇区。现代 SSD 通过 TRIM 支持这一点。 Best Answer John 2022-12-20T12:20:37+08:002022-12-20T12:20:37+08:00 您不应尝试对 SSD 上的文件/文件夹进行碎片整理。碎片整理对固态存储没有任何用处,不应使用。“碎片化”并不真正适用于 SSD 中的单元组织。 如果您需要收缩(减少机器占用的空间),您可以在 VMware 中使用收缩命令执行此操作。 我经常使用 shrink,但你必须尝试使用旧机器。它应该工作。 打开终端会话,从那里运行: sudo vmware-toolbox-cmd disk shrink / 让收缩完成。有一个将达到 100% 的终端组件,然后是一个将缩小机器的 VMware GUI 窗口。 收缩将恢复空间并删除机器中未使用的空间,但对性能影响很小(如果有的话) Peter Cordes 2022-12-21T11:25:57+08:002022-12-21T11:25:57+08:00 SSD 不会花费额外的时间在磁盘的遥远部分之间寻找,因此潜在的收益非常小。充其量只是服务器 CPU 使用率的微小减少,可能是一个疯狂的猜测。 但这是一个有效的问题;如果多个小文件的读取可以在块级别合并为一个更大的读取,那么发送到 SSD 的命令就会更少,因此您将获得更多可用带宽。至少这是值得期待或怀疑的合理事情。读取一个更大的文件也是如此。 但它仍然可能无法证明实际做任何事情,特别是因为XFS 只能对单个文件进行碎片整理,而不是 AFAIK 将多个小文件分组到连续存储中(按文件名或其他顺序)。 您的文件大多很小,每个单独的文件可能都是一次性写入的,而不是稍后附加的。你说你有 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 个独立区域可能不会比读取一个较长区域慢。 SHawarden 2022-12-20T12:27:13+08:002022-12-20T12:27:13+08:00 对固态驱动器进行碎片整理不会提高磁盘性能,因为在具有移动部件的驱动器中不存在寻道/磁头移动时间。它还会增加写入次数有限的芯片的磨损,从而缩短使用寿命。 如果您需要缩小分区,可以在卸载驱动器的情况下执行此操作。
碎片整理有何帮助?
在使用旋转磁盘的 HDD 上存储数据时,碎片整理会显着减少机械寻道时间损失。这些设备上高度碎片化的文件系统会变得非常慢。固态设备没有任何寻道惩罚。然而,现代高速 SSD 通常受 IOPS 限制,这意味着通过总线发送命令的速率是瓶颈,而不是设备访问实际数据和服务这些请求的能力。
对文件系统进行碎片整理会增加给定文件中连续逻辑扇区的数量。这可以提高性能,即使对于 SSD 也是如此,因为读取文件的一小部分可以通过单个 I/O 请求完成。如果同一部分是零散的,则可能需要多个请求。当使用极快的 SSD 和严重碎片化的文件系统时,这很容易使总线饱和。
但是,有更好的方法来提高性能。
改为使用 TRIM
如果你想提高 SSD 的性能,你必须帮助 SSD 知道哪些块可以使用TRIM擦除。TRIM 命令允许文件系统告诉 SSD 哪些扇区是空的并且可以移交给垃圾收集器,即使它们上面仍然有(未分配的)数据。这大大提高了设备管理存储的能力。在 Linux 上,您可以执行命令
fstrim /var/mail
(或您的分区所在的任何位置)为 SSD 提供可以丢弃的未分配扇区列表。有关fstrim(8)
命令用法的更多详细信息,请参见。TRIM 大大提高了 SSD 抵抗写入放大的能力,并允许更好的磨损均衡。这不会加快从设备读取的速度,但会加快写入速度。如果您的驱动器的可用空间非常小,那么收益就会减少(毕竟,您不会有很多可用扇区)。
固态硬盘有自己的碎片整理形式
因为 SSD 的FTL(闪存转换层,闪存控制器的一部分)负责将逻辑扇区映射到物理扇区,所以在大多数情况下没有必要对文件系统进行碎片整理。碎片整理和磨损所花费的时间通常是不值得的。
SSD 将自动尝试优化文件存储。此优化受 NAND 闪存的限制。为了理解这些限制,我们必须描述一些术语:
单元是闪存设备中存储数据的最小物理单元。在 SLC 设备中,每个单元存储一个位。MLC 器件,每个单元存储两个(通过保持四个不同的电压电平)。TLC 设备存储三个(按住 8 个),QLC 存储四个(按住 16 个)。多个单元格,加上一些额外的内容来保存有助于从单个单元格的故障中恢复的纠错码,组成一个页面。
页面是可以立即读取或写入的单元格的集合。页是 NAND 闪存设备实现物理扇区的方式,大多数页的大小在 512 字节到 4 KiB 之间。页面只有在被擦除后才能写入(所有位都初始化为 1)。如果页面上有数据,则必须先擦除才能覆盖它。这是因为单个位只能从 1 更改为 0。反之只能通过擦除整个页面来完成。但是,无法擦除单个页面。要擦除一页,您必须擦除整个块。
块是页面的集合,以数十或数百 KB 为单位。128 个单独的 4 KiB 页面可以组成一个 512 KiB 块。可以对单个块执行的唯一操作是擦除。这将擦除它包含的所有页面。任何需要保留的页面中的任何数据都必须移动到另一个已经有一些已擦除页面的块。这是由闪存控制器透明地完成的。如果您的空闲块很少,控制器可能需要移动一些数据才能写入任何内容,这会减慢连续写入的速度。
这就带来了一个问题:为了最有效地优化写入,SSD 需要知道文件系统不再需要哪些扇区。然而,块存储设备甚至没有文件系统的概念。他们无法区分不再分配给任何文件但仍包含剩余数据的扇区和仍然是文件一部分且必须保留的扇区。因为让 SSD 识别文件系统将是一项 Sisyphean 任务,所以最好简单地告诉 SSD 文件系统不再需要哪些扇区。现代 SSD 通过 TRIM 支持这一点。
您不应尝试对 SSD 上的文件/文件夹进行碎片整理。碎片整理对固态存储没有任何用处,不应使用。“碎片化”并不真正适用于 SSD 中的单元组织。
如果您需要收缩(减少机器占用的空间),您可以在 VMware 中使用收缩命令执行此操作。
我经常使用 shrink,但你必须尝试使用旧机器。它应该工作。
打开终端会话,从那里运行:
让收缩完成。有一个将达到 100% 的终端组件,然后是一个将缩小机器的 VMware GUI 窗口。
收缩将恢复空间并删除机器中未使用的空间,但对性能影响很小(如果有的话)
SSD 不会花费额外的时间在磁盘的遥远部分之间寻找,因此潜在的收益非常小。充其量只是服务器 CPU 使用率的微小减少,可能是一个疯狂的猜测。
但这是一个有效的问题;如果多个小文件的读取可以在块级别合并为一个更大的读取,那么发送到 SSD 的命令就会更少,因此您将获得更多可用带宽。至少这是值得期待或怀疑的合理事情。读取一个更大的文件也是如此。
但它仍然可能无法证明实际做任何事情,特别是因为XFS 只能对单个文件进行碎片整理,而不是 AFAIK 将多个小文件分组到连续存储中(按文件名或其他顺序)。
您的文件大多很小,每个单独的文件可能都是一次性写入的,而不是稍后附加的。你说你有 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 个独立区域可能不会比读取一个较长区域慢。
对固态驱动器进行碎片整理不会提高磁盘性能,因为在具有移动部件的驱动器中不存在寻道/磁头移动时间。它还会增加写入次数有限的芯片的磨损,从而缩短使用寿命。
如果您需要缩小分区,可以在卸载驱动器的情况下执行此操作。