您的位置:首页 > 其它

RamDisk ramfs tmpfs 详解

2016-06-11 18:47 471 查看
[align=left]一 什么是RamDisk[/align]
[align=left]Ram:内存,Disk:磁盘,在Linux中可以将一部分内存当作分区来使用,称之为RamDisk。对于一些经常被访问、并且不会被更改的文件,可以将它们通过RamDisk放在内存中,能够明显地提高系统性能。RamDisk工作于虚拟文件系统(VFS)层,不能格式化,但可以创建多个RamDisk。虽然现在硬盘价钱越来越便宜,但对于一些我们想让其访问速度很高的情况下,RamDisk还是很好用的。[/align]
[align=left]如果对计算速度要求很高,可以通过增加内存来实现,使用ramdisk技术。一个A RamDisk就是把内存假设为一个硬盘驱动器,并且在它的上面存储文件。假设有几个文件要频繁的使用,如果将它们加到内存当中,程序运行速度会大幅度提高,因为内存的读写速度远高于硬盘。划出部分内存提高整体性能,不亚于更换新的CPU。像Web服务器这样的计算机,需要大量读取和交换特定的文件。因此,在Web服务器上建立RamDisk会大大提高网络读取速度。[/align]
[align=left] [/align]
二 如何使用RamDisk

格式化一个ramdisk并把他加到一个目录上。列出所有可用的ramdisk用“ls -al /dev/ram*”。这就会列出你现有可用的ramdisk。这些ramdisk并不抢夺内存,除非进行格式化的一类操作。这里有一个使用ramdisk的例子。

# create a mount point:

mkdir /tmp/ramdisk0

# create a filesystem:

mke2fs /dev/ram0

# mount the ramdisk:

mount /dev/ram0 /tmp/ramdisk0

这三个命令将为ramdisk创建一个目录,格式化ramdisk(创建文件系统),并且加载这个ramdisk到"/tmp/ramdisk0". 现在你可以将这个目录看成一个虚拟的分区。使用它就象使用其它的目录一样。

如果对ramdisk的格式化失败,那就是你的内核不支持ramdisk。其内核配置选项是 CONFIG_BLK_DEV_RAM .

ramdisk的默认大小是 4Mb=4096 blocks. 在你进行mke2fs的时候你可以看到你的ramdisk的大小。mke2fs /dev/ram0 将产生类适于以下的信息:

mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09

Linux ext2 filesystem format

Filesystem label=

1024 inodes, 4096 blocks

204 blocks (4.98%) reserved for the super user

First data block=1

Block size=1024 (log=0)

Fragment size=1024 (log=0)

1 block group

8192 blocks per group, 8192 fragments per group

1024 inodes per group

执行df -k /dev/ram0 你实际用了多少空间:

>df -k /dev/ram0

Filesystem   1k-blocks   Used Available Use% Mounted on

/dev/ram0         3963     13       3746    0% /tmp/ramdisk0

那么麻烦是什么呢?在系统重新启动的时候,将刷新这个区域。不要将任何没有拷贝的数据放在这个区域。如果你对这个目录进行了修改,并且需要保留这些修改,采取一些办法进行备份。
[align=left] [/align]
三改变RamDisks 的大小

要想使用RamDisk你必须或是得到内核的支持或是以模块的形式将他加载到系统中。其中内核的配置选项是 CONFIG_BLK_DEV_RAM . 把ramdisk编译成一个可加载的模块的好处是你可以在加载是重新确定ramdisk的大小。

第一个办法。在lilo.conf文件中加入:

ramdisk_size=10000 (or ramdisk=10000 for old kernels)

这样在你使用lilo命令和重新启动计算机之后,ramdisk的默认大小将会是10M。这是一个/etc/lilo.conf文件的例子:

boot=/dev/hda

map=/boot/map

install=/boot/boot.b

prompt

timeout=50

image=/boot/vmlinuz

label=linux

root=/dev/hda2

read-only

ramdisk_size=10000

确切的说,我只是使用了9M多的空间,文件系统也将占用一定空间。

当你以模块的形式编译ramdisk时,你可以在加载的时候决定ramdisk的大小。这也可以通过修改/etc/conf.modules 的选项设置来做到。

options rd rd_size=10000

或是在命令行中指定参数给ismod:

insmod rd rd_size=10000

以下是介绍如何使用这样的模块的例子:

卸载ramdisk,umount /tmp/ramdisk0 .

卸载模块(再上一节所提到的过程中自动加载), rmmod rd

加载ramdisk模块并且把它的大校设为20M,insmod rd rd_size=20000

创建一个文件系统, mke2fs /dev/ram0

加载ramdisk, mount /dev/ram0 /tmp/ramdisk0
[align=left]四 RamDisk的优缺点[/align]
RamDisk就是将内存模拟为硬盘空间。无论什么时候你使用RamDisk,实际上你是在使用内存而不是硬盘。在这一点上既有优点又有缺点。最基本的,最大的优点是你是在使用内存,你所做的一切都会快一些,因为硬盘的速度较内存慢。最大的缺点是如果你改变了数据库服务器的内容并且重新启动机器时,所做的一切改动都将丢失。

什么是ramfs?

ramfs是一个简单的文件系统,它是基于ram的动态文件系统的一种Linux硬盘缓冲机制。

