语境
我们想在 II6.0/7.0 上部署一个仅供内联网使用的网站。该网站具有典型的三层架构。中间层作为应用程序服务器部署在与 IIS 相同的计算机上。在工作进程中运行的 asp.net 代码调用应用程序服务器,然后应用程序服务器连接到数据库以获取数据。
我们正在使用 Load Runner 进行负载测试,并观察到了一些问题。即使对于 20 个并发用户测试,IIS 也会以非常随机的方式给出 401、500 和超时错误。问题非常随机。有时对更多用户的测试成功而没有任何错误,但对少数用户的测试失败。IIS 行为不可预测。
服务器计算机详细信息(应用程序服务器 + IIS)
1) 双处理器四核 2) 8 GB RAM
问题
- 是否需要调整某些 IIS 参数来支持最多 250 个并发用户?
- asp.net代码可能有问题吗?
- 解决上述问题的策略应该是什么?
答案1
如果您的应用程序在 20 个并发用户的情况下举步维艰,而且它并没有执行像工业强度的数字运算这样非常密集的任务,我倾向于猜测,问题出在代码上,而不是 IIS 上。
我的第一个建议是检查代码库是否存在不良设计/逻辑,优化数据库和数据访问例程,看看是否有任何效果。您可以尝试使用 Resharper 或类似工具来帮助您完成此操作。
答案2
我倾向于责怪 asp.net 代码。IIS 应该可以轻而易举地为 250 位用户提供服务。
无论哪种方式,1)打开自定义错误以查找应用程序中出现故障的确切位置。2)附加调试器并查看哪里出现超时或不返回的循环。
我会将此视为对超时错误的简单故障排除,而不是对配置问题进行调整。
不可预测的事实也并不意味着 IIS 存在问题......它可能意味着错误依赖于某些共享资源或某些不确定的代码路径。
答案3
两个词:服务器缓存。
分析您的应用程序,看看什么可以在哪个级别缓存,从 Asp.Net 的页面输出缓存开始,深入到各个层,根据需要在每个层中添加缓存。找到您的瓶颈,并问问自己需要多久调用一次该过程。这些数据对于每个用户来说都是唯一的吗?如果不是,则将其缓存一次,并将缓存的值用于后续请求。数据是否只在特定时间更改?如果是,请获取一次并将缓存设置为在该时间过期。我可以向您保证,仅此一项就能显著提高您的能力。
由于硬件本身的限制,250 个并发用户的应用程序在单个机器上动态生成未缓存的页面内容是一个相当高的要求。管道就这么大,如果没有缓存,很快就会填满它们。
答案4
使用 ANTS 分析器查找代码中最慢的行。另外,增加允许的线程数,我认为是在 web.config 中。也许还可以增加超时,并从 SQL 代码中删除函数(例如 getdate)尤其是表值函数。例如,如果您在视图中确实需要一个函数,请使用 ODBC 转义序列,例如 {fn curdate()},因为 ODBC 函数是规范函数(可索引),而普通 SQL 服务器函数是非确定性的(不可索引)。