Утечка памяти при использовании SQL FileStream - PullRequest
2 голосов
/ 20 января 2010

У меня есть приложение, которое использует SQL FILESTREAM для хранения изображений. Я вставляю LOT изображений (несколько миллионов изображений в день).

Через некоторое время машина перестает отвечать и кажется, что ей не хватает памяти ... Глядя на использование памяти ПК, мы не видим ни одного процесса, занимающего много памяти (ни SQL, ни наше приложение). Мы попытались убить наш процесс, но он не восстановил нашу машину ... Затем мы убили службы SQL, и он не восстановил систему. В крайнем случае, мы даже убили все процессы (кроме системных), а память все еще оставалась высокой (мы смотрим на вкладку производительности диспетчера задач). Только перезагрузка делает работу в этот момент. Мы пробовали на Win7, WinXP, Win2K3 server всегда одинаковые результаты.

К сожалению, это не разовая сделка, это происходит каждый раз.

Кто-нибудь видел такое поведение раньше? Мы делаем что-то не так, используя SQL FILESTREAMS?

1 Ответ

4 голосов
/ 21 января 2010

Вы говорите, что вставляете много изображений в день. Что еще вы делаете с изображениями? Вы их обновляете, много читает?

Оптимизирована ли ваша файловая система для FILESTREAMs?

Как вы считываете изображения?

Если вы делаете много обновлений, помните, что SQL Server не будет изменять объект файлового потока, но создаст новый и пометит старый для удаления сборщиком мусора. Через некоторое время GC сработает и начнет убирать старый беспорядок. Проблема с FILESTREAM заключается в том, что он не регистрирует много в журнале транзакций, и, следовательно, сборщик мусора может быть серьезно задержан. Если это проблема, ее можно решить, заставляя GC чаще поддерживать отзывчивость. Это можно сделать с помощью оператора CHECKPOINT .

ОБНОВЛЕНИЕ: Вы не должны использовать FILESTREAM для небольших файлов (менее 1 МБ). Миллионы маленьких файлов вызовут проблемы для файловой системы и главной таблицы файлов. Используйте varbinary вместо. См. Также Проектирование и внедрение хранилища FILESTREAM

ОБНОВЛЕНИЕ 2: Если вы все еще настаиваете на использовании FILESTREAM для хранения (вы не должны использовать большие объемы небольших файлов), вы должны как минимум настроить файловую систему соответствующим образом.

Оптимизируйте файловую систему для большого количества маленьких файлов (используйте их в качестве советов и убедитесь, что вы понимаете, что они делают, прежде чем применять)

  • Изменить таблицу основных файлов максимальное резервирование в реестре (поведение FSUTIL.exe установлено mftzone 4)
  • Отключить 8.3 имен файлов (fsutil.exe Поведение установлено отключить8dot3 1)
  • Отключить последнее обновление доступа (fsutil.exe поведение установлено disablelastaccess 1)
  • Перезагрузитесь и создайте новый раздел
  • Отформатируйте тома хранения, используя размер блока, который будет соответствовать большинству файлы (2к или 4к в зависимости от вас файлы изображений).
...