Postgres 是否可以保护硬盘免受重复写入相同存储单元的影响?

Art*_*sov 2 postgresql disk-space

如果我每天向同一个表的同一列中的同一行写入 4 个字节(整数)100,000 次,这会磨损 SSD 吗?对于 SSD 来说,每天 400 kb 不算什么,但将其写入同一个存储单元就会弹出它。

  • Postgres 数据库管理系统是否在幕后以某种方式处理这些单元?
  • 或者现代 SSD 芯片在硬件中做到了这一点吗?
  • 还是所有数据都写入同一个存储单元,随着时间的推移,我们只是交换失效的 SSD?

Vér*_*ace 5

介绍:

必须意识到是,PostgreSQL对底层磁盘一无所知(无论它们是旋转 Rust 还是 SSD、RAID 配置还是其他任何东西)。PostgreSQL 将数据交给操作系统并信任操作系统来照顾它(有时不是一个好主意)!

对于SSD,这里需要考虑两个因素:

  • 磨损均衡

  • 修剪明

需要注意的是,这些都与系统上运行的应用程序(即 PostgreSQL、任何其他数据库服务器或任何应用程序)无关前者严格来说是SSD本身的属性/能力,后者是操作系统与SSD之间的“合作方式”。

磨损均衡:

重要信息:SSD均匀地将写入分布到不同的块,因为 SSD 块只能经历limited number of erase cycles before becoming unreliable

来自维基

磨损均衡尝试通过排列数据来解决这些限制,以便擦除和重写在介质上均匀分布。这样,就不会出现单个擦除块由于写入周期高度集中而过早失效的情况。3在闪存中,芯片上的单个块的使用寿命比其他块更长,因此内存控制器可以存储操作数据,而损坏的可能性较小。4

因此,SSD 决定将来自操作系统的数据实际放置在哪里(注意:没有提及该数据可能来自哪个应用程序)。简单的想法是,它将这些写入分布在驱动器周围,以均衡所有磁盘块的磨损,这样某些块就不会过早失败!

这很快就会变得复杂 - 请参阅 wiki 了解更多详细信息:

在此输入图像描述

修剪鸣:

要点:由于 SSD 的底层结构,只能写入空块 - 如果块中已经有数据,则必须读取旧数据并将其与新数据一起重写回块 - 这有助于写入放大

如果操作系统告诉磁盘(删除后)不再需要块 x 中的数据,则磁盘可以执行垃圾收集(可以调度),并且该块将为空,然后准备写入,无需写入放大。与对 HDD 进行碎片整理没有完全不同。

(再次来自维基- 对长引用表示歉意,但这是必要的):

SSD 将数据存储在闪存单元中,这些单元通常分为 4 到 16 kiB 的页,通常分为 128 到 512 页的块。示例:512 kiB 块将 128 个页面分组,每个页面 4 kiB。7个NAND闪存单元只有在空时才可以直接写入。如果它们碰巧包含数据,则必须在写入操作之前擦除内容。SSD写入操作可以对单个页面进行,但由于硬件限制,擦除命令总是会影响整个块;如图7所示,因此,将数据写入SSD上的空页非常快,但一旦需要覆盖先前写入的页,速度就会大大减慢。由于在再次写入之前需要擦除页面中的单元,但只能擦除整个块,因此覆盖将启动读取-擦除-修改-写入周期:[7][12]的内容整个块存储在缓存中,然后从SSD中擦除整个块,然后将覆盖的页面写入缓存块,然后才能将整个更新块写入闪存介质。这种现象称为写放大。[13][14]

操作 TRIM 命令使操作系统能够通知 SSD 不再包含有效数据的页面。对于文件删除操作,操作系统会将文件的扇区标记为可用于新数据,然后向 SSD 发送 TRIM 命令。修剪后,SSD在将新数据写入闪存页面时将不会保留块的任何内容,从而减少写入放大(更少的写入),更高的写入吞吐量(不需要读取-擦除-修改序列),从而延长驱动器的使用寿命。

存储的未来:

目前正在进行许多有趣的研究。存储,并且出于显而易见的原因,存储在数据库中。虽然就专业知识而言,这已经超出了我的薪资水平,但如果您搜索“字节可寻址磁盘”等术语,您将遇到诸如此处之类的网站,该网站是持久内存(字节可寻址)工具包的所在地( Intel Optane显然可以支持他的),那么按块读写数据的日子可能就屈指可数了?

要解释为什么我们首先要设置块,请参阅有关软件工程的线程,并参阅此处有关用户模式直接访问硬件、“绕过”操作系统的有趣讨论......所有令人着迷的东西!io_uring(和 eBPF)似乎是Linux 领域的新成员,但您可以在闲暇时仔细阅读。

回答问题:

如果我每天向同一个表的同一列中的同一行写入 4 个字节(整数)100,000 次,这会磨损 SSD 吗?对于 SSD 来说,每天 400 kb 不算什么,但将其写入同一个存储单元就会弹出它。

我对上述观点的看法是,SSD 会将写入分散到多个块上,从而导致大量工作。具体如何完成取决于 SSD 的磨损均衡算法。

Postgres 数据库管理系统是否在幕后以某种方式处理这些单元?

绝对!PostgreSQL 只是将数据交给文件系统,并让 FS 和操作系统负责存储(尽管请参阅此处了解由于 Linux 中的缺陷导致该过程崩溃的位置)。这是理所应当的——关注点分离

或者现代 SSD 芯片在硬件中做到了这一点吗?

我在这方面的阅读使我相信 SSD 固件负责磨损均衡和 TRIM-ming。

还是所有数据都写入同一个存储单元,随着时间的推移,我们只是交换失效的 SSD?

SSD 上通常有一个小的高耐磨区域,用于保存块写入数据,其中一些区域可以在块开始出现故障时保留区域 - 显然,您的 SSD 越复杂,您支付的费用就越高它。

重申一下:PostgreSQL 不知道控制数据一旦交给操作系统后会发生什么——它是缓冲的、直接到磁盘的还是随手丢失的?

这将取决于操作系统自己的调度算法及其所承受的负载 - 计算机科学的另一个完整领域!:-) ps +1 一个有趣的问题,让我了解了这一点(在待办事项列表上!)。