使用SQL FileStream进行内存泄漏

时间:2010-01-20 20:31:50

标签: sql-server sql-server-2008 memory filestream

我有一个使用SQL FILESTREAM来存储图像的应用程序。我插入了 LOT 图像(每天数百万张图片)。

过了一会儿,机器停止响应并且似乎内存不足...看看PC的内存使用情况,我们看不到任何进程占用大量内存(SQL或我们的应用程序)。我们试图杀死我们的进程并且它没有恢复我们的机器......然后我们杀死了SQL服务并且它没有恢复到系统。作为最后的手段,我们甚至杀死了所有进程(系统除外)并且内存仍然很高(我们正在查看任务管理器的性能选项卡)。此时只有重新启动才能完成工作。我们尝试过Win7,WinXP,Win2K3服务器,结果总是一样。

不幸的是,这不是一次性的交易,每次都会发生。

以前有人见过这种行为吗?我们是否使用SQL FILESTREAMS做错了什么?

1 个答案:

答案 0 :(得分:4)

你说你每天插入很多图像。你还对图像做了什么?你更新它们,很多读物?

您的文件系统是否针对FILESTREAM进行了优化?

你如何读出图像?

如果您进行了大量更新,请记住SQL Server不会修改文件流对象,而是创建一个新文件,并将旧标记对象标记为垃圾收集器。在某些时候,GC将触发并开始清理旧的混乱。 FILESTREAM的问题在于它不会将大量日志记录到事务日志中,因此GC可能会严重延迟。如果这是问题,可以通过更频繁地强制GC来维持响应性来解决。这可以使用CHECKPOINT语句完成。

更新:您不应将FILESTREAM用于小文件(小于1 MB)。数百万个小文件将导致文件系统和主文件表出现问题。请使用varbinary。另请参阅Designing and implementing FILESTREAM storage

更新2:如果您仍然坚持使用FILESTREAM进行存储(您不应该使用大量小文件),则必须至少相应地配置文件系统。

针对大量小文件优化文件系统(使用这些作为提示,并确保在申请之前了解他们的操作)

  • 更改主文件表 在注册表中保留最大值(FSUTIL.exe行为设置mftzone 4)
  • 禁用8.3文件名(fsutil.exe行为设置disable8dot3 1)
  • 禁用上次访问更新(fsutil.exe行为设置disablelastaccess 1)
  • 重新启动并创建新分区
  • 使用a格式化存储卷 块大小适合大多数 文件(2k或4k取决于你 图像文件)。