linux 利用RAMdisk、ramfs、tmpfs作为特殊文件系统

个人调试感受:

采用tmpfs文件系统(该文件系统使用的是真实的物理内存RAM)挂载的文件tmpfs_test.file,即使你使用dd工具在tmpfs_test.file生产一个超过物理内存的文件,那么也会受限于真实的物理内存RAM限制;

采用ramfs文件系统是将nandflash上的一块空间(如要运行的应用程序)映射到真实的物理内存RAM上,如果你用dd工具分配一个大文件在你挂载上的ramfs文件系统上,是不会受限空间的,并且它会占用你nandflash空间,下面log是在/mnt/app目录下进行测试的

             total       used       free     shared    buffers     cached
Mem:         60140      57712       2428          0        188      52792
-/+ buffers/cache:       4732      55408
Swap:            0          0          0
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 5.4M      5.4M         0 100% /
devtmpfs                 29.3M         0     29.3M   0% /dev
tmpfs                    29.4M         0     29.4M   0% /dev/shm
tmpfs                    29.4M     24.0K     29.3M   0% /tmp
tmpfs                    29.4M     16.0K     29.3M   0% /run
/dev/mtdblock5           10.0M     10.0M     40.0K 100% /mnt/app
/dev/mtdblock6            8.0M      1.9M      6.1M  24% /mnt/ext
/dev/mtdblock7           95.0M     83.8M     11.2M  88% /mnt/data
tmpfs                     1.0G         0      1.0G   0% /mnt/app/tmpfs_test



[root@szclou /mnt/app]#df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 5.4M      5.4M         0 100% /
devtmpfs                 29.3M         0     29.3M   0% /dev
tmpfs                    29.4M         0     29.4M   0% /dev/shm
tmpfs                    29.4M     24.0K     29.3M   0% /tmp
tmpfs                    29.4M     16.0K     29.3M   0% /run
/dev/mtdblock5           10.0M      6.8M      3.2M  68% /mnt/app
/dev/mtdblock6            8.0M      1.9M      6.1M  24% /mnt/ext
/dev/mtdblock7           95.0M      3.6M     91.4M   4% /mnt/data
tmpfs                     1.0G         0      1.0G   0% /mnt/app/tmpfs_test

 

1.三种特殊文件系统简介 

ramdisk:RAM disk是使用主系统内存作为块设备的一种方式。它也可用于临时文件系统的加密工作,因为内容在重新启动时将被擦除。由于这个块设备大小是固定的,因此安装存放在其上面的文件系统是固定的大小。

ramfs:Ramfs是一个非常简单的文件系统,用于导出Linux的磁盘缓存 机制(页面缓存和dentry缓存)基于RAM的文件系统,可以动态的根据需要调整大小(前提不超过总RAM的情况)。通常,文件都被Linux缓存在内存中,数据页从后备存储(通常是安装文件系统的块设备)中读取并被保存 防止它再次需要,但标记为干净(可自由使用的),以防万一 虚拟内存系统需要其他内存。但ramfs 是没有后备存储的,像往常一样,写入ramfs的文件分配 dentry和页面缓存,但是没有地方可写。这意味着页面从未被标记为干净,因此当VM正在寻找回收内存时,它们不能被释放 。除非关机断电。

tmpfs:将所有文件保存在虚拟内存中的文件系统。tmpfs中的所有内容都是临时的,因为在你的硬盘上不会有文件被创建。如果卸载tmpfs实例, 存储在其中的一切都丢失。如果你umount tmpfs文件系统,存储在里面的内容将丢失。tmpfs可以将所有内容放入内核内部缓存并增长收缩以容纳它包含的文件,并能够交换不需要的页面到swap交换空间。由于tmpfs 完全位于页面缓存和交换中,所有tmpfs页面将在/proc/meminfo 和‘shared’ 中显示为 ”Shmem“

2.它们三的简单比较

ramfs与ramdisk比较:使用ram disk还需要不必要地将伪造块设备中的内存复制到页面缓存(并复制更改),以及创建和销毁dentries。此外,它还需要一个文件系统驱动程序(如ext2)来格式化和解释这些数据。与ramfs相比,这浪费了内存(和内存总线带宽),为CPU创造了不必要的工作,并污染了CPU高速缓存。更重要的一点,ramfs的所有的工作都发生在_anyway_,因为所有文件访问都通过页面和dentry缓存。 RAM disk是不必要的; ramfs在内部更简单,使用起来更灵活,大小可随着需要的空間而动态增加或減少。

