如何防止向 CIFS 写入连续数分钟?

rei*_*ost 8 linux cifs

当从 NetApp 文件管理器挂载 CIFS 文件系统并将几千兆字节的文件复制到其中时,复制过程经常会连续数分钟挂起。内核将消息写入系统日志,例如:

Nov 15 14:03:15 myclient kernel: [173570.048387] CIFS VFS: sends on sock ffff88003a2d4000 stuck for 15 seconds
Nov 15 14:03:15 myclient kernel: [173570.049115] CIFS VFS: Error -11 sending data on socket to server
Nov 15 19:01:22 myclient kernel: [191466.594088] CIFS VFS: Server myfileserver has not responded in 120 seconds. Reconnecting...
Run Code Online (Sandbox Code Playgroud)

在写简历之前,最后一条消息实际上可能会重复。当进程挂起时,它不能被杀死;即使尝试重新启动机器也会挂起。

服务器是NetApp,我还不知道它的规格。客户端是两台 Ubuntu 14.04 LTS 机器,其中一台是虚拟的(两者都发生)。它们的内核分别是 version3.5.0-54-generic3.13.0-68-generic

我有三个问题。

  1. 如果你见过这个问题,在哪个版本的 Linux 上?
  2. 这个问题怎么会首先发生?CIFS 文件系统支持不应该比不间断挂断更聪明吗?
  3. 哪些安装选项可以保证消除这个问题?

我的 fstab 条目如下所示(匿名):

//myfileserver/path/to/mydirectory /mnt/mydirectory cifs credentials=mycredentialsfile,rw,sec=ntlmv2,forceuid,forcegid,file_mode=0644,dir_mode=0755,noserverino,nounix,user,noauto 0 0
Run Code Online (Sandbox Code Playgroud)

添加cache=none并不能解决问题。添加directio也不是:man mount.cifs声称它是受支持的选项,但事实并非如此。什么出现来解决这个问题是增加wsize=4096wsize=8192:迄今为止,我的测试中没有表现出与这些选项拖延。(使用wsize=16384,仍然会发生停顿。)

我想了解正在发生的事情并以 100% 的确定性消除问题,而不仅仅是通过反复试验。你能告诉我为什么会发生这种情况或该怎么做吗?

(关于 Ask Ubuntu、Unix & Linux 和 ServerFault 的几个问题已经发布,看起来像这个问题,但大多数不是:他们抱怨在读取文件或文件系统空闲时停顿,而在我的情况下,这从不发生,仅在写入文件时才会发生停顿)

Rui*_*iro 6

默认情况下,cifs 挂载使用协议 1.0,除了过时之外,它在很大程度上效率低下,并且由于多种原因无法从睡眠中很好地恢复。

根据您的服务器技术,您可以vers=2.1至少使用vers=3.0.

我建议与文档或供应商核对它支持的 SMB 协议版本,或者至少使用3.0并咨询mount命令的输出以查看协商版本。

更改为更新的 CIFS 版本协议应该可以解决部分或全部停顿问题,并为您提供更高效的传输速度。

有关详细信息,请参阅CIFS 随机丢失与 Windows 共享的连接的相关问题。

请注意,延迟会有所改善,但在复制大文件时不会消失。这种行为是一个特性,例如文件进入缓冲区,文件系统等待服务器通知复制已成功完成。