我有一个 NFS 客户端,它从共享 NFS 服务器执行读取文件操作。
在服务器上,我监视文件读取操作。
问题是当我在同一台机器上读取相同的文件(使用不同的用户)时 - 它只会通过 NFS 协议调用 1 个读取文件操作(在客户端上,因此在服务器上)。
经调查(这个线程) - 我发现在清理页面缓存时:
echo 1 > /proc/sys/vm/drop_caches
READ FILE 操作将被再次调用。
是否可以强制内核/操作系统禁用 NFS 协议的页面缓存?
答案1
不可能。想象一下如果您尝试从 NFS 服务器执行文件会发生什么。文件被映射到内存中,但实际上并未读入内存,因为不允许使用页面缓存。程序开始执行,但立即出现页面错误,因为内存映射未缓存在 RAM 中。非首发。好吧,假设我们可以稍微放宽规则,只为该页面填充页面缓存一次。我们将其从 NFS 服务器读入 RAM 并解决页面错误,但随后立即将其逐出。程序可能会执行一条指令,然后再次出现页面错误。
你可以让它的工作方式比我刚刚描述的思想实验少一点荒谬,特别是你正在谈论正常read()
而不是mmap()
,但你的解决方案仍然与虚拟内存的基本工作方式完全不一致,并且性能会非常糟糕。