Is there a reliable, quick, deterministic way (i.e. not a benchmark) to check whether the system drive Mac OS X is on is a Solid State Drive?
Is there any other indicator how well disk handles parallel access? I'm trying to adjust number of threads that my program is going to use for disk-bound operations.
I'm not interested in raw speed or seek time, only which type of access – serial or parallel – is faster for the drive. I …
我想知道即将到来的SSD技术如何影响(mosty系统)编程.出现了大量问题,但这里有一些最明显的问题:
我担心我会iotop在一个完全空闲的系统上看到磁盘LED和每隔几秒钟进行的一些写操作,主要来自铬的过程.
对磁盘进行如此大量的写入完全没有任何意义,对SSD磁盘来说更少.对我来说读取不是问题,也因为我的20gb RAM笔记本上有足够的磁盘缓存.
该commit选项(默认情况下为30秒)显然是解决不了问题.试图增加甚至减少,仍然每隔几秒钟就会看一次.
那么有没有办法强制每个任意间隔不超过一次写入?
我想知道登录SSD的最佳方式是什么.想象一下像数据库日志这样的东西,你只写附加,但你也必须fsync()每个事务或少数事务,以确保应用程序级数据的持久性.
我将介绍SSD如何工作的背景知识,所以如果你已经知道了这一切,那么无论如何我都应该略读它以防万一我错了.进一步阅读的一些好东西是Emmanuel Goossaert的6部分SSD编码指南和论文" 不要将您的日志堆叠在我的日志上"[pdf].
SSD仅在整页中写入和读取.页面大小因SSD而异,但通常为4kb的倍数.我的三星EVO 840使用了8kb的页面大小(顺便提一下,Linus用他通常的多彩方式称之为"无法使用的狗屎".)SSD无法就地修改数据,他们只能写入免费页面.因此,结合这两个限制,更新我的EVO上的单个字节需要读取8kb页面,更改字节,并将其写入新的8kb页面并更新FTL页面映射(ssd数据结构),以便该页面的逻辑地址正如操作系统所理解的那样,现在指向新的物理页面.因为文件数据在相同的擦除块(可以擦除的最小页面组)中也不再是连续的,所以我们也在构建一种碎片债务形式,这将使我们在未来的SSD垃圾收集中付出代价.非常低效.
作为一个助手,看看我的PC文件系统:
C:\WINDOWS\system32>fsutil fsinfo ntfsinfo c:它有512字节的扇区大小和4kb的分配(集群)大小.两者都没有映射到SSD页面大小 - 可能效率不高.
只是写入pwrite()内核页面缓存并让操作系统处理写出来的问题.首先,sync_file_range()在调用pwrite()实际启动IO 之后,您需要发出一个额外的调用,否则它将一直等到您调用fsync()并释放IO风暴.其次fsync() 似乎阻止了write()对同一文件的未来调用.最后,你无法控制内核如何将内容写入SSD,它可能做得很好,或者它可能做得不好导致大量写入放大.
由于上述原因,并且因为我还需要AIO来读取日志,所以我选择使用O_DIRECT和O_DSYNC写入日志并完全控制.
据我了解,O_DIRECT要求所有写入与扇区大小和整个扇区对齐.因此,每当我决定向日志发出附加内容时,我需要在末尾添加一些填充以将其添加到整个扇区(如果所有写入始终是整个扇区,它们也将正确对齐,至少在我的代码中.)好吧,那不是那么糟糕.但我的问题是,围绕一大堆SSD页面而不是扇区不是更好吗?据推测,这会消除写入放大?
这可能会占用大量空间,特别是如果一次向日志中写入少量数据(例如几百字节).这也可能是不必要的.像三星EVO这样的SSD有写缓存,它们不会在fsync()上刷新它.相反,他们依靠电容器在断电时将缓存写入SSD.在这种情况下,也许SSD做正确的事情,只有一个附加日志一次写入扇区 - 它可能不会写出最后的部分页面,直到下一个附加到达并完成它(或除非它被强制淘汰)由于大量不相关的IO导致缓存.)由于答案可能因设备和文件系统而异,有没有办法可以编写这两种可能性并测试我的理论?在Linux上测量写入放大或更新/ RMW页面数量的一些方法?
据我了解,RDS 实例上的通用 SSD 具有基于磁盘大小的 IOPS 限制,直到达到 1TB,此时您可以以 3000 IOPS 无限爆发。
一旦您拥有 1TB 磁盘,您就可以连续爆发 3000,但我找不到任何有关如何限制或限制的信息,理论上您可以在 1TB 通用 SSD 上使用 20000 IOPS 吗?我知道您可以在预配置的 IOPS 磁盘上使用比预配置更多的数量,但这会变得非常昂贵。
我看过博客文章指出 IOPS 根据大小设置上限,但我在 Amazon 文档中找不到任何相关信息,只有小于 1TB 的磁盘的详细信息。任何指示或建议非常感谢!谢谢。
solid-state-drive amazon-web-services amazon-rds provisioned-iops
我想要的是
我想在基于SSD的开发机器上模拟普通硬盘的性能.
背景
我正在使用SSD在Macbook上开发Mac应用程序.它的速度非常快.
如果有人有标准的硬盘驱动器,我的应用程序对他们来说会更慢.我的应用程序也很重视Core Data,因此磁盘访问速度将是一个重要因素.
我担心我使用仪器进行的性能测量看起来很好,但是当客户在他们的普通硬盘上运行我的应用程序时,它将会非常缓慢.
我试过的
在我安装SSD之前,我测量了我的应用程序在仪器中的性能.安装完成后,我再次测量它,两个基准测试完全一致.
这对我来说没有意义.我确信我在这里做错了什么.仪器可能测量时钟速度,而不是墙壁时间速度.但是,当然硬盘的速度肯定会影响我所采用的基准?还是仪器会以某种方式弥补这一点?
今天早上我进行了测试,有2次失败.但我几天没有更改任何代码,所有测试都通过了.
根据Git,没有变化(coverage.data除外,它是测试输出).gitk没有显示其他变化.
Git如何知道代码何时发生变化?这可能是由SSD故障/错误引起的吗?
弄清楚发生了什么的最好方法是什么?
编辑:使用单元测试框架在Ruby on Rails上工作.
我确信:
可能有什么贡献:
我怀疑在达到某个缓存/缓冲区限制之前,50000的速率很快.然后,大缓慢可能是由于SSD没有处理混合在一起的读/写,正如这个问题所建议的:SSD的低延迟键值存储.
问题是:
这种极端减速可能来自哪里?它不是所有SSD的故障.很多人乐于使用SSD进行高速数据库处理,我相信它们会混合读写.
谢谢.
编辑:我已确保删除任何内存限制,并且java进程始终有空间分配更多内存.
编辑:删除读数和仅执行插入不会更改问题.
上次编辑:对于记录,对于哈希表,它似乎与初始数字桶有关.在京都内阁,这个数字不能改变,默认为~100万,所以最好在创建时获得数字(存储的最大记录数的1到4倍).对于BDB,它被设计为逐渐增加桶的数量,但由于它是资源消耗,因此更好地预先确定数量.
我有一个应用程序,它通过网络每秒接收几百个字符串,大约五十个字节.我想将这些缓存到SSD进行进一步处理.如果我每秒执行几百到50个字节的文件附加写入,那对SSD是否安全?我怀疑操作系统可能会聚合这些写入,但我不知道.我模糊地理解SSD是由必须全部或全部更新的单元组成的,并且每个单元只能承受如此多的写入(我认为,对于商品驱动器而言,数百或数千).我的许多小写应用程序是否让我的SSD成为毁灭之路?如果我缓存到内存并以每分钟/小时的速度写入磁盘,我会更安全吗?显然这更复杂(最近一分钟/小时的内存缓存的Web服务,旧数据的磁盘),但我也不想破坏太多的硬件.
我已经做了几个没有太大不同的事情,没有不利影响,但是几年前,我还没有做过严肃的测试.我确实从经验中知道,如果天真地实施,我可以通过这种方法在几个月内非常可靠地销毁硬盘.
在 Digitalocean 上,当我想添加交换时,我想到了这条消息:
尽管通常建议将交换用于使用传统旋转硬盘驱动器的系统,但将交换与 SSD 一起使用可能会导致硬件随着时间的推移而退化。出于这个考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。这样做会影响您和您邻居的底层硬件的可靠性。本指南供可能在其他地方使用旋转磁盘系统的用户参考。如果您需要在 DigitalOcean 上提高服务器的性能,我们建议升级您的 Droplet。这通常会带来更好的结果,并降低导致可能影响您的服务的硬件问题的可能性。
这是为什么?我认为有必要创建一个稳定的服务器(不会遇到内存问题)
cocoa ×2
linux ×2
amazon-rds ×1
b-tree ×1
c++ ×1
chromium ×1
database ×1
filesystems ×1
fsync ×1
git ×1
instruments ×1
io ×1
iokit ×1
java ×1
key-value ×1
macos ×1
performance ×1
ram ×1
server ×1
storage ×1
testing ×1
tree ×1
unit-testing ×1
vps ×1