使用内存盘构建自己的分级存储而不是笃信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进行测试是因为我老婆总觉得我在电脑上敲命令就会把它弄坏...再说那台电脑就是个娱乐机,平时我不怎么动它,昨晚是作为技术支持上机操作的,毕竟电影也不是我一个人看...测试结果如下:

我不知道如何禁用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初创时做的那样。

时间: 2024-08-24 08:24:45

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

通过内存盘提高MSMQ的消息吞吐能力

转载:http://www.ikende.com/blog/00f2634be4704b79a3e22439edeb1343 由于MSMQ的消息交互都需要对磁盘进行读写操作,所以提高MSMQ的消息吞吐能力相对比较有效的方法就是提高磁盘读写能力.可以简单地把MSMQ的消息,日志等文件存储到不同的磁盘来降低MSMQ对一个磁盘IO依赖从而达到更高的读写效能.由于MSMQ一般都是存储流水数据,如果消息结构比较少和消费积累量不高的情况把MSMQ存储放到内存则是一个非常不错的选择,这样能够大大提高MSMQ的

内存盘

一.简介 大多数的Linux发行版本中,内存盘默认使用的是/dev/shm 路径,文件系统类型为tmpfs,默认大小是内存实际的大小,操作这个路径就是对内存的操作.   tmpfs是一种虚拟内存文件系统,特点是的存储空间在VM(virtual memory)中.linux下面VM的大小由RM(Real Memory)和swap组成,RM的大小就是物理内存的大小,而Swap的大小是由你自己决定的.Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM(Real Memory)要慢许多,我们

利其器:如何利用内存盘加速电脑

[创建内存盘]: 用软媒魔方内存盘来创造内存盘,让硬盘休息! 用了1G给内存盘,电脑是8G内存: 备份路径到非系统盘: 勾选关机保存,以后要正常关机: [修改chrome浏览器缓存目录]: 先剪切原来的User Data目录到F:\Google\Chome\下,上一层目录Chrome不用管,如下图: 重命名为UserData空目录,记得不含空格 mklink/D "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data"

Mac OS X RAM Disk(内存盘) Shell

本文提供改进版的Mac OS X RAM Disk(内存盘)创建程序和实用说明. 顾虑 Mac迅雷下载时IOPS太高,可能是没使用缓存,这导致磁盘吱吱地响,因此担心磁盘很快报废,而不能安心下载.作者已多次向其开发者提议,但至今未收到答复. 好在本机的内存空间宽裕,突然想到内存盘这一概念. 探索 试用了TmpDisk一段时间,效果还行.但细心的同学会发现:在活动监视器/磁盘页中,进程TmpDisk的显示的写入数据量为实际内容写入数据量的两倍以上.比如:以10M网速全速下载,预计连续写入1MiB/s

创建内存盘

我打算把内存虚拟盘放在/opt/var/tmp .使用以下简单的命令: # mount -t tmpfs -o 128m none /opt/var/tmp 也可以不指定内存盘大小: # mount -t tmpfs none /opt/var/tmp 在内存盘建立之后,查看top 或者系统监视器,可用内存并未相应减少(明确指定大小的内存盘也是如此).经过测试,未明确指定大小的内存盘会动态分配内存,可以持续向内存盘中写入文件,当再无可用物理内存时才会报空间不足的错误. tmpfs 文件系统默认采

使用数据库构建高性能队列用于存储订单、通知和任务(转)

英文原文: http://www.codeproject.com/Articles/110931/Building-High-Performance-Queue-in-Database-for-st 译文:http://www.oschina.net/translate/building-high-performance-queue-in-database-for-storing-orders 译者:几点人, beyondme, 漠天, petert, 赵亮-碧海情天, FGQ 引言 几乎在每个

使用mfsbsd制作FreeBSD内存盘系统

使用mfsbsd制作FreeBSD内存盘系统 项目github地址:https://github.com/mmatuska/mfsbsd 项目主页:http://mfsbsd.vx.sk/ root password for all images: mfsrootAll images have mfsbsd.autodhcp set - all network cards are configured for DHCP. mfsBSD Copyright (c) 2007-2016 Martin

java利用构建器来创建实例而不是构造器

java利用构建器来创建实例而不是构造器 1.对于类而言,为了让客户端获取他本身的一个实例, 2.最传统的方法就是提供一个公有的构造器. 一个类中 重载多个构造器 客户面对多个构造器这种API永远也记不住该用哪个构造器, 并且每次调用构造器必然会创建新的对象, 如果程序需要重复使用对象,构造器无法避免创建不必要的对象. 静态工厂方法与构造器不同的 第一大优势为:他们有名称 第二大优势为:不必每一次调用他们的时候创建一个新对象 第三大优势为:他们可以返回原返回类型的任何子类型的对象 第四大优势为:

如何删除 EMC存储认到的鬼盘LUNZ disk,在存储上出现initiators storage group "~management"的情况

如何删除 EMC存储认到的鬼盘LUNZ disk # lspvhdisk0          00c3d2b5101a064c                    rootvg          activehdisk1          00c3d2b5dee3325a                    rootvg          activehdisk2          none                                Nonehdisk3