一般的在Linux上所有的文件都被缓冲在内存中。内存中的数据页在回写后仍然会保存在内存中以防再次使用,但是回写后的数据会被标识为clean,这样系统就可以用这些内容干别的事情了。同样的,文件数据再被回写后也被表识为clean,但是并没有在内存中擦除知道虚拟内存对他再次分配。一个相似的机制也同样适用于目录。

对于ramfs,它没有回写地址。文件写入ramfs中后和平时一样分配目录和页,但是他们回写不了。这就意味着他们的内存永远也不能被标识为clean,所以他们在期待回收内存的时候不会被虚拟内存释放。

需要填充到ramfs的代码很少,因为大部分的工作都被Linux已有的缓存机制做了。基本上,你就如同挂载文件系统。基于此,ramfs在memuconfig不是一个可选项,由于他可以节省的空间可

以忽略。

ramfs and ramdisk

比较老的ramdisk在内存区外分配一个综合的块,用它作为文件系统的回写堆。这个块的是固定大小的,所以挂载的文件系统也是固定的。而且额外的开销也很大。

和ramfs对比,ramdisk浪费了空间,让cpu做了不必要的工作,弄脏了cpu的缓存。总之,ramfs 相对来说比较简单。

另外一个原因,ramfs被半废除的原因是对回环的提出。回环提供了一个更灵活和方便的方式去产生一个块设备,用拷贝文件代替了拷贝内存大块。

ramfs and tmpfs

ramfs的一个确定是你可以一直向里面写数据,直到内存被填满。虚拟内存不能释放他因为它没有回写地址。所以,只有root用户才可以被允许访问ramfs.

ramfs的衍生物tmpfs,tmpfs产生一个大小受限,可以将数据写入交换空间的机制。一般用户也可以访问tmpfs.

rootfs是一个ramfs的特殊实例,他在2.6系统中呈现。你不能卸载rootfs就如同你不能杀死init进程。他很小也很简单去检查确定的列表不能为空。

如果config_tmpfs选项被启动了,roofs将使用tmpfs代替ramfs。如果要强制使用ramfs,可以再内核的命令行使用参数rootfstype=ramfs.

what is initramfs?

2.6 linux 内核中包含了一个gzipped “cpio”格式的目录项,在内核boot阶段被加载到rootfs里面。在被加载完成后,内核检查rootfs中是否有init文件,如果有,就用PID为1来执行他。init文件实现定位和挂载真正的根设备。如果没有Init程序,内核将检查其他的变量,如“/sbin/init”.

 

参考资料:http://askubuntu.com/questions/296038/what-is-the-difference-between-tmpfs-and-ramfs

首先ramfs和tmpfs做相同的事情但是有一些差异。ramfs 是动态的,其最大的值就是ram的空间值。

tmp不是动态增长的,在加载tmpfs时可以说明加载大小。tmpfs使用交换分区,而ramfs没使用。

 

tmpfs的用途

例如:
Oracle 中的Automatic Memory Management特性就使用了/dev/shm。

LINUX中可以把一些程序的临时文件放置在tmpfs中,利用tmpfs比硬盘速度快的特点提升系统性能。

调整tmpfs大小大致有以下三种方法:

1.直接挂载到需要的目录--比如系统的临时目录-可以根据实际需要挂载某个程序的临时文件的目录

[root@bys3 ~]# mount -t tmpfs -o size=20m tmpfs /tmp

[root@bys3 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 16G 10G 4.7G 69% /

/dev/sda1 99M 21M 74M 22% /boot

tmpfs 502M 0 502M 0% /dev/shm

tmpfs 20M 0 20M 0% /tmp

由于没有挂载之前/tmp目录下的文件也许正在被使用,因此挂载之后系统也许有的程序不能正常工作。可以写入/etc/fstab,这样重启后也有效。

2./etc/fstab文件来修改/dev/shm的容量(增加size=100M选项即可),修改后,重新挂载即可:

[root@bys3 ~]# cat /etc/fstab

LABEL=/ / ext3 defaults 1 1

LABEL=/boot /boot ext3 defaults 1 2

tmpfs /dev/shm tmpfs defaults,size=600M 0 0

tmpfs /tmp tmpfs defaults,size=25M 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

LABEL=SWAP-sda3 swap swap defaults 0 0

/dev/sda5 swap swap defaults 0 0

[root@bys3 ~]# mount -a --测试/etc/fstab无错误,重启OS系统

[oracle@bys3 ~]$ df -h --重启后的信息如下,tmpfs文件系统的对应条目已经改变为配置的

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 16G 10G 4.7G 69% /

/dev/sda1 99M 21M 74M 22% /boot
tmpfs 600M 0 600M 0% /dev/shm

tmpfs 25M 0 25M 0% /tmp

3./dev/shm建一个tmp目前,并与/tmp绑定。 --这方法有点烦琐,不如方法1方便快捷。

[root@bys3 ~]# mkdir /dev/shm/tmp

[root@bys3 ~]# chmod 1777 /dev/shm/tmp

[root@bys3 ~]# mount --bind /dev/shm/tmp /tmp -注意mount --bind 这里bind前是两个-

[root@bys3 ~]# ls -ld /tmp

drwxrwxrwt 2 root root 40 Dec 8 12:15 /tmp

[root@bys3 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 16G 10G 4.7G 69% /

/dev/sda1 99M 21M 74M 22% /boot
tmpfs 600M 0 600M 0% /dev/shm

tmpfs 600M 0 600M 0% /tmp ----可以看到/tmp使用到了 /dev/shm的空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RamDisk ramfs tmpfs