我有一个概念验证程序,它只需通过从 HD 写入和读取来进行一些进程间通信。是的,我知道这真的很慢;但这是启动和运行的最简单方法。我一直计划返回并使用一种在 RAM 中执行所有 IPC(进程间通信)的机制来交换那部分代码。
随着固态硬盘的到来,你认为瓶颈可能会变得微不足道吗?
注意:它是用 C# 编写的服务器软件,调用一些用 FORTRAN 编写的裸机数字运算库。
我有一个概念验证程序,它只需通过从 HD 写入和读取来进行一些进程间通信。是的,我知道这真的很慢;但这是启动和运行的最简单方法。我一直计划返回并使用一种在 RAM 中执行所有 IPC(进程间通信)的机制来交换那部分代码。
随着固态硬盘的到来,你认为瓶颈可能会变得微不足道吗?
注意:它是用 C# 编写的服务器软件,调用一些用 FORTRAN 编写的裸机数字运算库。
简短的回答可能是否定的。一位名叫 Jim Gray 的著名研究员发表了关于存储和性能的演讲,其中包括了这个伟大的类比. 假设你的大脑是处理器,访问一个寄存器需要 1 个时钟滴答(左边的数字),这大致相当于你大脑中的信息。访问内存需要 100 个时钟滴答,因此大致相当于在您居住的城市的某个地方获取数据。访问标准磁盘大约需要 10^6 个滴答,这相当于冥王星上的数据。固态适合它在哪里?当前的 SSD 技术介于 10^4-10^5 之间,具体取决于您询问的对象。虽然它们可以快一个数量级,但从内存读取和从磁盘读取之间仍然存在巨大差距。这就是为什么您的问题的答案可能是否定的原因,因为随着 SSD 的发展,它们仍然会比磁盘慢得多(至少在可预见的将来)。
我想你会发现瓶颈只是被移动了。由于我们期望更高的吞吐量,因此我们编写了更高要求的程序。
这将瓶颈推向总线、缓存和读/写机制以外的部分(无论如何都是链中的最后一个)。
对于不受磁盘 I/O 约束的进程,我认为您可能会发现它受到调度程序的约束,这限制了读/写指令的数量(与所有进程指令一样)。
要充分利用无限的 I/O 速度,您需要实时响应和非常积极的缓存管理等。
当磁盘变得更快时,RAM 和处理器以及对设备的需求也会变得更快。瓶颈是一样的,只是工作量变大了。
我不相信它会改变 I/O 绑定应用程序的编写方式。拥有更快的处理器也没有让人们选择冒泡排序作为排序算法。
外部存储器层次结构是计算的固有问题。
Joel on Software 有一篇关于他升级到固态的经验的文章。与您遇到的问题不完全相同,但我的结论是:
固态驱动器可以显着加快 I/O 绑定操作,但许多事情(如编译)仍然受 CPU 限制。
不可以。当前的 SSD 被设计为磁盘替代品。从 SATA 控制器到文件系统驱动程序的每一层都将它们视为存储。
这不是底层技术 NAND 闪存的问题。当 NAND 闪存直接映射到内存中,并使用旋转日志存储系统而不是基于命名文件的文件系统时,速度会非常快。根本问题是 NAND Flash 只在块更新中表现良好。文件元数据更新会导致昂贵的读取-修改-写入操作。此外,NAND 块比典型的磁盘块大得多,这也无助于提高性能。
由于这些原因,SSD 的未来将是更好的缓存 SSD。DRAM 将隐藏不良映射的开销,而小型超级电容备份将允许 SSD 更快地提交写入。
固态驱动器确实对 IO 吞吐量做出了一项重要改进,那就是在固态磁盘上,块位置不再是旋转介质的问题。这意味着高性能 IO 绑定应用程序可以将其重点从安排访问数据的结构转移到以其他方式优化 IO 的结构,例如通过压缩将数据保存在单个块中。也就是说,即使是固态驱动器也可以从线性访问模式中受益,因为它们可以在应用程序请求之前将后续块预取到读取缓存中。
固态磁盘的一个明显回归是写入比读取花费的时间更长,尽管两者通常仍然比旋转驱动器快,并且随着更新的高端固态磁盘,差异正在缩小。
不,很遗憾没有。不过,它们确实让它变得更有趣:SSD 驱动器的读取速度非常快且没有同步时间,但它们的写入速度几乎与普通硬盘驱动器一样慢。这意味着您大部分时间都想阅读。但是,当您写入驱动器时,您应该尽可能多地在同一位置写入,因为 SSD 驱动器一次只能写入整个块。
使用 ram 驱动器而不是磁盘怎么样?你不必重写任何东西。只需将其指向不同的文件系统。Windows 和 Linux 都有。确保您的机器上有大量内存,并创建一个有足够空间供您处理的虚拟磁盘。我为一个在网络分流器上监听多个协议的系统做了这个。我从来没有更新我将要获得的数据包,并且有太多数据无法将其保存在内存中。我会将它写入 RAM 驱动器,当某些事情完成时,我会移动它并让另一个进程将它从 RAM 驱动器中取出并放到物理磁盘上。通过这种方式,我能够跟上非常繁忙的服务器级网卡。祝你好运!
这里要记住的一点:
如果通信涉及频繁的消息并且在同一个系统上,您将获得非常好的性能,因为 Windows 实际上不会首先将数据写出。
我不得不求助于它一次并发现了这一点——只要数据不断被写入,驱动灯就根本没有亮起。
但这是启动和运行的最简单方法。我通常发现用自己的头脑思考一次比让 CPU 徒劳地思考数百万次要便宜得多。