当从 NetApp 文件管理器挂载 CIFS 文件系统并将几 GB 的文件复制到其中时,复制过程经常会挂起几分钟。内核将消息写入系统日志,如下所示:
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...
事实上,最后一条消息可能会在继续写入之前重复。当进程挂起时,无法将其杀死;即使尝试重新启动机器也会挂起。
服务器是NetApp的,我还不知道它的规格。客户端是两台 Ubuntu 14.04 LTS 机器,其中一台是虚拟的(两台机器上都会发生这种情况)。它们的内核分别是版本3.5.0-54-generic
和3.13.0-68-generic
。
我有三个问题。
- 如果您曾经在哪个版本的 Linux 上遇到过这个问题?
- 首先这个问题怎么会发生呢? CIFS 文件系统支持难道不应该比不间断挂断更智能吗?
- 哪些安装选项可以保证消除此问题?
我的 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
添加并cache=none
不能解决问题。添加directio
也不行:man mount.cifs
声称它是受支持的选项,但事实并非如此。什么做似乎可以解决问题的是添加wsize=4096
或wsize=8192
:到目前为止,我的测试表明这些选项没有停滞。 (使用 时wsize=16384
,仍然会发生停顿。)
我不想只是通过反复试验,而是想了解正在发生的事情并百分百确定地消除问题。你能告诉我为什么会发生这种情况或者该怎么办吗?
(在 Ask Ubuntu、Unix & Linux 和 ServerFault 上已经发布了几个看起来像这个问题的问题,但大多数都不是:他们抱怨在阅读文件或文件系统上闲置的,而就我而言,这种情况永远不会发生,只有在以下情况下才会发生停顿写作文件)
答案1
默认情况下,cifs 安装使用协议 1.0,该协议除了过时之外,效率也很低,并且由于多种原因不能很好地从睡眠中恢复。
根据您的服务器技术,您vers=2.1
至少可以使用 或vers=3.0
。
我建议检查文档或供应商支持哪个版本的 SMB 协议,或者至少使用3.0
和查阅命令的输出mount
来查看协商的版本。
更改为更新的 CIFS 版本协议应该可以解决部分或全部停顿问题,并为您提供更高效的传输速度。
请查看相关问题CIFS 随机丢失与 Windows 共享的连接更多细节。
请注意,停顿会改善,但在复制大文件时不会消失。该行为是一个功能,例如文件进入缓冲区,文件系统等待服务器通知复制已成功完成。