我需要设置一个内存存储系统,用于存储大约 10 GB 的数据,其中包含许多 100 kb 的单个文件(图像)。会有大量读取和相当定期的写入(添加新文件,删除一些旧文件)。
现在,我知道临时文件其行为类似于常规文件系统,例如,您可以使用以下方式检查可用/已用空间自由度,这是一个很好的功能。不过我感兴趣的是内存文件系统在 IO 操作速度方面会有一些优势。我知道在使用时我无法控制所消耗的内存大小内存文件系统如果我的系统完全消耗了可用 RAM,它就会挂起,但在这种情况下这不是问题。
总而言之,我感兴趣的是:
- 性能方面,哪个更快:内存文件系统或者临时文件(以及可能的缘由)?
- 什么时候临时文件使用交换空间吗?它是否将已保存的数据移动到交换空间(以释放 RAM 供当前正在运行的其他程序使用)或仅将新数据移动到交换空间(如果此时没有剩余的可用 RAM)?
答案1
我的建议:
在正常条件下测量并观察现实生活中的活动。
这些文件不太可能全部都需要,并且始终从缓存中提供。但有一个很好的工具叫做虚拟触摸它可以告诉你在特定时刻缓存中有什么。你还可以用它将某些目录或文件锁定到缓存中。因此,看看在经过一些常规使用后情况如何。在这种情况下,无需使用 tmpfs 和 ramfs。
我想您会惊讶地发现最活跃的文件可能已经驻留在缓存中了。
就 tmpfs 与 ramfs 而言,性能上没有明显差异。操作上存在差异。一个实际用例是 Oracle,其中使用 ramfs 允许 Oracle 管理 RAM 中的数据,而不用担心数据被交换。tmpfs 数据可以在内存压力下被交换出去。在动态调整大小和修改设置方面也存在差异。
答案2
不要想太多。在系统中放入足够的 RAM,让内核的磁盘缓存为您处理一切。这样,您就可以直接从内存读取数据,同时仍能将数据保留在磁盘上。
答案3
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。
答案4
如果您安装了足够数量的 RAM 来承载各种内核缓冲区、应用程序堆栈和堆、常规文件系统缓存以及您打算放入其中的所有文件,则速度ramfs
绝不会低于此,tmpfs
因为设计上不存在物理 I/O 风险。毫无疑问,物理 I/O 是导致该领域性能下降的主要原因。
但是,如果您没有安装那么多的 RAM,使用ramfs
可能会比更慢,tmpfs
因为后者使用虚拟内存启发式方法来决定什么应该放在磁盘上(即在交换区域中)以及什么应该放在 RAM 上,而使用时tmpfs
,您的文件系统数据被卡在 RAM 上,这可能会浪费资源。
回答你的第二个问题,是的,tmpfs
会首先将旧数据移动到交换区域,而不是最后的“热”数据。