Обратите внимание, я скопировал этот вопрос из SO, потому что понял, что ServerFault - лучшее место для такого рода вопросов (https://stackoverflow.com/questions/5159220)
Привет
Мы столкнулись с очень странной проблемой, которая сводила нас с ума. Иногда вновь созданные файлы на нашем компьютере с файловым хранилищем «отсутствовали» в течение некоторого периода времени. Для воспроизведения проблемы у вас должно быть как минимум два компьютера, назовите их alpha
и beta
. Создать файловую папку на beta
ПК (\\beta\share\bug
) и запустите этот сценарий PowerShell из alpha
ПК:
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!
Мы обнаружили, что ошибка вызвана перечислением общего каталога, в котором создаются новые файлы. В Python
вызов os.listdir('//beta/share/bug')
воспроизвести ошибку. В C#
: Directory.GetDirectories(@"\\beta\share\bug")
. Вы даже можете просто перейти к общему каталогу с помощью оболочки и вызвать ls
или dir
.
Ошибка была обнаружена на Windows Server 2008 R2
. Ошибка также может быть воспроизведена на Windows 7
(на обеих ОС SMB 2.0
установлен)
Обратите внимание, что вы не можете смотреть содержимое каталога на alpha
ПК в проводнике Windows в режиме реального времени, потому что если вы откроете этот каталог в проводнике, ошибка не возникнет! Поэтому убедитесь, что все такие окна закрыты, прежде чем пытаться воспроизвести ошибку. После каждого перезапуска скрипта вы должны вручную удалить все уже созданные файлы из общего ресурса (потому что скрипт довольно глупый и всегда запускается с 0.txt).
В настоящее время у нас есть 2 способа решения этой проблемы:
Кто-нибудь когда-либо обнаруживал подобную проблему и может объяснить, почему она возникает и как ее «правильно исправить»?
Спасибо
Если вы не хотите снижать производительность своих служб smb, измените следующие параметры реестра на своем клиенте smb.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Lanmanworkstation\Parameters
устанавливать DirectoryCacheLifetime
, FileNotFoundCacheLifetime
и FileInfoCacheLifetime
до 0.
Наше текущее решение, которое просто работает: Отключить SMB 2.0 (http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm)