ramfs和tmpfs之间的性能差异

我需要在内存存储系统中安装大约10 GB的数据,包含许多100 kb单个文件(图像)。 将会有大量的读取和相当周期的写入(添加新文件,删除一些旧的)。
现在,我知道tmpfs的行为就像一个普通的文件系统,例如,你可以用df检查空闲/已用空间,这是一个很好的function。 不过,我感兴趣的是,如果ramfs在IO操作的速度方面提供了一些优势。 我知道在使用ramfs的时候,我无法控制所消耗内存的大小,而且如果完全使用可用RAM,我的系统可能会挂起,但在这种情况下这不会成为问题。

总结起来,我感兴趣的是:
性能明智,这是更快: ramfstmpfs (可能为什么)?
– 什么时候tmpfs使用交换空间? 它是否将已保存的数据移动到交换(为当前正在运行的其他程序释放RAM)或者只有新数据(如果此时没有可用的RAM)?

我的推荐:

在正常情况下测量和观察真实的活动。

这些文件不可能全部被需要,并且始终在caching中提供。 但是有一个叫做vmtouch的好工具可以告诉你在某个特定时刻什么是caching。 您也可以使用它将某些目录或文件locking到caching中。 因此,经常使用后看看是什么样子。 对于这种情况,使用tmpfs和ramfs不是必需的。

请参阅: http : //hoytech.com/vmtouch/

我想你会惊讶地发现最活跃的文件可能已经驻留在caching中了。


至于tmpfs与ramfs,没有明显的性能差异。 有操作上的差异。 一个真实的用例是Oracle,其中ramfs被用来允许Oraclepipe理RAM中的数据,而没有被交换的风险。 tmpfs数据可以在内存压力下换出。 在resize和修改设置方面也有不同之处。

不要过分想这个。 在系统中放入足够的内存,让内核的磁盘caching为你处理事情。 这样你就可以直接从内存中获得读取的好处,同时仍然可以将数据保存在磁盘上。

1)性能基准。

使用这个页面作为参考,我做了tmpfs和ramfs之间的I / O比较,结果是它在性能方面非常相似:

# !mount mount | grep -E "tmp|ram" tmpfs on /dev/shm type tmpfs (rw) ramfs on /mnt/ram type ramfs (rw,size=1G) # dd bs=1M count=1024 if=/dev/zero of=/dev/shm/test conv=fdatasync 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 0.634054 s, 1.7 GB/s # dd bs=1M count=1024 if=/dev/zero of=/mnt/ram/test conv=fdatasync 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 0.559557 s, 1.9 GB/s # dd bs=1M count=4096 if=/dev/zero of=/dev/shm/test conv=fdatasync 4096+0 records in 4096+0 records out 4294967296 bytes (4.3 GB) copied, 2.5104 s, 1.7 GB/s # dd bs=1M count=4096 if=/dev/zero of=/mnt/ram/test conv=fdatasync 4096+0 records in 4096+0 records out 4294967296 bytes (4.3 GB) copied, 2.36923 s, 1.8 GB/s 

2)根据这个页面 ,tmpfs使用swap,ramfs不使用swap。

如果你有足够的RAM来安装各种内核缓冲区,应用程序堆栈和堆,常规的文件系统caching以及所有你想放入的文件,那么ramfs应该永远不会比tmpfs慢,devise中物理I / O的风险。 物理I / O无疑是该领域性能下降的主要原因。

但是,如果你没有安装这么多的内存,使用ramfs可能也可能会比tmpfs慢,因为后者使用虚拟内存启发式来决定什么应该更好地在磁盘上(即在交换区域)与应该是什么在使用tmpfs在RAM上,您的文件系统数据卡在RAM上,这可能会浪费资源。

为了回答第二个问题,是的, tmpfs会将旧数据先移到交换区,而不是最后一个“热”区。