顺序写入和随机写入的区别

Posted

技术标签:

【中文标题】顺序写入和随机写入的区别【英文标题】:Difference between sequential write and random write 【发布时间】:2011-01-07 05:16:26 【问题描述】:

在以下情况下,顺序写入和随机写入有什么区别:- 1)基于磁盘的系统 2)基于SSD [Flash Device]的系统

当应用程序写入一些东西并且需要在磁盘上修改信息/数据时,我们如何知道它是顺序写入还是随机写入。到目前为止,写入无法区分为“顺序”或“随机”。写入只是缓冲,然后在我们刷新缓冲区时应用到磁盘。

如果我错了,请纠正我。

【问题讨论】:

【参考方案1】:

当人们谈论 sequentialrandom 写入文件时,他们通常会区分没有中间搜索(“sequential”)的写入与seek-write-seek-write-seek-write 等模式(“随机”)。

这种区别在传统的基于磁盘的系统中非常重要,每次磁盘寻道大约需要 10 毫秒。将数据顺序写入同一个磁盘大约需要每 MB 30 毫秒。因此,如果您将 100MB 的数据顺序写入磁盘,大约需要 3 秒。但是,如果您执行 100 次 1MB 的随机写入,则总共需要 4 秒(实际写入需要 3 秒,所有搜索需要 10ms*100 == 1 秒)。

随着每次随机写入变得越来越小,您为磁盘寻道付出的代价也越来越大。在执行 1 亿次随机 1 字节写入的极端情况下,所有实际写入仍然需要 3 秒的时间,但您现在有 11.57 天 的时间去做!很明显,您的写入顺序与随机程度会真正影响完成任务所需的时间。

在闪存方面情况有点不同。使用闪存,您没有必须移动的物理磁盘磁头。 (这是传统磁盘 10 毫秒寻道成本的来源)。但是,闪存设备往往具有较大的页面大小(根据wikipedia,最小的“典型”页面大小约为 512 字节,4K 页面大小似乎也很常见)。因此,如果您正在写入少量字节,闪存仍然存在开销,因为您必须读取整个页面,修改您正在写入的字节,然后再写回整个页面。我不知道我脑海中闪现的特征数字。但经验法则是,在闪存上,如果每次写入的大小通常与设备的页面大小相当,那么随机写入和顺序写入之间不会有太大的性能差异。如果您的每次写入与设备页面大小相比都很小,那么您在执行随机写入时会看到一些开销。

现在对于以上所有内容,确实在应用程序层对您隐藏了很多内容。内核、磁盘/闪存控制器等中的一些层可能会在您的“顺序”写入过程中插入不明显的搜索。但在大多数情况下,在应用层写“看起来”顺序(没有搜索,大量连续 I/O)将具有顺序写入性能,而在应用层写“看起来”随机将有(通常更糟)随机写入性能。

【讨论】:

此视频详细解释了这一点。如果上面的答案对你来说还不是很清楚。 youtube.com/watch?v=IvVZ7jf8wqw 在顺序访问中,尽可能避免了寻道时间。当当前柱面没有位置可读取时,尝试切换到同一柱面上的不同磁头,直到这也不可能并且需要切换柱面。

以上是关于顺序写入和随机写入的区别的主要内容,如果未能解决你的问题,请参考以下文章

linux 2.6.43,ext3,10K RPM SAS 磁盘,在不同文件上进行 2 次顺序写入(直接 io),就像随机写入一样

随机内存写入比随机内存读取慢?

hbase 随机写入的工作原理

Java开发面试题及答案,java随机打乱数组顺序

JS操作Cookie写入和读取实例代码

顺序读取文件会导致随机磁盘查找吗?