Назад | Перейти на главную страницу

Файловый ресурс Windows: почему иногда вновь созданные файлы не отображаются в течение некоторого времени?

Обратите внимание, я скопировал этот вопрос из 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 способа решения этой проблемы:

  1. Если клиент видит эту ситуацию, он создает временный файл в проблемном каталоге - после этого файлы волшебным образом появляются.
  2. Отключить SMB 2.0: http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm

Кто-нибудь когда-либо обнаруживал подобную проблему и может объяснить, почему она возникает и как ее «правильно исправить»?

Спасибо

Если вы не хотите снижать производительность своих служб 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)