固态驱动器是不是足够好,无需担心磁盘 IO 瓶颈?

Posted

技术标签:

【中文标题】固态驱动器是不是足够好,无需担心磁盘 IO 瓶颈?【英文标题】:Are solid-state drives good enough to stop worrying about disk IO bottlenecks?固态驱动器是否足够好,无需担心磁盘 IO 瓶颈? 【发布时间】:2010-11-11 18:28:03 【问题描述】:

我有一个概念验证程序,它只需通过从 HD 写入和读取来进行一些进程间通信。是的,我知道这真的很慢;但这是启动和运行的最简单方法。我一直计划返回并使用一种在 RAM 中执行所有 IPC(进程间通信)的机制来交换那部分代码。

随着固态硬盘的到来,你认为瓶颈可能会变得微不足道吗?

注意:它是用 C# 编写的服务器软件,调用一些用 FORTRAN 编写的裸机数字运算库。

【问题讨论】:

【参考方案1】:

简短的回答可能是否定的。一位名叫 Jim Gray 的著名研究员发表了关于存储和性能的演讲,其中包括 this great analogy。假设你的大脑是处理器,访问一个寄存器需要 1 个时钟滴答(左边的数字),这大致相当于你大脑中的信息。访问内存需要 100 个时钟滴答,因此大致相当于在您居住的城市的某个地方获取数据。访问标准磁盘大约需要 10^6 个滴答,这相当于冥王星上的数据。固态适合它在哪里?当前的 SSD 技术介于 10^4-10^5 之间,具体取决于您询问的对象。虽然它们可以快一个数量级,但从内存读取和从磁盘读取之间仍然存在巨大差距。这就是为什么您的问题的答案可能是否定的原因,因为随着 SSD 的发展速度,它们仍然会比磁盘慢得多(至少在可预见的将来)。

【讨论】:

一个比冥王星更近的巨星与火星有关。两个数量级是关于月球的。请注意,您仍然不是宇航员。 TokenMacGuy:实际上,moon 和 Mars 大约是两个数量级,而不是一个(使用 base 10,显然更多在 base e) @DrJokepu,你是对的。一个数量级大约是木星(~4 AU 与冥王星的~40 AU)。无用的天文琐事。 @jkupferman,根据你的数据,RAM 不是比 SSD 快 100 到 1000 倍吗?【参考方案2】:

我认为您会发现瓶颈只是移动了。由于我们期望更高的吞吐量,因此我们编写了更高要求的程序。

这会将瓶颈推向总线、缓存和读/写机制以外的部分(无论如何都是链中的最后一个)。

如果进程不受磁盘 I/O 约束,那么我想您可能会发现它受到调度程序的约束,从而限制了读/写指令的数量(与所有进程指令一样)。

要充分利用无限的 I/O 速度,您需要实时响应和非常积极的缓存管理等。

磁盘变得更快时,RAM 和处理器以及对设备的需求也会如此。瓶颈是一样的,只是工作量变大了。

【讨论】:

从旋转驱动器到 SSD 的跳跃远大于从 RAM 版本 X 到 RAM 版本 X2 的跳跃。【参考方案3】:

我不相信它会改变 I/O 绑定应用程序的编写方式。拥有更快的处理器也没有让人们选择冒泡排序作为排序算法。

外部存储器层次结构是计算的固有问题。

【讨论】:

【参考方案4】:

Joel on Software 有一个article,讲述了他升级到固态的经验。与您遇到的问题不完全相同,但我的结论是:

固态驱动器可以显着加快 I/O 绑定操作,但许多事情(如编译)仍然受 CPU 限制。

【讨论】:

【参考方案5】:

我有一个固态驱动器,不,这不会消除 I/O 作为瓶颈。 SSD 不错,但不是 好。

实际上掌握系统的 IPC 原语或在 TCP 之上构建一些东西并不难。但是,如果您想坚持使用磁盘内容并使其更快,ramdisk 或 tmpfs 可能会成功。

【讨论】:

那么当您的 SSD 管道已满时,您通常还剩下多少 CPU?【参考方案6】:

没有。当前的 SSD 被设计为磁盘替代品。从 SATA 控制器到文件系统驱动程序的每一层都将它们视为存储。

