在编写ASPNET应用程序的时候你会花费多长的时间来考虑性能的问题?很不幸大多数开发者都对性能问题感到很后悔性能的规划和设计真的需要放在前面和中心位置你需要考虑自己的目标并且确保把良好的性能作为目标之一接着你需要评估自己的程序评估的方面越多改善性能的机会就越大
在本文中我将解释微软Visual Studio企业版中包含的一个重要工具微软Application Center Test严肃的Web开发者都应该把这个工具放在自己的工具包中
Application Center Test
在离开微软之前我参加了个城市的ASPNET说明会其中一个覆盖了性能问题并且给很多开发者介绍了微软Application Center Test这个工具总是生成大量的有趣的信息我对它有很多疑问
你会发现Application Center Test是Application Center(可以在旧的MSDN CD或DVD中找到)的一部分或者安装在Visual Studio NET企业版的Visual Studio NET \Visual Studio NET Enterprise Features目录下面当你第一次打开Application Center Test的时候你可以看到一个用于导航可用的测试结果和用户的树视图首先我希望显示出很容易建立测试
使用Application Center Test
首先建立一个简单的Web应用程序例如我将使用图所示的页面(请注意我使用了一些联机编写ASPNET页面的小技巧你不需要编写完整的Page_Load事件声明)
示例Web应用程序
<%@ Page Language=C# %>
<%@ Import Namespace=SystemData %>
<%@ Import Namespace=SystemDataSqlClient %>
<%@ Import Namespace= SystemConfiguration %>
<script runat=server>
public void Page_Load() {
using(SqlConnection connection =
new SqlConnection(ConfigurationSettingsAppSettings[Northwind]))
{
SqlCommand command = new SqlCommand(SELECT * FROM Products connection);
connectionOpen();
DataGridDataSource = commandExecuteReader();
DataGridDataBind();
}
}
</script>
<form runat=server>
<asp:DataGrid id=DataGrid runat=server />
</form>
上面的代码虽然不是推荐的用于构造应用程序的方法但是它也足够简单我们能够在它上面执行一些基本的测试在Web浏览器中打开这个页面会返回一个填充了的数据表格它显示为HTML表格
现在你知道这个页面可以工作了把链接复制到剪贴板上你还需要使用它的在我的计算机上这个例子的链接是x
下一步导航到Application Center Test右键点击Tests(测试)并选择New Test(新建测试)它会打开新建测试向导欢迎页面点击下一步选择新测试的源代码并选中记录新测试再次点击下一步以选择测试类型提示选择脚本语言(我们不修改默认值)的时候点击下一步出现了图所示的界面
图新建测试向导
记录测试使Application Center Test易于使用点击开始记录会打开一个新的浏览器实例不要在地址栏中输入URL(应该为about:blank)我们的操作是在这个新的浏览器实例中选择Tools | Internet选择并浏览连接属性页接着点击局域网设置按钮会看到图所示的界面
图连接设置
你会发现代理服务器(proxy)设置信息被填充了并且与正常值不同这是因为Application Center Test打开了一个新的浏览器实例并指示它使用Application Center Test运行的专用代理服务器经过浏览器的任何请求都会被Application Center Test代理捕捉到
为了完成测试请关闭浏览器对话框并把用于测试的ASPNET页面的链接粘贴到地址栏中点击浏览器的转到按钮或直接按下回车键再次出现了数据表格下一步关闭浏览器你可能看到与图类似的信息
图捕捉到的请求
上面的对话框中的请求的详细信息部分现在被Application Center Test代理捕捉到的请求所填充了这也是浏览器发送的HTTP请求现在点击停止记录接着点击下一步你会得到一个提示需要给该测试输入一个名称(我用的是My Test)接着你可以点击完成关闭向导
恭喜你!你现在是一个性能测试工程师了很容易对吗?
你还可以选择很多其它的设置信息和配置选项你右键点击测试列表中的My Test节点并选择属性 可以看到这些设置在这些选项中你可以模拟多个浏览器多个用户热身时间的参数(不会被报告其结果)以及测试的持续时间你可以以后研究这些设置并阅读一些讨论测试原理和测试策略的文章我们不在细节上花费太多时间直接运行测试吧
运行测试并建立基线
要运行刚才建立的测试只需要简单地右键点击该测试并选择开始测试测试开始以后点击显示详细信息按钮细节框中将显示正在运行的测试的一个图表同时显示在运行测试过程中可能出现的任何错误(图所示)第一次运行这个测试建立了基线我们可以把它与当前的和未来的性能进行对比图显示的基线是每秒大约个请求
图基线图表
现在你拥有了一个确定的基线了你可以对应用程序作一些修改以测量修改所引起的性能提升或降低的确我使用的测试示例极其简单但是我会显示出对这一小段代码进行少量的修改可能对应用程序的性能产生很大的影响
了解改善的部分
评估的方面越多改善的机会就越大在例子中我将对应用程序作一些小的修改并在每个修改之后进行评估尽管在现实情况下你不可能每步修改都进行这样的测试但是你应该有周期性检查性能的习惯对于我们公司的Community Server产品我们拥有一套用于评估总体应用程序开销的基线如果进行了重大的修改开发者就可以使用前面的测试数据来研究性能的提升或降低
我对示例应用程序的第一处修改是改变返回数据量的限制我把SQL查询SELECT * FROM Products改变为SELECT TOP * FROM Products这好像只是对代码进行了微小的修改毕竟我只是限制屏幕中输出的数据量但是其结果却是惊人的其性能从每秒个请求上升到以上性能提高了%以上由于你拥有基线你知道了限制绑定到数据表格的数据量一定会影响性能我还要修改其它一些东西
下一步修改<asp:DataGrid/>服务器控件添加EnableViewState=false
<asp:DataGrid EnableViewState=false id=DataGrid runat=server />
ViewState是ASPNET的一个重要的特性但是并非总是需要的实际上大多数使用了ViewState的数据表格都是不需要它的在例子中通过禁止ViewState我可以提高%的性能我们继续!
下一步添加下面的代码以激活输出缓沖(OutputCaching)
<%@ OutputCache Duration= VaryByParam=none %>
图输出缓沖
现在重新运行该测试太惊人了!性能提高了%如图所示你可以调整OutputCache的持续数值例如把OutputCache的持续值设置为秒你可以看到性能再次有很大的变化
建立测试环境
测试操作是CPU密集型的事务因此在运行测试的时候你可能看到CPU的占用率接近%它在与测试部件分享CPU时间的时候会拿走正在测试的应用程序的资源所有的配置选项都会影响测试结果其中一部分模拟现实世界要真实一些例如如果SQL Server和ASPNET在同一台计算机上就无法模拟网络I/O的开销大多数应用程序使用的数据库都不在Web服务器上
为了建立真实的测试环境把大量的旧的用于开发的计算机作为客户端使用不要使用虚拟机在这些计算机上运行Application Center Test下一步尽可能地模拟现实世界在一个没有运行其它任何应用程序的服务器操作系统上运行该Web应用程序并且连接到另一台服务器的数据库
需要说明的是在开发环境中运行烟幕测试也没有什么错误烟幕测试不能模拟现实世界但是仍然可以提供大量的有价值的数据并且可以用于预计在现实世界中同样的测试产生的结果
后续的步骤和测试覆盖
现在你对如何测试和评估有了一些了解了我推荐你在自己的应用程序上使用Application Center Test了解你的用户在典型情况下如何使用应用程序是有好处的哪些页面执行得更好哪些页面没有改善?
例如在Community Server中我们运行了多种类型的性能测试主线(Mainline)测试包含了匿名和验证的情况在大量个性化的应用程序中这一点可能显着的改变性能情况
主线测试还包含了贯穿系统的通用路径例如网络日志图表论坛的主视图以及每个屏幕的不同视图很明显这些主线情形良好的执行情况是非常重要的最好在这儿花费大量的时间以确保其正确性
如果你管理或运行那些必须支持两个或多个并发用户