如何在提高效率时使用/dev/shm?何时使用?

23

/dev/shm与在普通文件系统上写入文件相比,有何更高的效率?据我所知,/dev/shm也是硬盘上的空间,因此读/写速度相同。

我的问题是,我有一个96GB的文件,而只有64GB内存(+64GB交换空间)。此后,来自同一进程的多个线程需要读取文件的小随机块(约1.5MB)。

/dev/shm对于这种情况是否是一个好的使用案例?
它是否比从/home以只读模式打开文件,然后将其传递给线程来读取所需的随机块更快?


5
/dev/shm 不在硬盘上,它是一个在内存中实现的虚拟文件系统,因此速度更快。 - Barmar
1
@Barmar没错,我刚意识到这一点...那么使用它就有意义了,特别是因为它可以从多个进程共享,所以每个想要使用它的进程不会占用96GB。 - ilija139
1个回答

20
您不应该使用 /dev/shm。它的存在是为了 POSIX C 库可以通过 POSIX API 提供共享内存支持,而不是让您去操作里面的内容。
如果您想要一个自己的内存文件系统,可以将其挂载到任何您想要的地方。
例如:mount -t tmpfs tmpfs /mnt/tmp
Linux 的 tmpfs 是一个临时文件系统,仅存在于 RAM 中。它通过具有没有任何磁盘存储后备的文件缓存来实现。在内存压力下,它会将其内容写入交换文件中。如果您不想使用交换文件,则可以使用 ramfs
我不知道您从哪里得到使用 /dev/shm 来提高读取文件效率的想法,因为它根本不是这样的。
也许您在考虑通过 mmap 系统调用使用内存映射?
阅读这个答案:https://superuser.com/a/1030777/4642 它涵盖了很多关于 tmpfs 的信息。

2
我从这里得到了灵感:https://github.com/torch/torch7/blob/master/doc/storage.md#torchtypestoragefilename--shared--size--sharedmem所以我在思考是将存储文件放在共享内存中还是不放更好。 - ilija139
16
这个回答大部分是不正确的。在Linux上,/dev/shm空间确实是一个暴露的tmpfs块设备。它的目的恰恰是用来存放东西的。它的最大分配量为可用RAM的1/2。例如,如果安装了64GB的RAM,则可用32GB。根据大文件中随机读取的情况,/dev/shm可能是一个不错的使用场景。如果大多数读取都集中在96GB前1/3的位置,那么可以直接将该部分复制到/dev/shm中。未使用的内存就是浪费时间。然而,/dev/shm并不能改善对同一文件位置的多次读取,因为这些数据已经被缓存了。 - Beracah
3
@Zan不要基于猜测的冲突,就自以为是地告诉用户如何处理他自己的shm。这会降低计算机和提供的服务的效用。除此之外,只要作者不将所有内容都写成root,标准内核权限就能确保不会发生冲突。无论如何,也不可能以那种方式污染正在运行的内核。 - Beracah
5
我看到了那条评论,但我没有回应它,因为你对于在其他地方安装的理由从一开始就是错误和误导的。使用内核提供的“共享内存”没有问题,这也有一个文件系统,并且专门提供给用户级别访问。如果你想的话,你可以直接在Samba上共享它,并选择给该空间中的区域授予权限。 - Beracah
11
д»…rootз”ЁжҲ·еҸҜд»Ҙжү§иЎҢmount -t tmpfs tmpfs /mnt/tmpпјҢжүҖд»Ҙ/dev/shmжҳҜжҸҗй«ҳз”ЁжҲ·I/OжҖ§иғҪзҡ„еҘҪж–№жі•гҖӮиҜ·еҸӮиҖғhttps://superuser.com/questions/45342/when-should-i-use-dev-shm-and-when-should-i-use-tmpгҖӮ - Anthony Scemama
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接