状态管理
• 在未使用时禁用会话状态
– 并不是所有的应用程序或页都需要具体用户的会话状态;您应该
在不需要时禁用会话状态
– 如果页需要访问会话变量,但不打算创建或修改它们,则将@
Page 指令中的EnableSessionState 属性设置为ReadOnly
– 可以禁用XML Web services 方法的会话状态
– 若要禁用应用程序的会话状态,请在应用程序的Web.config 文件
的SessionState 节中将Mode 属性设置为Off
<%@ Page EnableSessionState="false" %>
<sessionState mode="Off" />
[WebMethod(false)]
[WebMethod(EnableSession=false)]
若要禁用应用程序的会话状态,请在应用程序的Web.config 文件
的SessionState 节中将Mode 属性设置为Off
<%@ Page EnableSessionState="false" %>
<sessionState mode="Off" />
状态管理
• 慎重选择会话状态提供程序
– 进程内会话状态
• 迄今为止速度最快的解决方案
• 如果仅在会话状态中存储少量易失数据,则应使用进程内提供程序
– 作为Windows 服务的进程外会话状态
– SQL 数据库中的进程外会话状态
• 用于跨多个处理器或多个计算机缩放应用程序
• 用于Web 花园和Web 农场方案,或用于当服务器/进程重新启动时
不能丢失数据的情况
<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424"/>
<sessionState mode="SQLServer" allowCustomSqlDatabase="false"
sqlConnectionString="data source=ben\sql2005;uid=sa"/>
aspnet_regsql.exe -S ben\sql2005 -U sa -ssadd -sstype p
数据访问
• 将SQL 存储过程用于数据访问
– 在.NET 框架提供的所有数据访问方法中,基于SQL 的数据访问是
生成性能最好的可缩放Web 应用程序的最佳选择
– 使用托管SQL 提供程序时,可通过使用编译的存储过程而不是特
殊查询,获得额外的性能提高
• 使用SqlDataReader 获得快进只读数据游标
– SqlDataReader 对象对从SQL 数据库中检索的数据提供前进只读
游标
– 在ASP.NET 应用程序中使用只读流,则SqlDataReader 类提供比
DataSet 类更高的性能
– SqlDataReader 类使用SQL Server 的本机网络数据传输格式从数
据库连接直接读取数据
– SqlDataReader 类实现IEnumerable 接口,该接口也使您可以将数
据绑定到服务器控件
数据访问
• 尽可能缓存数据和页输出
– 在不需要为每个页请求动态计算页输出或数据时缓存
这些页输出或数据
– 通过设计要进行缓存的页和数据请求(特别是在站点
中预期将有较大通讯量的区域),可以优化这些页的
性能
– 注意:
• 不要缓存太多项
• 给缓存项分配的有效期不要太短
Web 应用程序
• 大型Web 应用程序,请预编译它
– 减少首次访问页时的分析及编译开销
• 必要时调整应用程序每个辅助进程的线程数
– 该结构将根据可用于请求的CPU 功率,来决定允许同时执行的请
求数。这项技术称作线程门控
– 使用与“ASP.NET Applications”性能对象关联的“Pipeline Instance
Count”(管线实例计数)性能计数器,可以在Windows 性能监视
器中监视线程门控
– 通过更改Machine.config 配置文件processModel 元素(ASP.NET
设置架构)节中的MaxWorkerThreads 和MaxIOThreads 属性,手
动设置进程中的线程数限制
– 辅助线程是用来处理ASP.NET 请求的,而IO 线程则是用于为来自
文件、数据库或XML Web services 的数据提供服务的
• 对于广泛依赖外部资源的应用程序,请考虑在多处理器计
算机上启用网络园艺
Web 应用程序
• 禁用调试模式
•
• 优化Web 服务器和特定应用程序的配置文件
– 仅对需要的应用程序启用身份验证
• 默认情况下,ASP.NET 应用程序的身份验证模式为Windows 或集成的NTLM
• 大多数情况下,最好仅对需要身份验证的应用程序在Machine.config 文件中
禁用身份验证,并在Web.config 文件中启用身份验证
•
– 根据适当的请求和响应编码设置来配置应用程
• ASP.NET 默认编码格式为UTF-8
• 如果您的应用程序仅使用ASCII 字符,请配置您的ASCII 应用程序以获得稍许
的性能提高
<compilation debug="true">
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
Web 应用程序
• 优化Web 服务器和特定应用程序的配置文件
– 考虑对应用程序禁用AutoEventWireup
• 重写Page 对象的OnLoad 方法,而不是使用Page_Load 方法
– 从请求处理管线中移除不用的模块
<pages autoEventWireup="false"/>
优化技巧和要点
• 不要依赖代码中的异常
– 异常非常浪费资源,应在代码中尽量避免。绝不要将
异常作为控制常规程序流的方法
– 检查空值,分配给将分析为数字值的字符串,在应用
数学运算前检查特定值
优化技巧和要点
• 对字符串连接使用Response.Write
– 在页面或用户控件中对字符串连接使用HttpResponse.Write 方法
– 大量字符串连接时不要使用+ ,应使用StringBuilder来构造
Response.Write("a")
Response.Write(myString)
Response.Write("b")
Response.Write(myObj.ToString())
Response.Write("c")
Response.Write(myString2)
Response.Write("d")
string strWrite;
strWrite = "ABC";
strWrite += strTest;
strWrite += …;
StringBuilder sb = new StringBuilder();
sb.Append("ABC");
sb.Append(strTest);
优化技巧和要点
• 适当地使用公共语言运行库的垃圾回收器和自动内存管理
– 不要对每个请求使用过多内存(如在内存中存储大型对象或数据
集),因为这样垃圾回收器将必须更频繁地进行更多的工作
– 当不再需要对象时,请不要在代码中保留不必要的对象引用,因
为在它们仍然被引用的情况下,垃圾回收器将无法释放资源
– 尽量避免使用含Finalize 方法的对象,因为它们在后面会导致更
多垃圾回收器工作
• 将大量调用的COM 组件移植为托管代码
– 大的性能障碍之一是将数据从非托管环境封送到托管环境
– 在交互操作中,请在任何一端执行尽可能多的任务,然后进行单
个调用而不是一系列小调用
– 例如,公共语言运行库中的所有字符串都是Unicode 的,所以应
在调用托管代码之前将组件中的所有字符串转换成Unicode 格式
优化技巧和要点
• 避免单线程单元(STA) COM 组件
– 默认情况下,ASP.NET 不允许STA COM 组件在页内运行
– 若要运行它们,必须在.aspx 文件内将ASPCompat=true 属性包含
在@ Page 指令中
– 如果必须使用STA COM 组件,则应避免在执行期间进行大量调
用,并尝试在每次调用期间发送尽可能多的信息
– 免在构造页面期间创建STA COM 组件
<%@ Page Language="VB" ASPCompat="true" %>
<script runat=server>
Dim myComp as new SampleSTAComponent()
Public Sub Page_Load()
myComp.Name = "Sample"
End Sub
</script>
<html>
<%
Response.Write(Server.HtmlEncode(myComp.SayHello))
%>
</html>
<%@ Page Language="VB" ASPCompat="true" %>
<script runat=server>
Dim myComp
Public Sub Page_Load()
myComp = new SampleSTAComponent()
myComp.Name = "Sample"
End Sub
</script>
<html>
<%
Response.Write(Server.HtmlEncode(myComp.SayHello))
%>
</html>
附录
• ASP.NET 支持两组性能计数器
– 系统:性能计数器对象名为ASP.NET
– 应用程序:性能计数器对象名为ASP.NET 应用程序
• 与每个性能计数器关联的值每400 毫秒更新一次
• 监视ASP.NET Web 应用程序的性能时,可以跟踪下表中
所列的性能计数器
% CPU Utilization(CPU 使用率)
注意:如果不管客户端负载如何,CPU 使用均低或者无法
最大化CPU 使用,则表明Web 应用程序中存在锁/资源争
用
处理器
ASP.NET 应用程序Requests/Sec(每秒请求数)
ASP.NET 应用程序Errors Total(错误总数)
ASP.NET Worker Process Restarts(辅助进程重新启动的次数)
ASP.NET Requests Queued(排队的请求数)
ASP.NET Application Restarts(应用程序重新启动的次数)
性能对象性能计数器
附录
• 下面的性能计数器对确定Web 应用程序的性能问题也可能有价值
• “# of Exceps Thrown”计数器显示应用程序中引发的异常数,因为这些可能有性
能方面的暗示。但是,某些代码路径依赖异常才能正常使用。例如,Response
对象上的Redirect 方法引发ThreadAbortException 异常,而该异常无法被捕获。
因此,使用“Errors Total”计数器跟踪该值(以查看异常在应用程序上是否产生
了错误)可能很有用。
• Context Switches/sec 计数器测量Web 服务器计算机中的所有CPU 切换线程上
下文的速率。此计数器的高数值通常说明存在较高的锁争用,或者线程在用户
模式与内核模式之间有大量切换。如果遇到这种情况,应该使用采样分析器和
其他工具进行进一步的研究
