很多人似乎有这样的想法(1,2,3,4,5) 将 SSD 分区的起始位置对齐到 SSD 擦除块大小的倍数在某种程度上是有好处的。我看不出有什么好处;考虑以下分区(请暂时不要怀疑 16K 擦除块;实际上它们可能要大得多,分区也是如此):
Partitions: [ 1 ] [ 2 ]
Logical blocks: [ 4K ][ 4K ][ 4K ][ 4K ][ 4K ][ 4K ][ 4K ][ 4K ]
Physical blocks: [ 4K ][ 4K ][ 4K ][ 4K ][ 4K ][ 4K ][ 4K ][ 4K ]
Erase blocks: [ 16K ][ 16K ]
现在如果逻辑块钾对应物理块钾对于任意钾(例如,如果 SSD 控制器没有进行磨损均衡),那么这可能具有一定的理论价值。例如,假设上图中的分区 2 早一个逻辑/物理块开始。那么在分区 2 开头的任何写入都会导致第一个擦除块被擦除,对分区 1 的任何写入也会导致第一个擦除块被擦除,这将导致该特定擦除块的额外磨损。
然而,在磨损均衡技术中,逻辑块和物理块之间没有固定的对应关系(例如,逻辑块钾可以对应任意物理块大号),因此擦除块对齐应该完全没有意义。块大小对齐应该足够,以便写入分区的页面(用于交换)和文件系统块(用于数据)不会在 SSD 上占用比必要更多的块。
相关问题:
答案1
这个问题很难,特别是考虑到 SSD 技术在不断发展,并且现代操作系统也在不断改进对 SSD 的处理。
此外,我不确定你的问题是否与磨损均衡有关。它应该是与旨在避免块擦除的 SSD 优化有关。
首先让我们正确理解一下术语:
- SSD堵塞或者擦除块是 SSD 在一次原子操作中可以擦除的单位,通常最多可达 4MB 字节(但 128KB 或 256KB 更常见)。SSD 无法在未先擦除块的情况下写入该块。
- SSD页是 SSD 软件可以跟踪的最小原子单位。一个块通常包含多个页面,通常大小最多为 4KB。SSD 会保留每个页面的映射,以了解操作系统认为它在磁盘上的位置(SSD 会将页面写入其喜欢的任何位置,尽管操作系统会以顺序磁盘的方式思考)。
- A部门是操作系统认为硬盘一次操作可以写入的最小元素。操作系统也会考虑磁盘柱面和磁道,即使它们不适用于 SSD。操作系统通常会在某个扇区空闲时通知 SSD(修剪)。智能SSD固件通常会在可能的情况下向操作系统宣布其页面大小为扇区大小。
很明显,SSD 固件倾向于始终写入空块,因为它们已被擦除。否则,要将页面添加到包含数据的块将需要读取块/存储页面/擦除块/写入块的顺序。
过于随意地应用上述方法会导致页面分散到整个 SSD 中,大多数块变为部分空的,因此 SSD 可能很快就会用完空块。为了避免这种情况,SSD 将不断执行 垃圾收集在后台合并部分写入的块并确保有足够的空块可用。此操作可能如下所示:
[
垃圾收集引入了另一个因素 - 写入放大 - 这意味着一次操作系统对 SSD 的写入可能需要在 SSD 上进行多次物理写入。
由于 SSD 块在损坏之前只能被擦除和写入一定次数,磨损均衡 旨在将块写入均匀分布在 SSD 上,因此没有任何块的写入量比其他块多得多。
分区对齐问题
从上文来看,允许 SSD 将页面映射到任何物理位置(操作系统认为它们存储在何处)的机制似乎消除了分区对齐的需要。由于页面并非写入操作系统认为写入的位置,因此操作系统认为将数据写入何处不再重要。
但是,这忽略了操作系统本身试图优化磁盘访问的事实。对于传统硬盘,它会尝试通过在不同的轨道上相应地分配数据来尽量减少磁头移动。聪明的 SSD 固件应该操纵它报告给操作系统的虚构柱面和轨道信息,以便轨道大小等于块大小,页面大小等于扇区大小。
当操作系统对SSD的看法与现实更加一致时,操作系统所做的优化可能会避免SSD映射页面并避免垃圾收集,这将减少写入放大并延长SSD的寿命。
需要注意的是,SSD 碎片过多(即页面映射过多)会增加 SSD 的工作量。2009 年的文章 英特尔主流固态硬盘长期性能分析 指出,如果驱动器长时间受到小写入和大写入的混合使用,则可能会进入性能永久下降的状态,并且使用磨损均衡,这种情况可能会扩展到驱动器的更多部分。这种情况是许多 SSD 用户看到性能随时间下降的原因。
我最后的建议是对齐分区以尊重擦除块布局。操作系统将假定分区与磁盘对齐良好,并且它在文件放置方面做出的决定可能会更加智能。与往常一样,操作系统驱动程序与 SSD 固件的个别特性可能会消除此类担忧,但最好谨慎行事。
答案2
分区对齐到 SSD 擦除块大小是否毫无意义?
根据下面引用的 2008 年建议,似乎将分区与块大小边界对齐取决于任何给定 SSD 设备内的品牌、型号和控制芯片算法。
对于不使用智能技术和算法的老一代 SSD 设备,这样做可能更重要,但您应该检查 SSD 制造商的技术指南。
对于第一代固态硬盘来说,将文件系统与擦除块边界对齐至关重要,但英特尔 X25-M 应该有更智能的算法,可以减少写入放大的影响。细节有点模糊,但大概有一个映射表,可以将扇区(内部扇区大小为某个大小 — 我们不确定是 512 字节还是更大的大小)映射到单个擦除块。
快进到 2014 年,根据当时的以下建议,似乎读/写是在页面大小上对齐的,而擦除是在 SSD 空闲时完成的,这并不重要也没有意义。
读/写按页面大小对齐,擦除在 SSD 空闲时在后台进行。因此,擦除块大小无关紧要。页面大小很重要,但它总是很小,所以只需进行 MiB 对齐即可。文件系统无论如何都会将其分解为 4k 左右。不可能对齐到 1536KiB,因为文件系统中有数百个小文件。即使您将分区放在 1536KiB 边界上,并将文件系统设置为 1536KiB raid 步幅,您也不会注意到任何差异。读/写在页面级别完成,并由闪存转换层重新分配。因此,无论您如何尝试从外部对齐,SSD 都会将其破坏以达到自己的目的,那么这有什么意义呢?
结论
我认为磨损均衡是 2008 年文章中提到的那些 [更智能] 较新的 SSD 算法之一,而现在这种算法(以及其他相关的现代 SSD 和分区技术)在 SSD 设备中更为常见,这意味着这种对齐更可能是毫无意义的。
我认为互联网上关于这个话题的一些讨论在某些情况下可能是正确的,基于这些文章中可能提到的 SSD 技术,因此这些内容可能根本不适用于其他人,具体取决于他们使用的内容。
这取决于您对 SSD 设备的规格、特性、功能等的理解,以及您在执行此类操作时使用的任何分区工具,以确保在您的环境中实现最佳配置,无论这是否是一项毫无意义的操作。
更多资源
答案3
这Drink 的回答非常好。但我想进一步解释一下。
如果您在互联网上搜索该主题,您会发现一大堆“指南”(甚至是最近的指南),这些指南都基于旧的、错误的信念,即您可以以某种方式“告诉文件系统在 SSD 的擦除块边界内对齐/条带化其数据”。
那是非常非常非常愚蠢的信念。
事实上,SSD 会将每个扇区放在任何位置。每个擦除块包含许多扇区。编写这些“指南”的外行人错误地认为 SSD 会将扇区按顺序(就像硬盘一样)放置在这些擦除块中,因此您可以强制文件系统将尽可能多的相关数据放置在每个物理擦除块中,从而使未来的擦除操作一次性删除整个文件(因此整个擦除块),并且未来的文件写入将通过单个“擦除此擦除块中的所有扇区,然后写入此擦除块中的所有扇区”就地替换整个擦除块的内容,而不必保留擦除块中的某些扇区并将其重写到其他地方。基本上,“跨度/条带”的想法是暗示文件系统将物理 SSD 擦除块中的相关数据组合在一起。
这个想法在理论上听起来不错。但 SSD 的工作原理已不再如此。
这是真的,真的不是如何任何这部作品。
SSD 不关心你的“连续扇区”,而是将数据写入任何空的物理扇区任何地方在NAND闪存芯片上。
当您告诉 SSD 写入扇区 1 时,它可能会将数据放在物理扇区 21349239 中。但它会向操作系统假装它位于“扇区 1”中。此外,当您的操作系统告诉 SSD 写入连续扇区(1、2、3、4、...)时,SSD 会将扇区分散到其 NAND 芯片上任何有单独空扇区的地方。它不会将它们按顺序放在“擦除块”上!
这是因为 SSD 使用磨损均衡算法来决定将给定的“虚拟扇区”放置在 NAND 闪存芯片上的哪个物理扇区中。然后,它会存储一个查找表,其中写着“虚拟扇区(操作系统认为的扇区)= 存储在物理位置 X”。因此,当您从操作系统写入“连续的扇区”时,由于磨损均衡,您的数据最终总是会随机散布在整个 SSD 上。
此外,每当一个扇区死亡(完全磨损并且无法再可靠地保存数据)时,SSD 就会将其移动到闪存上的其他位置并重新映射它。
你根本不知道 SSD 会将你的扇区放在哪里。它根本不是连续的。
2009 年,当这些“跨越式”讨论逐渐受到关注时,曹德强是 Linux 内核文件系统(特别是 ext4)的主要工程师之一,他写了一篇博客文章,认为所有这些都毫无意义,因为 SSD 会将数据放在它想要的任何地方。不幸的是,没有足够多的人听从他的话。这是他关于这个主题的过时博客文章(不要听从任何建议;这些建议都非常过时,他谈论的所有工具现在都已更新为可以进行 MiB 对齐):https://tytso.livejournal.com/2009/02/20/
这篇博文的有趣之处在于它告诉我们起源针对这些关于“SSD 擦除块边界”的错误观念。因为它谈到了很古老,第一代 SSD 没有进行磨损均衡,也没有将“虚拟扇区(操作系统看到的)”映射到随机硬件扇区。在早期的 SSD 中,扇区是真正连续的,这就是跨步/条带建议诞生的原因。现代 SSD 更加先进。任何遵循被误导的外行人提出的旧“跨步/条带”建议的人都只是在浪费时间。
这篇博文进一步谈到了当时英特尔的固态硬盘更为先进,拥有虚拟扇区重映射表,但缺乏 TRIM。他说,这种虚拟重映射已经快要消除对跨度/条带的需求了。然后他(正确地)推测,如果实施了 TRIM,就不再需要“沿擦除块对齐”。
这就是我们今天所处的境况,拥有现代 SSD。
现代 SSD 使用虚拟重映射(扇区在硬件上不是连续/连续的),并使用 TRIM 来释放扇区。因此,尝试对齐“擦除块”没有任何好处,因为没有这样的事不再在硬件上。正如我所说,你从操作系统写入的扇区最终将随机分布在整个磁盘上在现代磨损均衡 SSD 上。
尝试在现代 SSD 的擦除块上对齐文件系统数据是徒劳的,而且永远不会奏效。所以不要浪费你的时间。
唯一重要的事情是:
1. 行业协调。
对齐分区(起始偏移和大小)、LUKS 有效负载偏移、LVM 有效负载(第一个 PE)偏移等,均在 1 MiB 边界处。这可确保它们与任何物理扇区大小,无论 SSD 使用的是 512 字节、4096、8192、16384 还是任何其他 2 的幂次方物理扇区大小。
这是因为 1 MiB(1 048 576 字节)可以被全部SSD 使用的扇区大小。因此,只要您将分区和数据结构(LUKS 和 LVM 的有效负载)与这些边界对齐,操作系统操作的所有虚拟扇区都将与物理扇区正确对齐。
这样做的目的是确保对虚拟扇区(操作系统读取/写入的内容)的写入与 SSD 上的物理扇区对齐,以便单个虚拟扇区的数据仅占用单个物理扇区,而不是分散到多个扇区(这将始终需要 SSD 读取两个或更多扇区,修改操作系统虚拟扇区所在的重叠部分,然后将所有修改后的扇区写入 SSD 上的新位置)。
如果您将其对齐到 1 MiB 边界,则无论操作系统扇区的大小如何,它们始终都会与物理扇区完美对齐。 如果不这样做,SSD 的速度将大幅降低,并且由于上述每次写入总是修改多个物理扇区(而不是单个扇区)的过程而导致严重的写入放大。
幸运的是,所有现代工具(如 GParted、cryptsetup 和 LVM)默认都进行 1 MiB 对齐。这就是您所需要的。
2. 修剪。
这非常重要。非常重要。非常重要。这和对齐本身一样重要。
TRIM 会告诉 SSD 哪些扇区可以丢弃。如果你在不使用 TRIM 的情况下运行(例如使用默认设置的 LUKS 和 LVM,它们不会转发丢弃),那么你的 SSD 的内部查找表将完全填满,认为每个部门都很重要并且包含“活动数据”。因此,SSD 将无法再进行“垃圾收集”。即使您的驱动器只是部分满,它也会认为它已经完全满了。并且写入将是一个非常缓慢的操作,如果它还能工作的话。如果没有 TRIM,将会出现极端的写入放大,因为所有这些死数据将继续被 SSD 保留并被调换/写入到新位置,因为它很难写入数据(涉及整个擦除块中所有扇区的大量读取-修改-写入),因为 SSD 认为整个驱动器都充满了重要数据。
相比之下,使用 TRIM已启用,您的 SSD 将被告知哪些数据已失效。然后,SSD 控制器将从多个擦除块中取出所有活动的 SSD 扇区,将它们全部合并为一个包含活动数据的新块(例如,将三个 30% 满的块(其余 70% 为垃圾)合并为一个 90% 满的块,其中 10% 为空块,可供将来写入),然后擦除所有“垃圾块”,以便其内部扇区完全清空并准备好进行新写入。在现代 SSD 控制器中,这种垃圾收集会持续进行(只要 SSD 处于空闲状态),不断移动和压缩块,检查活动扇区的健康状况,并优化 NAND 闪存以供将来写入。
这又回到了最初的观点,相信可以使用“文件系统步幅”将扇区与 SSD 擦除块对齐是毫无意义的。请记住,SSD 可以写入任何仍为空的扇区任何“擦除块”任何地方在物理存储上。SSD 会不断将这些扇区移动到新的擦除块中,以优化驱动器性能。
使用 TRIM 时你唯一要考虑的是不是使用“即时丢弃”(即使用“丢弃”标志挂载 ext4)。因为每当扇区空闲时,不断通知 SSD 有关死数据的信息,会导致它一直过度地对少量数据进行混洗/压缩/垃圾收集。相反,您应该使用每周计时器,对所有未使用的块进行大规模“一次性”修剪。这是现代操作系统默认的做法。例如,Windows 使用每周计时器(您可以通过打开内置的“优化驱动器”应用程序来查看它),而基于 Linux systemd 的操作系统基本上都包含“fstrim.timer”,这会导致“fstrim.service”每周执行一次。反过来执行/usr/sbin/fstrim --fstab --verbose --quiet
。fstrim 命令会通知存储设备(物理和虚拟)有关未使用的块的信息。事实上,这不仅有助于 SSD。它还有助于 LVM 精简配置(多个卷共享相同的物理空间池)等将块返回到空闲池。所以 TRIM 只是对每一个您的系统的一部分!
最后,关于加密的一个小补充。如果您使用的是 LUKS(加密),您可能已经看到过有人激烈地抱怨说您不应该使用 TRIM,因为它“不安全”。这不是真的。攻击者从加密驱动器上的空(归零)扇区中得到的唯一信息是,他们将知道您在那里有多少数据(例如,如果它已满 50%),这实际上对他们没有任何帮助。它还告诉他们已使用扇区的虚拟位置,这让他们能够非常准确地猜测如果驱动器几乎为空,则使用的是哪个文件系统,因为文件系统元数据存储偏移量等信息将可见。但它不会让他们进入您的数据。猜猜怎么着?除非您是政府,否则我可以向您保证,您会更高兴拥有一个健康、快速、经过 TRIM 处理的驱动器,并且使用寿命长、非常健康。所以为了您自己,启用 TRIM 吧!此外,您真的认为作为一个普通人,您会遇到试图分析空闲(修剪过的)扇区来猜测您计算机的攻击者吗?这种偏执的威胁模型对我们大多数人来说毫无意义。使用安全密码更为重要,这样随机的人就不会只输入“密码”就解锁您的系统!;-)
好了,这就是你想知道的关于这个主题的所有内容。简短的执行摘要如下:
- 通过步幅/条纹“擦除块”进行对齐是完全不可能在现代 SSD 上,在 2010 年左右制造的任何产品上。所以不要尝试。它基于第一代 SSD 的古老信息,这些 SSD 过去按顺序存储扇区并且缺乏 TRIM。这些都不再是事实。如今,所有 SSD 都使用磨损均衡将扇区随机存储在 NAND 上任何有空扇区的任何地方,并使用虚拟映射表来跟踪数据在磁盘上的真实存储位置。它们依靠 TRIM 来消除浪费的存储/写入放大。
- 但是您必须将所有数据容器(例如分区起始+大小、LUKS 负载和 LVM 的第一个物理扩展)对齐到 1 MiB 边界,以确保您的虚拟存储层扇区全部与物理扇区对齐,从而确保您的写入仅占用单个扇区。所有现代工具(例如 GParted、cryptsetup 和 LVM)现在都默认执行这种普遍完美的 1 MiB 对齐。
- 启用 TRIM。极其SSD 非常重要需要有关死区/无用扇区的知识,以便进行正确的垃圾收集、提高性能并延长使用寿命。
- 额外提示:至于文件系统块大小(无论您使用哪种文件系统),无论物理扇区大小如何,您都应该使用 4096 字节,因为这可以实现现代文件大小的最终性能/空间效率平衡。文件系统块越大,内核中断的开销就越少(因为每个块都必须经过中断和队列)。但大于 4096 是没有意义的,因为性能收益递减,同时增加了小文件的浪费。所以这就是为什么所有现代文件系统都默认使用 4096 字节块的原因。
享受!
答案4
是的,对齐分区以擦除块大小是绝对没有意义的。
没有任何权衡:你不会从中获得任何好处。
SSD 和 eMMC 都有一个闪存转换层 (FTL),它以一定的粒度映射用户存储块。您需要与该大小对齐,这就是全部内容。这些块通常为 512 字节到 4K 字节。
然而,1MB 对齐是一种浪费的事实标准,可以在任何介质上很好地工作,并且没有人会因为您将 PC 分区与之对齐而将您烧死。但如果您是一名嵌入式开发人员,正在设计一个具有 20 多个分区的设备,其中大多数分区都很小(即:OpenWrt、AOSP(又名 Android)、Chromium OS 等),那么不,您至少希望更有效地对齐较小的分区。
FS 块大小:不要听从人们建议减少 FS 块大小以匹配 SSD 块大小。而是与专家交谈:去搜索文件系统的制作和批评所在的 Linux 内核档案。
SSD 根本不关心您的 FS 块大小,并且您写入的任何块都会被转换(通常压缩然后加密)并存储在闪存中的日志结构中,这与人们通常想象的内部发生的事情没有多大关系。SSD 很乐意将尽可能多的压缩用户块放入其一个块中 - 不存在 1:1 的对应关系 - 并且还可以拥有同一用户块的许多不同历史版本。
压缩和/或加密必需的固态硬盘 (SSD) 可以正常工作。写入物理闪存的数据必须看起来像随机数据,否则闪存可能会发生故障。如果攻击者可以预测 SSD 将存储在闪存中的确切二进制模式,那么他们就可以 - 即使没有提升的权限 - 设计将转换为二进制模式的数据,从而破坏闪存的功能。攻击者可以长期可靠地预测闪存上的访问模式的情况也是如此。(这些攻击类似于行锤击型 DRAM 攻击。)
你可以优化什么:正如您可以将 FS 块大小问题交给 FS 专家一样,您也可以将 SSD 块大小问题交给 SSD 专家。还有谁比您的驱动器设计师更值得信赖呢?
典型的现代 SSD 是 NVMe。NVMe 设备可分区为称为命名空间的“虚拟驱动器”(尽管遗憾的是,消费者 NVMe 设备通常仅限于工厂提供的唯一命名空间)。对于每个命名空间(即您的“驱动器”概念),您都可以选择 LBA 格式,即其块大小。要更改块大小,您需要格式化命名空间(这会完全擦除其数据)。
您可以询问您的 NVMe 命名空间它支持哪种 LBA 格式,以及它们的性能如何(根据设计您的驱动器的专家的说法)。
在 Linux 上,对于我的驱动器:
$ sudo nvme id-ns -H /dev/nvme0n1 | grep LBA
[3:0] : 0x1 Current LBA Format Selected
[0:0] : 0 Metadata as Part of Extended Data LBA Not Supported
LBA Format 0 : Metadata Size: 0 bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good
LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better (in use)
您可以看到,我将其从兼容性更强、性能最差的 512 字节扇区模式更改为使用 4K 扇区。
您可以在擦除整个命名空间的同时更改它:
$ sudo nvme format --lbaf=1 /dev/nvme0nX_THIS_WILL_WIPE_EVERYTHING
再次强调,这是针对 Linux 的。其他操作系统的用户可以向其出色的操作系统提供商寻求帮助... :-p
警告:文件系统可能依赖于底层驱动器的扇区大小(在 FS 格式化期间嵌入)。如果您计划格式化并安装 OS/复制文件,这不是问题。如果您计划将磁盘映像从另一个驱动器移动(或最终移动到另一个驱动器),这可能会给您带来麻烦。
就我而言,我第一手了解到我的 btrfs 二进制磁盘映像可以毫无问题地从 512B 磁盘移动到 4KB 磁盘。我希望,在设计良好的 FS 上,只要满足以下不等式,您就可以随意移动二进制映像:磁盘块大小 <= FS 块大小。