我正在开发一个相当大的经典 asp / SQL Server 应用程序。几个月前推出了一个新版本,其中包含许多新功能,我一定有一个非常讨厌的错误:一些非常基本的页面随机需要很长时间才能执行。
一些线索:
- 它不是数据库:当我运行查询分析器时,它没有检测到任何长时间运行的查询
- 当我启动 IIS 诊断工具时,reqviewer 显示请求处于“处理中”状态
- 这可能发生在任何页面上
- 我不能轻易复制它,它完全是随机的。
- 有一个“很长一段时间”的想法:今天早上我有一个页面需要超过 5 分钟才能执行,通常应该在 100 毫秒内返回给客户端。
- 该应用程序可以处理相当大的文件上传和下载(最大 2 GB)。这也通过使用 SoftArtisan FileUp 的经典 asp 脚本进行处理。不要认为它会导致问题,我们已经上传了很长一段时间了。
- 我在两个单独的服务器上遇到了问题(在两个不同的位置,具有不同的数据集)。一个是使用良好的 SQL Server 2000 运行应用程序,另一个运行 SQL Server 2005。在这两种情况下,Web 服务器都是 IIS 6。
知道问题是什么或如何解决这类问题吗?
谢谢。
塞巴斯蒂安
编辑 :
问题来自内存碎片。一些asp页面用于从服务器下载文件。文件大小可以从几 kb 到超过 2 gb。这些大小的变化会导致内存碎片。asp 页面也可能需要相当长的时间来执行(用户下载页面的时间减去 IIS 级别缓存中的内容),这对于应该快速执行的服务器页面来说并不是真正的标准。
这就是我为改善事情所做的:
- 将所有下载逻辑放在一个单独的 asp 页面中,并关闭会话
- 这使我可以将该 asp 页面放在可以经常回收的特定池中(现在下载不会再干扰应用程序的其余部分)
- 开启 LFH(Low Fragmention Heap),在 Windows 2003 上默认不开启,以减少内存碎片
LFH 的参考资料:
- http://msdn.microsoft.com/en-us/library/aa366750(v=vs.85).aspx
- http://blogs.msdn.com/b/friis/archive/2008/10/14/fragmentation-m-moire-sous-iis-6.aspx(那里有一个 dll 可以用来打开 LFH,但这篇文章是法语的。你现在必须学习我们美丽的语言!)