鉴于我想创建自己的数据库存储,文件应该是什么大小以避免碎片和文件系统开销,特别是考虑到“新”SSD?
例如,很多 64 KB 的文件可以吗?还是会以惊人的速度用完文件(inode)条目?
使用大文件并仅在 64 KB 范围内访问它会更好吗?
(我以 64 kbyte 为例。也许 4kbyte 是神奇的大小?还请告诉我我是在漫无边际,或者我是否表达了我的观点。)
好问题。
现代 SSD 中的闪存通常(!)结构如下:可写入的 2K 或 4K 的页面大小和 256K 的擦除块。一个页面不能在不删除之前被覆盖。但擦除操作仅适用于完全擦除块。但是,每次擦除操作都需要很长时间(与其他 IO 操作相比)并且会慢慢磨损 SSD。
SSD 控制器的一个组件称为 FTL(闪存转换层)用于在闪存语义上提供类似 HDD 的块设备的错觉。SSD 可以像 HDD 一样使用,但要充分利用它(并长期使用它),结合存储知识的软件 IO 设计效果最好。
但是,SSD 控制器逻辑通常是未知的。所以它可能因 SSD 不同而有所不同,但这里有一些经验法则:
如果可能的话,我会将我的 IO 模式和文件大小与完全擦除块(或它的倍数)对齐。因此写入 256K 的文件使用完全擦除块,没有任何内部碎片。像 64K 这样的较小文件只会使用其中的一部分。将数据写入块的其余部分可能会导致读取-修改-写入周期。这意味着读取、修改完整的块,然后将其写入另一个位置。非常贵。
当 SSD 为空时,这不是问题(因为控制器有足够多的未使用块),但如果 SSD 已满且使用率很高,则可能会成为问题。或者,如果 IO 模式通常是非常小的写入并且 SSD 变得碎片化。这样 FTL 就很难找到连续的空闲闪存页面。
附带说明:系统管理员应该将文件系统与 SSD 擦除块边界对齐,这非常重要。
由于系统对任何现代磁盘的看法与物理设备上的实际位置不匹配,因此情况变得更糟。现代磁盘,包括 SSD 和旋转磁盘,将扇区放置在他们想要的位置。
由于 SSD 具有磨损均衡,因此扇区 27 可能不会靠近扇区 28,并且即使它们开始“靠近”在一起,在写入一些数据后也可能不会关闭。另外,当然,SSD 的“关闭”概念有点奇怪,因为没有寻道时间。
如果设计与更少的大文件一样简单,我会回避任何具有大量文件的设计。另一方面,如果您发现自己编写相当于文件系统的内容来映射到单个大文件中的块,那么除非您的问题具有非常具体的功能,否则最好利用所有时间并思考这已经进入了现有的文件系统设计。