在 CentOS 上禁用所有 NFS 客户端缓存

在 CentOS 上禁用所有 NFS 客户端缓存

我有一台导出 NFS 共享 (NFS3) 的 netapp 服务器。
我正在监控 netapp 服务器上的 fpolicy,这意味着,我监听卷(和共享...)的所有文件读取操作。

从 CentOS 机器上,我挂载该 NFS 并执行文件读取 (cat) 操作。
第一次执行“cat”时,在 netapp 中我可以看到有一个文件读取事件。

但是如果我再执行“cat filename”,则事件 FILE READ 计数器不会增加。
如果我转到另一台计算机并安装 NFS 共享,然后执行 cat,则会看到计数器增加 1。
我假设 - NFS 客户端具有内部缓存机制。

我想禁用 NFS 客户端缓存。

我使用以下命令挂载了 NFS:

mount -o lookupcache=none,actimeo=0,noac 10.10.10.1:/vol/vol0_unix /mnt/nfs1

注意 lookupcache=none,actimeo=0,noac 选项 -取自链接

我是否缺少了额外的 NFS 客户端缓存机制?

我的 NFS 客户端是:Linux CENTOS 6.4 2.6.32-358.el6.x86_64

计算机 NFS 版本:

[ilan@DevCore-Centos6 nfs1]$ rpm -qa|grep -i nfs
nfs-utils-1.2.3-36.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs4-acl-tools-0.3.3-6.el6.x86_64
[ilan@DevCore-Centos6 nfs1]$

我认为缓存文件默认情况下未运行。

答案1

思考您的问题是正在进行的缓存与 NFS 没有特别关系。这是我在执行md5sum一个小型 NFS 挂载文件时在网络上看到的内容五秒内第二次

12:29:27.615255 IP6 2a02:xxxx:6049:11:76d4:35ff:fe8d:39ec.1003 > 2a02:xxxx:6049:11:7271:bcff:feac:445a.2049: Flags [P.], seq 3028:3236, ack 34857, win 1432, options [nop,nop,TS val 453693630 ecr 2105657370], length 208: NFS request xid 3660266482 204 getattr fh 0,2/53
12:29:27.617595 IP6 2a02:xxxx:6049:11:7271:bcff:feac:445a.2049 > 2a02:xxxx:6049:11:76d4:35ff:fe8d:39ec.1003: Flags [P.], seq 34857:35153, ack 3236, win 500, options [nop,nop,TS val 2105661555 ecr 453693630], length 296: NFS reply xid 3660266482 reply ok 292 getattr NON 3 ids 0/-2006101416 sz 1610612736
12:29:27.617632 IP6 2a02:xxxx:6049:11:76d4:35ff:fe8d:39ec.1003 > 2a02:xxxx:6049:11:7271:bcff:feac:445a.2049: Flags [.], ack 35153, win 1432, options [nop,nop,TS val 453693632 ecr 2105661555], length 0

内核所做的只是检查文件是否被修改getattr(因为它正确地不缓存任何属性,而是返回服务器获取新属性)。然后它知道文件未被修改,因此它可以使用仍然在内核中包含内容的页面。这正是它使用当地的如果我理解正确的话,文件也是如此。

所以你不是想转离开NFS 缓存,如果你想修改 VM 子系统中的文件缓存,以便它特别不适用到 NFS 挂载的内容。这可能要困难得多,因为你不是试图关闭已经存在的东西,而是试图引入一个可能现在还不存在的全新区别,如果你明白我的意思的话。

我认为我同意 Andrew Henle 的观点,这听起来像是一个 XY 问题。也许你应该告诉我们你的情况真的正在嘗試做。

编辑:您断言本地文件访问的情况并非如此。但是,我认为您错了。我将一个硬盘连接到我的桌面,只有一个进程可以访问该硬盘,并且我连续两次使用md5sum文件iostat来监控往返物理设备的流量。

第一次:

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               0.00     0.00    0.80    0.00    49.60     0.00   124.00     0.08   95.75   95.75    0.00  94.00   7.52

注意驱动器的读取流量(rkB/s);现在是第二次:

sdc               0.00     0.20    0.00    0.40     0.00     2.40    12.00     0.00    1.00    0.00    1.00   1.00   0.04

因此,看起来 VM 子系统也妨碍了。因此,目前我认为没有理由认为您没有在 NetApp 上看到客户端正确生成的所有流量,我再次询问,你到底想在这里做什么为什么是你吗必须禁用[缓存],并从 redhat 发送实际的文件读取“?因为目前看来,这确实不是什么问题。”

答案2

假设您正在测试 fpolicy 并且只是在寻找一种可靠地生成一些流量的方法,我将完全跳过 OS NFS 堆栈,而只使用 python 脚本或者其他什么。您对何时生成 NFS 操作具有完全、有据可查的控制权。操作系统并非为此而设计的,快速谷歌搜索后我发现,虽然这应该可行,但并不明显,而且肯定不是默认行为。

相关内容