这不是底层技术NAND闪存的问题。当 NAND 闪存直接映射到内存中,并使用旋转日志存储系统而不是基于命名文件的文件系统时,速度会非常快。根本问题是 NAND Flash 只在块更新中表现良好。文件元数据更新会导致昂贵的读取-修改-写入操作。此外,NAND 块比典型的磁盘块大得多,这也无助于提高性能。

由于这些原因,SSD 的未来将是更好的缓存 SSD。 DRAM 将隐藏不良映射的开销,而小型超级电容备份将使 SSD 更快地提交写入。

【讨论】:

DRAM 仍然比 RAM 慢吗? @Pacerier:这没有任何意义。 DRAM 是 RAM 的一种形式,SRAM 也是如此。不过,DRAM 比 SRAM 慢。【参考方案7】:

固态驱动器确实对 IO 吞吐量做出了一项重要改进,那就是在固态磁盘上,块位置较少是旋转介质的问题。这意味着高性能 IO 绑定应用程序可以将其重点从安排访问数据的结构转移到以其他方式优化 IO 的结构,例如通过压缩将数据保存在单个块中。也就是说,即使是固态硬盘也可以从线性访问模式中受益,因为它们可以在应用程序请求之前将后续块预取到读取缓存中。

固态磁盘的一个显着回归是写入比读取花费的时间更长,尽管两者通常仍比旋转驱动器快,并且随着更新的高端固态磁盘,差异正在缩小。

【讨论】:

是的...每个人都知道 SSD 更快。但你完全错过了这个问题。 @Pacerier:这个问题和这个答案都是 6 年的历史,当时不是每个人都知道 SSD 的权衡是什么。更糟糕的是,这个问题或多或少被表述为“是/否”,而事实是一系列权衡。我的答案是针对其他答案未提及的权衡(在回答时)。【参考方案8】:

不,很遗憾没有。不过,它们确实让它变得更有趣:SSD 驱动器的读取速度非常快且没有同步时间,但它们的写入速度几乎与普通硬盘驱动器一样慢。这意味着您大部分时间都想阅读。但是,当您写入驱动器时,您应该尽可能多地在同一位置写入,因为 SSD 驱动器一次只能写入整个块。

【讨论】:

嗯,我的经验是,SSD 类型之间的行为不同。对于旧 SSD,这是绝对正确的( 【参考方案9】:

使用内存驱动器代替磁盘怎么样?你不必重写任何东西。只需将其指向不同的文件系统。 Windows 和 Linux 都有。确保您的机器上有大量内存,并创建一个有足够空间供您处理的虚拟磁盘。我为一个在网络分接头上监听多个协议的系统做了这个。我从来没有更新我将要获得的数据包,并且有太多数据无法将其保存在内存中。我会将它写入 RAM 驱动器,当某些事情完成时,我会移动它并让另一个进程将它从 RAM 驱动器中取出并放到物理磁盘上。通过这种方式,我能够跟上非常繁忙的服务器级网卡。祝你好运!

【讨论】:

【参考方案10】:

这里要记住的一点:

如果通信涉及频繁的消息并且在同一个系统上,您将获得非常好的性能,因为 Windows 最初不会真正写出数据。

我不得不求助于它一次并发现了这一点——只要不断写入数据,驱动灯就没有亮起。

【讨论】:

这可能是由于您的设置。您必须将 USB 设置为自动刷新。 @Pacerier 不,这是主硬盘,而不是闪存驱动器。我需要快速将一堆数据从 DOS 传输到 Windows,我最终只是每秒多次反复写入一大块数据,另一个程序读取它并根据它发现的内容采取行动。超级大杂烩,但它完成了工作。【参考方案11】:

但这是启动和运行的最简单方法。 我通常发现,用自己的头脑思考一次比让 CPU 徒劳地思考数百万次要便宜得多。

【讨论】:

以上是关于固态驱动器是不是足够好,无需担心磁盘 IO 瓶颈?的主要内容,如果未能解决你的问题,请参考以下文章

固态磁盘和动态磁盘的测试

磁盘io请求过高造成的io瓶颈怎么解决

lvm讲解

如何判断MSSQL数据库磁盘出现了瓶颈

#yyds干货盘点# 性能问题分析策略

IO模型解惑