ramfs 和 tmpfs 之间的性能差异

Iva*_*vic 29 linux performance filesystems ramdisk tmpfs

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

总而言之,我感兴趣:
- 性能方面,哪个更快:ramfstmpfs(可能是为什么)?
- tmpfs 什么时候使用交换空间?它是否将已保存的数据移动到交换(为当前正在运行的其他程序释放 RAM)或仅在那时没有可用 RAM 时才移动新数据?

eww*_*ite 28

我的建议:

在正常条件下测量和观察现实生活中的活动。

这些文件不太可能总是被需要并从缓存中提供。但是有一个叫做vmtouch的好工具可以告诉你在给定时刻缓存中的内容。您还可以使用它来将某些目录或文件锁定到缓存中。所以看看一些经常使用后的情况。在这种情况下不需要使用 tmpfs 和 ramfs。

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

我想您会惊讶地发现最活跃的文件可能已经驻留在缓存中。


就 tmpfs 与 ramfs 而言,没有明显的性能差异。存在操作差异。一个真实的用例是 Oracle,其中 ramfs 用于允许 Oracle 管理 RAM 中的数据,而没有被交换的风险。tmpfs 数据可以在内存压力下换出。动态调整大小和修改设置也存在差异。

  • 很棒的小工具!+1 (2认同)

EEA*_*EAA 13

不要想太多。在您的系统中放置足够的 RAM,让内核的磁盘缓存为您处理事情。这样你就可以直接从内存中读取数据,同时仍然能够将数据保存在磁盘上。

  • 是的,如果系统中有足够的 RAM,并且服务器上的其他应用程序没有争用 RAM 资源,那么这些文件将保留在缓存中。 (5认同)
  • 磁盘缓存肯定适用于需要读取图像的情况,但如果您希望加速大量随机/小写操作但绑定到随机 I/ 速度较慢的磁盘,tmpfs 或 ramfs 仍然有用哦。请记住,如果机器崩溃或遇到电源故障,tmpfs 的内容将消失,因为它们(仅)在内存中。 (5认同)
  • @Martijn 是对的。tmpfs和ramfs确实很有用。例如,我正在对 git 存储库进行密集重写(过滤分支)。在内存中执行比在 SSD 上执行要快得多。缓存有助于读取而不是写入,因为(通常)Linux 必须满足有关磁盘操作持久性的一些保证。 (3认同)
  • 我在 unix 管理部门工作了大约 15 年,我*从来没有*遇到过 tmpfs/ramfs 比原生内核 fs 缓存提供*任何*好处的情况。这并不是说在那里不存在需要它们的情况,但它们非常罕见。通常,如果您需要 RAM 缓存,可以使用专门构建的缓存层(Redis/Memcache/等)。 (2认同)

Mic*_*nez 9

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
Run Code Online (Sandbox Code Playgroud)

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

  • 你的答案是正确的。但是,我不同意您关于性能的结论,您的测试表明 ramfs 存在 0.2 GB/s 和 0.1 GB/s 的差异。我相信这应该进一步测试以提供有效的统计样本。关于 2) 是的,这是已知的,但是我希望我可以更好地了解交换使用的确切时间。 (3认同)
  • 如果你有一堆小文件怎么办?例如写入百万个 100-200 kb 文件。另外,对于相同的文件大小,您是否会重复获得 0.2 GB/s 的差异?这肯定会指出性能差异。当它在我的日程安排中时,我可能会亲自测试一下。但这就是我在这里问的原因,所以如果其他人已经这样做了,我也许可以将其从待办事项列表中删除。 (2认同)