情景A :
为了在同一主机上运行的两个进程之间共享一个读/写内存块,Joe将两个进程中的同一本地文件映射到一起。
情景B :
要在两个不同主机上运行的两个进程之间共享读/写内存块,Joe通过主机间的nfs共享一个文件,然后从两个进程中映射共享文件。
有没有人尝试过情景B? 情景B中出现的哪些额外问题不适用于情景A?
没有一些额外的行动,Mmap将不会共享数据。
如果更改文件的mmaped部分中的数据,更改将仅存储在内存中。 在msync
或munmap之前,它们不会被刷新到文件系统(本地或远程文件系统),甚至可以关闭,甚至可以决定OS内核及其FS。
使用NFS时,锁定和存储数据将比使用本地FS更慢。 刷新超时和文件操作的时间也会有所不同。
在姊妹网站上,人们说NFS的缓存策略可能很差,因此将比较I / O请求数量和本地FS的NFS服务器的I / O请求量要多得多。
您将需要字节范围锁定正确的行为。 它们在NFS> = v4.0中可用。
我会说场景B有各种各样的问题(假设它的工作原理在评论中提到)。 最明显的是标准并发性问题 – 共享1个资源的2个进程没有锁定的形式等等,这可能导致问题…不知道在这方面NFS是否有其特有的怪癖。
假设您可以以某种方式解决并发问题,那么您现在依赖于维护稳定(快速)的网络连接。 显然,如果网络退出,您可能会错过一些更改。 这是否重要取决于你的架构。
我的想法听起来像是在不同的机器上共享一块内存的一个简单的方法,但我不能说我听说过这样做,这让我觉得它不是那么好。 当我认为在特效之间共享数据时,我认为数据库,消息或专用服务器。 在这种情况下,如果你让一个主处理器(处理并发和拥有这个概念 – 无论这个人说什么是最好的数据副本),它可能会工作…