Source: Jack Vanlightly,Is Sequential IO Dead In The Era Of The NVMe Drive? May 9, 2023 我非常熟悉的两个系统,Apache BookKeeper和Apache Kafka,是在磁盘、硬盘驱动器或HDD时代设计的。硬盘驱动器擅长顺序 IO,但由于寻道时间相对较长,因此不擅长随机 IO。难怪Kafka和BookKeeper在设计时都考虑了顺序IO。 Kafka 和 BookKeeper 都是分布式日志系统,因此您会认为顺序 IO 是仅追加日志存储系统的默认值。但是顺序和随机 IO 位于连续统一体上,一侧是纯顺序,另一侧是纯随机 IO。如果您有 5000 个文件,您以循环方式以小型写入方式追加并执行 fsync,则这不是这样的顺序 IO 访问模式,它位于随机 IO 端的更远处。因此,仅仅作为仅追加日志并不意味着您可以获得顺序 IO。 因此,在HDD时代,系统厂商将顺序IO设计到他们的系统中。Apache BookKeeper 竭尽全力通过确保一次只有一个活动文件来实现顺序 IO。它通过将来自不同逻辑日志的数据交错到一个物理日志中来实现这一点。像这样的交错对于写入来说很好,但读取成为一个问题,因为我们不再获得顺序读取。为了解决这个问题,BookKeeper 将数据写入两次:一次写入优化的预写日志 (WAL),然后再次写入长期读取优化存储。为了使长期存储读取优化,BookKeeper 在大型写入缓存中累积写入条目,然后定期对缓存进行排序并将其写入一个活动文件(一次)。按日志 ID 和条目 ID 排序可确保相关数据写入连续块,从而使读取更加连续。我们只需要添加一个可以指向这些连续块的索引。