我有一台导出 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 操作具有完全、有据可查的控制权。操作系统并非为此而设计的,快速谷歌搜索后我发现,虽然这应该可行,但并不明显,而且肯定不是默认行为。