【问题标题】:Reading file from linux samba share and caching从 linux samba 共享和缓存中读取文件
【发布时间】:2016-09-22 06:28:04
【问题描述】:

有两种类似的设置:

  1. Ubuntu 16.04 服务器,其中包含共享文件夹 \\linux\data 和文件 test.txt (Samba 4.3.9-Ubuntu)
  2. Windows Server 2012 服务器,其中包含共享文件夹 \\win\data 和文件 test.txt

还有另一台 PC (Win 7) 和一个 C# 测试程序,可以像这样循环读取上述任一设置中的文件内容:

  1. 读取文件,记住数据大小
  2. 等待 500 毫秒
  3. 再次读取文件,如果大小发生变化 - 打印出大小以及该文件末尾的几个字节内容,更新存储的大小
  4. 转到 2。

现在当我使用设置#1(win share)运行测试时 - 如果我在服务器上打开文件,修改内容并保存 - 我可以立即看到测试程序中的反应 - 文件修改后的第一次循环迭代带来me 新文件大小和新数据。

但是,当我使用设置 #2(ubuntu 共享)运行相同的测试时 - 直到经过一段时间后,我才能在测试程序中看到修改后的大小或内容(该时间取决于我用来读取文件的方法内容。使用 FileStream 大约是 10 秒,使用 File.ReadAllBytes 大约是 30 秒到 10 分钟)。

设置 #2 的一个有趣注意事项 - 如果我在 Ubuntu 中修改文件,然后转到测试 PC(测试程序现在正在循环,试图获取更新的文件内容)并使用记事本打开共享文件 - 测试程序立即获取更新的内容。

对我来说,它看起来像是测试机器上的客户端缓存。我唯一能想到的是 Win Server 2012 使用 SMB3 和 Ubuntu - SMB2_10,这以某种方式迫使客户端(测试阅读器部分)以不同的方式运行。

我不是 linux 专家,据我了解,无法在 Ubuntu 中启用 SMB3 协议(它可以用作 SMB3 客户端,但不能用作服务器)

所以问题是如何强制客户端(Win 7)在没有缓存的情况下读取,无论服务器类型和协议版本如何,或者,如果不可能 - 如何使用记事本从 C# 代码打开文件中模仿,这显然给它一个刺激并迫使所有读者获得更新的内容。

【问题讨论】:

    标签: c# linux file caching samba


    【解决方案1】:

    找出在 linux samba 配置 (smb.conf) 中禁用机会锁 (oplocks) 会有所帮助。

    在客户端计算机上禁用 OpLocks 后,测试程序会在没有缓存的情况下获取更新的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2022-11-10
      • 2010-10-24
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多