ramfs与tmpfs比较:ramfs的一个缺点是你可以持续的往里面写入数据,直到填满所有的内存,并且VM无法释放它,因为VM认为文件应该写入后备存储(而不是交换空间),但是ramfs 它没有任何后备存储。因此,只有root(或受信任的用户)才允许对ramfs mount进行写访问。创建一个名为tmpfs的ramfs派生物,以增加大小限制和能力,将数据写入swap交换空间。普通用户也可以允许写入权限 tmpfs挂载。

3.如何设置ramfs

创建一个目录,用于挂载ramfs

[root@docker ~]# mkdir /ramfs_test

 挂载ramfs到上一步创建的目录中

[root@docker ~]# mount -t ramfs ramfs /ramfs_test/

检查
[root@docker ~]# mount |grep ramfs_test
ramfs on /ramfs_test type ramfs (rw,relatime)

测试一下ramfs与磁盘io读写的比较,一目了然。

[root@docker ~]# dd if=/dev/zero of=/ramfs_test/testfile.ramfs bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,0.60369 秒,1.7 GB/秒
[root@docker ~]# dd if=/dev/zero of=/tmp/testfile.ramfs bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,13.3286 秒,78.7 MB/秒

另外一个需要说明,网上大部分文章说挂载ramfs时,可以指定maxsize,即使用的最大的内存,经过测试,size(maxsize)参数没有生效,我使用以下命令进行挂载:

[root@docker ~]# mount -t ramfs ramfs /ramfs_test -o size=1024M && mount | grep ramfs
ramfs on /ramfs_test type ramfs (rw,relatime,size=1024M)

然后放入一个大于1G的文件,并检查大小

[root@docker ~]# dd if=/dev/zero of=/ramfs_test/testramfs.file bs=1M count=1200
记录了1200+0 的读入
记录了1200+0 的写出
1258291200字节(1.3 GB)已复制,0.78763 秒,1.6 GB/秒
[root@docker ~]# ll -h /ramfs_test/testramfs.file 
-rw-r--r-- 1 root root 1.2G 6月   2 09:04 /ramfs_test/testramfs.file

从上面可以看出,使用ramfs作文件系统,并没有受到限制,所以它有可能占用系统全部的RAM,并导致系统死锁,无法进行操作,系统内核将崩溃。所以这里在使用ramfs时,要慎重考虑使用场景,避免程序故障或内存溢出导致系统崩溃,必须重启才能解决!另外查看了mount的man 手册,挂载ramfs内容时只有以下内容:

Mount options for ramfs
       Ramfs is a memory based filesystem. Mount it and you have  it.  Unmount
       it  and it is gone. Present since Linux 2.3.99pre4.  There are no mount
       options.

而,size参数只适用于tmpfs!

Mount options for tmpfs
       size=nbytes
              Override default maximum size of the filesystem.   The  size  is
              given  in bytes, and rounded up to entire pages.  The default is
              half of the memory. The size parameter also accepts a  suffix  %
              to limit this tmpfs instance to that percentage of your physical
              RAM: the default, when neither size nor nr_blocks is  specified,
              is size=50% 

4.如何设置tmpfs

和ramfs有点类似,先创建一个目录,用于挂载tmpfs

[root@docker ~]# mkdir /tmpfs_test

使用mount命令挂载到tmpfs_test目录中,并检查挂载情况

[root@docker ~]# mount -t tmpfs -o size=1G tmpfs /tmpfs_test && mount |grep tmpfs_test
tmpfs on /tmpfs_test type tmpfs (rw,relatime,size=1048576k)

现在我们使用dd来测试一下速度,并检查下size 限制空间的效果

[root@docker ~]# dd if=/dev/zero of=/tmpfs_test/testtmpfs.file bs=1M count=1100
dd: error writing ‘/tmpfs_test/testtmpfs.file’: No space left on device
1025+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.497443 s, 2.2 GB/s

从上面的提示可以看出,空间已经不够,现在看下实际存入的文件大小

[root@docker ~]# ls -l --block-size=K /tmpfs_test/testtmpfs.file
-rw-r--r-- 1 root root 1048576K Jun  2 12:16 /tmpfs_test/testtmpfs.file

从ls的输出可以看到,实际存入的文件大小,刚好是size限制的大小。很明显,size起到了避免系统RAM/SWAP内存被tmpfs 全部填满的情况。也体现了tmpfs 比ramfs的优势所在。所以推荐使用tmpfs。 

下面是之前tmpfs介绍中所说的tmpfs在/proc/meminfo 以及shared 显示。

[root@docker ~]# free -m && echo '-------------------------/proc/meminfo' && cat /proc/meminfo |grep Shmem
              total        used        free      shared  buff/cache   available
Mem:           1839         268         174        1024        1397         393
Swap:             0           0           0
-------------------------/proc/meminfo
Shmem:           1048964 kB

你可能感兴趣的:(linux,file,system)