我在 ESXi 5.5 服务器上以虚拟机的形式运行 Ubuntu 12.04 LTS 机器。我有两个不同的 CIFS 挂载,一个在 Windows 2008 R2 服务器上,另一个在 Windows 2012 R2 服务器上。我在 /etc/fstab 中使用 noauto 开关设置了挂载,并通过 /etc/rc.local 调用挂载命令(fstab 处理速度不够快,我的 MythTV DVR 无法使用目录,因此我选择了 rc.local 路由)。我的网络正在运行 Active Directory 域,我正在以域用户身份进行身份验证。
我发现两个 Windows 服务器通过 CIFS 传输时的性能都很差。两个方向的速度都不超过 5MB/秒,通常约为 1MB/秒甚至更慢。在我的任何一台 Windows 机器上运行 iperf 都会返回 98MB/秒的速率,所以我知道这不是网络问题。
有趣的是:如果我卸载 cifs 挂载,然后通过 GUI 挂载它们(浏览网络等,进行身份验证),网络速度会呈指数级增长 - 50MB/秒甚至更高。如果我卸载然后运行 rc.local 中的挂载命令,流量会再次变得非常慢。
有人能解释一下为什么这两种方法会产生如此不同的结果吗?我将在下面粘贴相关文件中的代码。提前致谢。
smb.conf 挂载点:
//192.168.2.93/mythtv /var/lib/mythtv/recordings3 cifs rw,user=xxxx,password=xxxx,noauto,uid=104,gid=106,file_mode=0755,dir_mode=0775 0 0
//192.168.2.91/mythtv /var/lib/mythtv/recordings4 cifs rw,user=xxxx,password=xxxx,noauto,uid=104,gid=106,file_mode=0755,dir_mode=0775 0 0
我的 smb.conf 的全局设置,包括我在故障排除时所做的套接字选项:
[global]
workgroup = MYAWESOMEWORKGROUP
server string = %h server (Samba, Mythbuntu)
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 1
panic action = /usr/share/samba/panic-action %d
dns proxy = no
security = share
max protocol = NT1
socket options = TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536 SO_KEEPALIVE
follow symlinks = yes
wide links = yes
unix extensions = no
最后,/etc/rc.local 中的行:
mount /var/lib/mythtv/recordings3
mount /var/lib/mythtv/recordings4
更新:我进行了更多的挖掘并发现了更多细节,但仍然没有任何方法可以解决这个问题。
看起来引擎盖下的 GUI 安装使用了 GVFS。我发现了其他几篇帖子,其中有人遇到了类似的问题。其中一些人遇到了完全相反的问题,即文件传输在 GVFS 中很慢,但在 CIFS 中却很快。
使用 GVFS 将文件传输到我的 Server 2008 R2 机器比我想象的要快一些,但没有什么值得兴奋的 - 大约 25MB/秒。因此,似乎最大的问题出在我的 Windows 2012 R2 机器上(仍然低于 1MB/秒)。我一直从 Windows 的角度看待问题,并禁用了 SMB 签名,但行为没有任何变化。我还注意到 2012 服务器正在运行 SMB 3.02,而我的 Linux 机器上的 Samba 版本不支持高于 SMB 2 的版本。我尝试强制 Windows 使用 SMB 2,但没有任何好处。
我还注意到 etc/fstab 设置和 /proc/mounts 中的结果之间存在一个有趣的差异 - 我一直在摆弄 fstab 中的 rsize 参数,并注意到 /proc/mounts 并不总是正确反映更改。如果未设置任何内容,我的 CIFS 挂载将显示在 rsize=16384 的挂载中。如果我将 rsize 更改为 4096,它会正确显示。但如果我尝试任何高于 16384 的值,挂载中的 rsize 会更改为 2048。为什么会这样?我应该使用什么 rsize,gvfs 使用什么大小?
值得一提的是,通过 cifs 复制的所有文件都是非常大的 1080p 录音(从 1GB 到 30GB),并且目标机器驱动器的格式化为 Server 2012 R2 允许的最大集群大小。
更新 2:好吧,我已经想出了如何让它/几乎/可用。经过大量研究,我发现我可以向 /etc/modprobe.d 添加一个 cifs.conf 文件,其中包含以下内容:
options cifs CIFSMaxBufSize=130048
添加该文件后,我的 /proc/mounts 文件显示 cifs 安装中的缓冲区大小有所增加,我的系统几乎可以正常工作。我说几乎是因为现在如果系统没有执行任何其他操作,我实际上可以流式传输 DVR 录制内容,并且文件复制的传输速率高达几 MB/秒。