提高性能的最佳方法(并以某种方式包括故障转移)

时间:2009-08-21 10:32:05

标签: asp.net sql windows iis

我们有一个运行的应用程序,其中IIS和SQL在同一台机器上。它是一个Windows2003标准服务器,在VM上运行4GB内存。

现在用户数量不断增加。还有一些巨大的统计数据,可以由用户运行,但对其他用户的性能影响很大。所以我们需要以某种方式提高性能。

我想在每台机器上使用windows2008 64位和至少6 GB内存的2台不同机器上分离IIS和SQL,但它也应该有一个故障转移解决方案。

您能否就如何解决性能和故障转移问题推荐一些方案?

由于

ps:

仅供参考:我们现在在IIS中使用inproc状态管理,但我认为更改为sqlstatemanagement会更好。

修改

我已将问题扩展到故障转移的程度。因为我们的客户不想在服务器和SQL许可证上花太多钱。将复制到第二个SQL服务器并将其用作故障转移是否“可以”?你知道一些更好的“廉价”解决方案吗?

该应用程序仅供内部使用,但现在越来越多的部门参与此项目。

6 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

如果SQL Server是在机器上运行的“唯一”的东西,它总是效果最好。只需这样做,您将获得快速,简单和良好的好处。它似乎想控制一切,并且在它可以时总是更快乐:)

答案 2 :(得分:1)

听起来你真的在问你应该把数据库放在一台单独的机器上。这可能无法提高性能(实际上会随着延迟的增加而减少),但会提高可扩展性(我猜你真正需要它)。

表现<>可扩展性。

然而,更多的问题发挥作用 - 如果你没有足够的RAM性能可能会降低数据库在同一个盒子上 - SQL服务器喜欢使用RAM。

这就是为什么像TFS这样的东西使用SQL服务器,对于少数用户微软推荐它全部安装在一台机器上,但对于更多用户,微软建议数据库位于不同的服务器上。

你可以read about the deployment options for TFS here

切换SQL Server状态管理不会提高性能 - 它可能会降低性能,但您将获得其他好处(如可靠性)。

听起来你需要先了解性能瓶颈是什么。根据我的经验,这通常在数据库中。

您是否研究过标准的ASP.NET优化技术,如缓存? Microsoft提供的guidance on application tuning也可能对您有用。

在Web应用程序方案中使用SQL Server时,如果您使用的是SQL Server 2005及更高版本,则可能希望阅读Snapshot isolation。有时不使用它是Web应用程序中性能问题的原因。

答案 3 :(得分:1)

您必须在codeproject上参考这两篇关于ASP.Net性能调优的文章

<强> 1。 http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
2. http://www.codeproject.com/KB/aspnet/aspnetPerformance.aspx

我个人在我的asp.net应用程序中实现了这些技术,并且性能提升了30%以上。

此外,您可以参考this文章获取99.99%的正常运行时间。

第3。 http://www.codeproject.com/KB/aspnet/ProdArch.aspx

答案 4 :(得分:0)

分层可能会有所帮助。通常,为数据库调整机器是非常具体的,所以这是一个合理的第一次努力。

但是,如果你有两种用户活动,其中一种非常沉重,那么你总是会冒一些重度用户伤害其他人的风险。

您可以考虑两件事:

  1. 您可以采用“DataWarehouse”方法吗?从第一个开始有第二个DB涓流。新数据库是重度用户开展工作的地方。当然,他们的统计数据会略微过时,但这在概念上总是如此 - 当他们看到世界将要移动的答案时。
  2. 控制您在任何时候允许的统计信息数量。也许将它们作为“工作”提交到队列中。将它们作为低优先级运行。

答案 5 :(得分:0)

自然地将IIS和SQL服务器分开是第一步。 Sql server真的想拥有一台完整的机器。

第二件重要的事情是在运行时分析应用程序。在没有真实使用数据的情况下,永远不要尝试优化应用程序的性能,因为您可能只是花时间优化很少被调用的东西。我过去成功使用的一种技术是在global.asax中的Request_Begin中创建System.Diagnostics.Stopwatch,然后将其存储在上下文变量中

var sw = new Stopwatch();
sw.Start()
HttpContext.Current.Items["stopwatch"] = sw;

在Request_End中,您获得秒表agin

sw = HttpContext.Current.Items["stopwatch"];
sw.Stop();
Timespan ts = sw.Elapsed;

然后写入日志表处理请求所花费的时间。同时记录URL(包含和不包含查询字符串参数)以及各种有助于分析性能的内容。

然后你可以分析你的应用程序并找出哪些操作占用时间最长,哪些操作最多,等等。这样你就可以看到是否有一个页面被请求了很多,而且通常需要很长时间要完成,这应该是优化的目标,使用你拥有的任何工具,包括.NET和SQL分析器。

我通常记录的其他内容,IP地址和登录用户的用户ID。当错误出现时,这也给了我一个宝贵的调试工具。

将其放入表中而不是将其写入日志文件的原因是您可以使用SQL语法来过滤,分组,计算平均时间等。