【发布时间】:2009-04-21 07:33:26
【问题描述】:
我正在开发一个相当大的经典 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(低碎片堆),在 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,但这篇文章是法语的。你现在必须学习我们美丽的语言!)
【问题讨论】:
标签: sql-server performance asp-classic iis-6 freeze