ramfs和tmpfs之间的性能差异


23

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

总而言之,我感兴趣:
-性能方面,速度更快:ramfstmpfs(可能是为什么)?-tmpfs
何时使用交换空间?它会把已经保存的数据移到交换区(为正在运行的其他程序释放RAM)还是只有新数据(如果那时没有剩余的RAM)?


嗯,服务器中有多少RAM?
ewwhite

1
该服务器总共有16 GB的RAM。另外值得注意的是,我没有SSD存储,但是只有一个7200 rpm的HDD。这就是为什么我正在考虑使用某种类型的RAM存储。
伊万·科瓦切维奇

Answers:


21

我的建议:

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

这些文件不太可能一直都需要,并始终从缓存中提供。但是有一个不错的工具vmtouch可以告诉您在给定时刻缓存中有什么。您也可以使用它将某些目录或文件锁定到缓存中。因此,看看一些常规使用后的样子。在这种情况下,不必使用tmpfs和ramfs。

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

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


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


1
很棒的小工具!+1
Janne Pikkarainen 2014年

1
@ewwhite优秀回复。在几年前的一个案例中,我们确实发现大多数使用的文件已经驻留在缓存中。提示:如今的文件系统比我想象的要聪明得多。
giannisapi '16

13

不要想太多。在系统中放置足够的RAM,并让内核的磁盘缓存为您处理事务。这样一来,您不仅可以直接从内存中读取数据,而且还可以将数据持久存储在磁盘上。


1
我的系统当前有16 GB的RAM。它是运行Nginx来提供那些图像的普通Debian安装。我有一个1 Gbit的网络连接,始终处于100%负载之下,不按特定顺序提供这些图像。您是否认为在这种情况下内核会在高速缓存中加载所有那10个Gig映像?
伊万·科瓦切维奇

3
是的,如果系统中有足够的RAM,并且服务器上的其他应用程序没有竞争RAM资源,则这些文件将保留在缓存中。
EEAA 2014年

2
我已经在Unix管理部门工作了15年之久,而且从未遇到过tmpfs / ramfs会比本地内核fs缓存提供任何好处的情况。这并不是说不存在需要保证的情况,但是这种情况非常罕见。通常,如果您需要RAM缓存来进行处理,则可以使用专用缓存层(Redis / Memcache / etc。)。
EEAA 2014年

4
在需要读取图像的情况下,磁盘缓存当然可以工作,但是如果您希望加快大量随机/小写操作,但由于随机I /哦 请记住,如果计算机崩溃或电源故障,则tmpfs的内容将消失,因为它们仅在内存中。
Martijn 2014年

1
@Martijn是正确的。tmpfs和ramfs确实有用。例如,我正在对git存储库进行大量重写(过滤器分支)。在内存中执行此操作的速度比在SSD上执行的速度快。缓存有助于读取而不是写入,因为(通常)Linux必须满足一些有关磁盘操作永久​​性的保证。
保罗·德雷珀

7

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。


2
您的答案是正确的。但是,我不同意您关于性能的结论,您的测试表明,支持ramfs的差异为0.2 GB / s和0.1 GB / s。我认为应该对此进行进一步测试以提供有效的统计样本。关于2)是的,这是已知的,但是我希望我可以更好地了解何时使用交换。
伊万·科瓦切维奇

如果我们使用不同大小的文件多次执行此基准测试,那么我认为不会有什么不同。您会注意到,当我将大小增加四倍时,差异实际上是缩小而不是扩大。
Michael Martinez 2014年

1
如果您有一堆小文件呢?例如,写入百万个100-200 kb的文件。同样文件大小,是否还会重复获得0.2 GB / s的差异?这肯定会指出性能差异。我可能会按自己的时间表进行测试。但这就是为什么我在这里问,所以如果其他人已经做过的话,我可以将其从待办事项清单中删除。
伊万·科瓦切维奇

是的,唯一可以确定的方法就是进行测试。
Michael Martinez

1

如果您安装了足够的RAM来承载各种内核缓冲区,应用程序堆栈和堆,常规文件系统高速缓存以及您打算放入其中的所有文件,ramfs则绝对不要比它慢,tmpfs因为这样不会造成风险。物理I / O通过设计。物理I / O无疑是该区域性能下降的主要原因。

但是,如果您没有安装那么多的RAM,则使用ramfs它的速度可能会慢于tmpfs后者,因为后者使用虚拟内存试探法来确定什么应该更好地放在磁盘上(即在交换区域中)与应该在RAM上进行比较。使用时tmpfs,文件系统数据将停留在RAM上,这可能会浪费资源。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.