我们在代码部署期间遇到了一个间歇性发生的问题。NFS 在读取文件时会缓存文件,但如果在代码部署期间读取文件,则文件将保持脏状态,就好像文件在部署期间没有更改一样。我们缓解此问题的唯一方法是在部署后清除 NFS 缓存。
我们的网络服务器对所有请求都返回空白页,直到 NFS 缓存被清除。
是否有设置或有人对如何解决此问题有建议?
我们目前正在运行 NFS v3。
答案1
存在在 NFS 挂载(客户端)上缓存文件属性的不同选项:
新冠治疗药物
使用 noac 挂载选项可实现多个客户端之间的属性缓存一致性。几乎每个文件系统操作都会检查文件属性信息。客户端会将此信息缓存一段时间,以减少网络和服务器负载。当 noac 生效时,客户端的文件属性缓存将被禁用,因此每个需要检查文件属性的操作都会被强制返回到服务器。这允许客户端非常快速地查看文件的更改,但需要进行许多额外的网络操作。lookupcache=无
如果客户端忽略其缓存并向服务器验证每个应用程序查找请求,则该客户端可以立即检测到另一个客户端何时创建或删除了新目录条目。您可以使用 lookupcache=none 指定此行为。如果客户端不缓存目录条目,则需要额外的 NFS 请求,这会导致性能下降。禁用查找缓存应该比使用 noac 导致的性能下降要小,并且不会影响 NFS 客户端缓存文件属性的方式。actimeo=n
使用 actimeo 将 acregmin、acregmax、acdirmin 和 acdirmax 全部设置为相同的值。
- acregmin=n,NFS 客户端在从服务器请求新属性信息之前缓存常规文件属性的最短时间(以秒为单位)。如果未指定此选项,NFS 客户端将使用 3 秒的最低时间。
- acregmax=n,NFS 客户端在从服务器请求新属性信息之前缓存常规文件属性的最长时间(以秒为单位)。如果未指定此选项,NFS 客户端将使用 60 秒的最大值。
- acdirmin=n,NFS 客户端在从服务器请求新属性信息之前缓存目录属性的最短时间(以秒为单位)。如果未指定此选项,NFS 客户端
将使用 30 秒的最低时间。- acdirmax=n,NFS 客户端在从服务器请求新属性信息之前缓存目录属性的最长时间(以秒为单位)。如果未指定此选项,NFS 客户端
将使用 60 秒的最大值。
摘自NFS 手册页。
我希望这会有所帮助。
答案2
您只需设置 acdirmax=1。默认情况下,NFS 挂载使用 Close-To-Open 缓存一致性。这意味着每次打开文件时,它都会检查文件的修改时间和权限,而不管缓存数据如何。如果您将新文件添加到目录或用新版本覆盖文件,则会出现问题。
当服务器 A 上的文件被覆盖时,服务器 B 刚读取同一目录,服务器 B 上的查找缓存将保存这些文件的旧副本。因此,当我们尝试访问文件的属性时,它将向文件服务器发送请求,但它将使用存储在缓存中的文件句柄,即使它已被具有不同句柄的新文件替换。由于具有旧句柄的文件已消失,它将报告“文件未找到”
因此,解决此问题的方法是使特定目录的查找缓存无效。完全禁用查找缓存不是一个选项,因为它会使文件服务器因 NFS 请求而过载。查找缓存通过检查包含文件的目录的时间戳来检查缓存是否仍然有效。如果这是在属性缓存中,它将从缓存中使用它。因此,要解决您的问题,您应该确保特定于目录的属性缓存具有尽可能短的缓存时间。
这可以使用 mountoptions 来完成:acdirmax=1
答案3
您指定了许多 NFS 选项,其中大多数(rsize
/ wsize
/ soft
)都不需要,因为它们(通常)已经是默认选项(在 Linux 中);
NFS 挂载选项
rsize=32768,wsize=32768,timeo=30,retrans=10,intr,noatime,soft,async,nodev
但是,如果您正在运行 Linux,您可能应该考虑设置以下 NFS 选项;
actimeo=3
(设置 acreg[max|min]、acdir[max|min],如果仍然遇到速度问题,可以将其降低至 1)
lookupcache=none
(完全忽略缓存,默认为“全部”)
noac
(禁用属性缓存)
这博客文章似乎有更多信息