Коллеги, может кто-либо сможет оценить ситуацию!
Исходная информация:
1. В локальной сети на одном из серверов работает программа, которая в том числе непрерывно пишет информацию в бинарный файл фиксированного размера.
2. На каждом из узлов в сети может запускаться программа-клиент (количество одновременно работающих может превышать 100), которая читает информацию из того самого бинарного файла с «расшаренного» ресурса сервера
Описание проблемы:
1. У «клиентов» никогда не было проблем с чтением этого файла, пока сервер был физически отдельной рабочей станцией с ОС Windows Server 2000.
2. После того как сервер «перевели» на виртуальную машину с ОС Windows Server 2016 начались необъяснимые (как минимум для меня) проблемы - у отдельных клиентов при чтении информации из файла считываются не реальные (измененные) данные, а данные, «замерзшие» на какой то момент времени (такое впечатление, что ОС кеширует файл). При этом:
- на этом «проблемном» узле атрибуты времени изменения у файла (TSearchRec.Time или просто информация из проводника) меняются
- на этом «проблемном» узле пробую открыть файл стандартными средствами (notepad etc) - видно, что данные не меняются
- у других клиентов в сети данные в файле в тот же момент времени меняются
Программа на сервере пишет информацию в файл с помощью стандартного FileStream
Программы-клиенты читают информацию из файла с помощью стандартного FileStream
Не сталкивались ли Вы с чем-либо подобным? Как боролись?
Подскажите куда «копать»?
>>>…у отдельных клиентов при чтении информации из файла считываются не реальные (изменённые) данные, а данные, «замёрзшие» на какой-то момент времени (такое впечатление, что ОС кеширует файл).
Вероятнее всего так оно и есть. ОС кеширует файл.
>>>Не сталкивались ли Вы с чем-либо подобным?
На мой взгляд, это проблема "файл-серверной" архитектуры доступа к данным.
Доступ к данным посредством Файла - это некоторое упрощение, при котором, вы как бы забываете о способе обмена данными между поставщиком и потребителем данных. Другими словами, вы вообще забываете о "сетевой архитектуре" вашей программки. "Сетевую архитектуру программки" подменяет "сетевая архитектура файловой системы".
Говорят, такой подход можно использовать в простейших случаях, когда скорость обновления данных невелика и "собственные задачи файловой системы" на слишком сильно влияют на критичность и скорость получения данных (блокировка, кэширование, задержки обслуживания и т.д.). Он позволяет сильно упростить программку и сократить на её разработке. Но только до тех пор, пока требования к "сетевому обмену данными программки" не превышают "сетевых возможностей файловой системы".
>>>Как боролись?
Использовать "клиент-серверную архитектуру".
1. Разработать программки сервера и клиента, обменивающихся данными посредством "сокетов".
Не поверите, но доступ к данным через "сокеты" был разработан, как сетевой аналог доступа через "файлы".
2. Использовать "сервер баз данных".
В этом случае, "сервер БД" может выступить единственным сетевых ресурсом данных. Вам остаётся разработать, одну программку, заливающую данные на сервер и вторую - забирающую данные с сервера БД.
>>>Подскажите куда «копать»?
Уточните вопрос. Вы хотите спросить: "Как отключить кэширование ОС"? |
|