看来我无法“并行访问”托管在我的 Raspberry PI 上的文件系统。
这是我的设置:
NFS 服务器:
- 带有 Debian GNU/Linux 11 的 Raspberry Pi 4(靶心)。
- /etc/exports:/mnt/DataBackupNAS *(rw,async,no_root_squash,no_subtree_check)
NFS 客户端:
- 带有 Ubuntu Jammy Jellyfish 的桌面。
- /etc/fstab:raspberrypi:/mnt/DataBackupNAS /media/laurent/DataBackupNAS nfs noatime,_netdev,nofail,nolock,async
重现步骤:
- 将大文件从 NFS 客户端复制到 Raspberry。
- 在复制完成之前,尝试使用 Nautilus 浏览到另一个目录或从命令行“ls”一个目录。
预期的:列出目录。
观察到的:“ls”命令卡住了。Nautilus 一直处于等待状态,直到复制完成。
笔记:
- Windows 客户机似乎没问题:我可以浏览 Raspberry NAS,甚至可以同时“交叉复制”大文件。一切都响应迅速。因此问题似乎更多与 Ubuntu/挂载选项有关。
- 在复制过程中,在 Raspberry 上通过 SSH 执行“ls”是可行的。
- 我已经尝试过这些事情,但目前还没有成功:
- 在服务器和客户端上设置异步模式。“异步”应该是最好的选择,因为 NFS 文档指出操作在“同步”模式下按顺序执行?
- 增加客户端的 rsize 和 wsize。
- 将服务器上的 RPCNFSDCOUNT 增加到 16,而不是 8。
除此之外,一切都很好。与我的互联网提供商 NAS 相比,复制操作相当快且可靠,只是在复制完成之前我无法在服务器上执行任何其他操作。
编辑: 当我通过 SSH 进入 Raspberry 并在“大文件”复制运行时执行一些 ls 甚至内部复制操作时,Raspberry 仍然反应灵敏。
如果我理解正确的话,rpcnfsdcount 是一个服务器端参数,它定义专用于 NFS 的线程数,所以它应该使服务器响应更快?
将 rsize wsize 降低到 1 不会改变任何东西。所有内容都完全停留在 Ubuntu 客户端上,直到复制结束。
由于 Windows 上的一切都响应迅速,我猜测这更可能是挂载参数问题......
我还注意到,如果在命令行上发出复制操作,则 Ctrl+C 无法中断该操作。如果我将同一个大文件复制到另一个本地磁盘,Ctrl+C 可以正常工作。这有关系吗?
答案1
好的,通过使用这些挂载选项挂载解决了问题(Raspberry 方面没有变化):
raspberrypi:/mnt/DataBackupNAS /media/laurent/DataBackupNAS nfs vers=4,sync 0 0
因此必须明确启用同步(这有点令人惊讶,我期望异步能够提供更多的反应性!)。
Nautilus 和 ls 命令现在几乎可以立即刷新,并且可以使用 Ctrl+C 中断 cp 命令。
@Terrance:谢谢你的建议,这也是我的第一个想法,但在使用命令行(cp 和 ls 列出)时也发生了这个问题。