通过NFS共享的mmap文件?

8

方案 A:

为了在同一主机上运行的两个进程之间共享读写块内存,Joe 从这两个进程中都映射相同的本地文件。

方案 B:

为了在两个不同主机上运行的两个进程之间共享读写块内存,Joe 通过 nfs 在主机之间共享文件,然后从这两个进程中都映射共享文件。

有人尝试过方案 B 吗?与方案 A 不同,方案 B 会出现哪些额外的问题?


你可能会得到 ENODEV 错误。但编写一个尝试从 NFS 映射文件的程序比编写这个问题需要更少的按键。 - C2H5OH
1
@C2H50H:为什么会返回NODEV?我很确定mmap系统调用会返回成功——然而这并没有回答我的问题。 - Andrew Tomazos
3个回答

6

Mmap不会在没有额外操作的情况下共享数据。

如果您更改了文件中mmap部分的数据,更改将仅存储在内存中。它们不会被刷新到文件系统(本地或远程),直到使用msync、munmap、close或甚至是OS内核及其文件系统的决策。

使用NFS时,锁定和存储数据的速度比使用本地FS要慢。刷新超时和文件操作时间也会有所变化。

在姐妹网站上,人们表示NFS可能具有较差的缓存策略,因此相比于本地FS,向NFS服务器发送的I/O请求数量将更多。


5
您需要字节范围锁来确保正确的行为。它们在NFS >= v4.0中可用。

0

我想说情景B有各种问题(假设按照评论中的建议工作)。最明显的问题是标准并发性问题-2个进程共享1个资源,没有任何形式的锁定等。这可能会导致问题...不确定NFS在这方面是否有其自己的特殊问题。

假设你可以以某种方式解决并发问题,那么你现在就依赖于维持稳定(和快速)的网络连接。显然,如果网络掉线,你可能会错过一些更改。这是否重要取决于你的架构。

我的想法是这听起来像是在不同机器上共享一块内存的简单方法,但我没听说过有人这么做,这让我觉得它可能不太好。当我想到在进程之间共享数据时,我会想到数据库、消息传递或专用服务器。在这种情况下,如果你将一个进程作为主进程(处理并发和拥有概念-即这个人所说的数据的最佳副本),那可能会起作用...


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