请注意,我从这个复制这个问题,因为了解,ServerFault是这样的问题更好的地方( https://stackoverflow.com/questions/5159220 )
你好
我们面对非常奇怪的问题,使我们疯了。 有时我们的文件共享PC上新创build的文件在一段时间内“缺席”。 重现一个问题,你至less应该有两台电脑,称之为alpha和beta 。 在beta PC上创build文件共享( \\beta\share\bug )并从alpha PC运行这个PowerShell脚本:
param( $sharePath="\\beta\share\bug" ) $sharePC = ($sharePath -split '\\')[2] $session = New-PSSession -ComputerName $sharePC $counter = 0 while ($true) { $fileName = $sharePath + "\$counter.txt" Invoke-Command -Session $session -ScriptBlock { param( $fileName ) "" > $fileName } -ArgumentList $fileName if (Test-Path $fileName) { Write-Host "File $fileName exists" -fore Green } else { Write-Host "!!! File $fileName does NOT exist!" -fore Red } $counter = $counter + 1 Start-Sleep 2 }
启动这个脚本后,你应该可以看到这些消息:
File \\beta\share\bug\1.txt exists File \\beta\share\bug\2.txt exists ...
现在 :打开cmd.exe并运行以下命令:
if exist \\beta\share\bug\foo.txt echo 1
在此之后,您将在大约10秒钟后看到以下消息:
!!! File \\beta\share\bug\3.txt does NOT exist! !!! File \\beta\share\bug\4.txt does NOT exist!
我们发现这个错误是由枚举创build新文件的共享目录引起的。 在Python调用os.listdir('//beta/share/bug')来重现一个bug。 在C# : Directory.GetDirectories(@"\\beta\share\bug") 。 你甚至可以简单地导航到shell共享目录,并调用ls或dir 。
在Windows Server 2008 R2上发现了错误。 Bug也可以在Windows 7上重现(在两个操作系统上都安装了SMB 2.0 )
请注意,您不能在Windows资源pipe理器中实时查看alpha PC上的目录内容,因为如果您在资源pipe理器中打开此目录,则不会发生错误! 因此,确保在尝试重现错误之前closures所有这些窗口。 每个脚本重新启动后,你应该手动删除所有已经创build的共享文件(因为脚本是相当愚蠢的,总是从0.txt开始)。
我们目前对这个问题有两个解决方法:
有没有人发现类似的问题,可以解释为什么会发生,以及如何“正确地解决”?
谢谢
我们目前的解决scheme正常工作:禁用SMB 2.0( http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm )
如果您不想降级smb服务的性能,请在您的smb客户端上修改以下registry设置。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Lanmanworkstation\Parameters
将DirectoryCacheLifetime , FileNotFoundCacheLifetime和FileInfoCacheLifetime为0。
修复在这里和这里概述。