使用内存盘构建自己的分级存储而不是笃信SSD

简介:

SSD技术正日渐成熟,容量越来越大,价格越来越便宜,符合摩尔定律,但是内存技术似乎在同样的道路上走得更快。
昨晚我想下载几个电影,一共4G多,但是连接上迅雷之后,资源不少,但是速率却成锯齿状,我就不信是网速问题,也不是TCP问题,因为分布式P2P下载的原理和单TCP通道的HTTP以及FTP完全不同,后来用命令查看发现是IO的瓶颈...我的磁盘是这么分配的:
SSD:我的SSD容量太小,128G吧,上面放了很多虚拟磁盘之类的,剩下的空间不足3G了。
HDD:这是一个1T的物理磁盘,规格就不说了,反正就是会转圈的那种。剩下还有600多G。
那 么电影只能放在HDD了,然而当时已经12点多了,老婆一直摧着睡,小小也被吵醒了,我看了下载速度大概有1.5M,还不错,但是一下子就下到500K 了,然后缓慢增加到1.5M,然后再下降...这不是TCP的问题,请相信,凭着我对网络的理解,这不是TCP的问题,虽然很多教科书上都会说TCP速率 会出现锯齿状,但这次绝对不是!我要最短化下载时间怎么办?只要能充满1.5M,那么是绝对可以接受的,剩下的那个电影大概也就半小时左右完毕。我必须快 速想到办法,SSD虽然会比较快,但是写入速度也不敢恭维,于是想到了内存!
       我有16G的内存,打开monitor发现剩余7G多!我要赶紧做一个内存盘。可是我在Mac上不知道怎么弄,没关系,搜了一下发现使用hdid命令就可 以:hdid+fstyp_hfs(类似Linux的mkfs.ext4之类的)+mount,于是赶紧做了一个内存盘,大小4G的。重新开始下载。速度 快了很多!去厨房抽个烟,完成了。然后花了几十秒的时间将电影从内存盘拷贝到了HDD。
       虽然这件事完全都是手工操作的,但是事后我却觉得可以通用化。就在刚才,我进行了测试,分别测试了HDD,SSD,Ramdisk的IO性能,当然只是大 概的测试,没有使用专业工具,而只是使用了dd+purge而已,不过也可以说明问题。测试平台是我在2011年买的那台Macbook pro,已经很老了,配备了64G的SSD,剩余15G,HDD一共500G左右,内存8G,这配置虽说不上悍,但是对我测试没有问题。我没有用强悍的 iMac进行测试是因为我老婆总觉得我在电脑上敲命令就会把它弄坏...再说那台电脑就是个娱乐机,平时我不怎么动它,昨晚是作为技术支持上机操作的,毕 竟电影也不是我一个人看...测试结果如下:


wKioL1Rx5GWjCrJPAAHiBSuub1s108.jpg

wKiom1Rx4_ii-_eiAAHczuAN3q8235.jpg

wKioL1Rx5InxVbyaAAG6LVehQoM416.jpg



我不知道如何禁用vfs的cache,所以对于HDD和SSD我使用了purge命令,但不伤大雅。
       从结果可以看出,虽然我们都在笃信SSD,然而和内存相比,就没戏了,正如内存无法和三级cache相比,三级cache无法和一级cache相比一样, 同样cache都无法和寄存器相比,向着慢速的一端,网络也是无法和本地磁盘相比的,不过目前这一点正在改善,据说TCP/IP已经可以实现远程内存访问 了,这无疑得益于万兆网络的流行,当然这是后话了。
       如果我们可以将时间,金钱和生命等同起来,就可以算一笔帐,如果说内存比SSD快10倍(保守说),那么也要比SSD贵10倍才可以和SSD等价的,这在 几年前来说,SSD要更贵些,可是今天,128G的SSD也就300元左右,说明SSD的价值已经超过了内存。然而事实上,时间和金钱是无能等价的,这是 构建分级存储体系的根本原则。
       分级存储体系的构建原则并不是让你用128G的内存替代128G的SSD,用512G的SSD替代512G的HDD,而是要将好钢用在刀刃上,有有限的生 命时间做最少的最值得做的事情。也正因为如此,CPU的cache容量到达128G的时候,内存就要用T来作单位了。为什么不构建一个内存盘来完成重要的 事呢?我的意思是在文件系统的粒度上构建一个内存盘,而不是在文件的粒度上构建,后者在现如今的OS内核中均已实现,就是vfs的cache。构建一个 Ramdisk可用作以下用途:
1.进行P2P下载,下得快还不伤硬盘。
2.存放虚拟机虚拟磁盘和虚拟内存,虚拟机的内存可以真正内存化,磁盘IO会明显加速。
3.可以使用bash等脚本在内存中编程,这就好比用C/C++,JAVA等语言在虚拟内存地址空间中编程一样。
关于第3点,举一个例子,你不是可以用C语言构建一个Tree吗?这棵树的操作都在内存中进行,如果使用Ramdisk,你就可以使用文件系统的目录结构进行同样的操作。你可以将数据库存储概念中的B树等磁盘裸数据结构搬到Ramdisk中,替代自己实现的数据结构。
4.将关键服务存放在Ramdisk中,在UNIX中可以mount一个ramfs或者cramfs,然后chroot进去,这样保证所有的磁盘操作都在内存中进行。
5....

对于怎么做,我觉得不是问题,下周我准备在Mac上做一个实例。实际上在Linux上更为简单,大家都接触过的initrd就是一个ramdisk或者cramdisk,把它做大一些即可。
       为何之前没有人这么干呢?原因有很多,主要的我觉得第一是因为内存太贵,还有就是怕断电。不管怎样,现在这些都不是问题了。但这都不是最主要的原因,最主要的原因是人们已经习惯了以下的几个概念:
1.人们习惯了CPU寄存器,CPU cacheline,内存,磁盘,网络这个已经存在的分级存储体系,内存只是在page粒度上是磁盘的cache,而不是file粒度的。
2. 人们觉得数据结构这种东西都是C语言之类的可以直接操作内存的语言必须置入内存才可用的。文件系统作为一种抽象,每一个file被C语言操作,并且操作集 都是固定的,文件系统之间所不同的只是文件在磁盘的布局,这个抽象隐藏了磁盘复杂的构造的同时也隐藏了file的数据结构。如果我们把抽象的面纱揭开,考 虑一下数据库的操作,拿B树和C语言里面写的树型查找结构相比的话,就会隐约发觉,实际上磁盘里的东西和内存里面的东西都是一样,C语言可以将很多数据结 构封装成一个抽象的不让你看见的东西,目前也是这么做的,就像文件系统在UNIX初创时做的那样。


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1581687


相关文章
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
378 0
|
26天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
55 1
|
30天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
49 2
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
42 4
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
1月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
1月前
|
存储
整型在内存中的存储
本文详细解释了计算机中整型数据的三种二进制表示方法:原码、反码和补码,并展示了如何将正数和负数的原码转换为反码和补码。
38 0