cifs mount 在频繁读取文件时返回输入/输出错误

cifs mount 在频繁读取文件时返回输入/输出错误

我在 vmware 虚拟机上使用 ubuntu 来测试我的 php 项目。我在那里安装了 nginx、php7.0-fpm、mysql。

我的共享位于 Windows 10 上,并使用 cifs 和 fstab 安装到虚拟机:

//192.168.100.1/projects  /mnt/projects cifs   credentials=/home/magic/.smbcredentials,cache=none,file_mode=0777,dir_mode=0777,noperm,rsize=16384,wsize=16384,noacl,sec=ntlm,nobrl  0 0

大多数情况下它工作得很好。但在大型项目中,需要读取许多文件进行编译,我在 php 脚本运行时遇到了输入/输出错误:

Warning: include(/mnt/projects/magento2/magento2/vendor/magento/framework/Component/ComponentRegistrarInterface.php): failed to open stream: Input/output error in /mnt/projects/magento2/magento2/vendor/composer/ClassLoader.php on line 444

每次链接到随机文件时都会出错。通常,当有多个请求到达 php-fpm 时会发生此问题。例如

  1. 第一个请求是编译源代码并读取文件
  2. 第二个进程并行启动,这意味着 php 启动第二个进程,可以读取相同的文件
  3. 编译过程在上述两个过程中的随机阶段均失败

当没有并发 php 请求时,不会发生此问题。因此,当只有单个请求时,php 成功完成编译工作。(这种情况并不常见,但在单个请求中也会发生错误)

它的行为就像是来自网络级别的错误。当检测到新的文件读取请求时,某些东西会终止文件读取进程。

我正在研究 samba 配置、cifs 配置。升级到最新版本的 cifs-utils 和 samba。但仍然没有成功。

我所能做的只是将 php fpm 进程限制为 1。这不是一个好的决定,因为即使只有一个子进程,错误有时也会发生。

有什么办法可以找出导致此问题的原因或者解决此问题?

答案1

我通过指定协议版本 2.0 解决了类似的问题

mount -t cifs -o username=user,password=passwd,vers=2.0 /host/shared /mnt/project

Windows 操作系统使用了多个不同版本的 SMB:

  • CIFS – SMB 的古老版本,是 1996 年 Microsoft Windows NT 4.0 的一部分。SMB1 取代了此版本。
  • SMB 1.0(或 SMB1)– Windows 2000、Windows XP、Windows Server 2003 和
  • SMB 2.0 – Windows Vista(SP1 或更高版本)和 Windows Server 2008 中使用的版本
  • SMB 2.1(或 SMB2.1)– Windows 7 和 Windows Server 2008 R2 中使用的版本
  • SMB 3.0(或 SMB3)– Windows 8 和 Windows Server 2012 中使用的版本

相关内容