LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

微软建议的ASP性能优化28条守则(1)

admin
2010年7月3日 13:25 本文热度 5865
[p]本文介绍了优化 asp 应用程序和 visual basic® scripting edition (vbscript) 的技巧。本文讨论了许多陷阱。本文列出的建议已经在 [url=http://microsoft.com/]http://microsoft.com[/url] 和其它站点中进行了测试,效果十分显著。本文假定您已经对 asp 开发,包括 vbscript 和/或 jscript、asp application、asp session 和其它 asp 固有对象(request、response 和 server)有了基本了解。[/p] [p]通常,asp 性能主要取决于 asp 代码本身以外的很多因素。我们不在一篇文章中罗列出所有的信息,在本文结尾处我们列出了与性能有关的资源。这些链接涵盖了 asp 和非 asp 主题,包括 activex® 数据对象 (ado)、组件对象模型 (com)、数据库和 internet information server (iis) 配置。这些都是我们喜欢的一些链接 - 一定要去看看。[/p] [p][b]技巧 1:将经常使用的数据缓存在 web 服务器上[/b][/p] [p]  典型的 asp 页从后端数据存储中检索数据,然后将结果转换成超文本标记语言 (html)。无论数据库的速度如何,从内存中检索数据总要比从后端数据存储中检索数据快得多。从本地硬盘读取数据通常也比从数据库中检索数据更快。因此,通常可以将数据缓存在 web 服务器上(存储在内存或磁盘中),来提高性能。[/p] [p]  缓存是传统的以空间换取时间的做法。如果您缓存的内容正确,那么您可以看到性能会有显著的提高。为使缓存有效,必须保存那些经常重复使用的数据,且要重新计算这些数据需要(适度)大的开销。如果缓存的都是些陈旧的数据,就会造成内存浪费。[/p] [p]  不经常发生改变的数据是很好的缓存候选数据,因为您不必担心随着时间的迁移该数据与数据库同步的问题。组合框列表、引用表、dhtml 碎片、扩展标记语言 (xml) 字符串、菜单项和站点配置变量(包括数据源名称 (dsn)、internet 协议 (ip) 地址和 web 路径)都是很好的缓存候选内容。注意您可以缓存数据的“表示”,而不缓存数据本身。如果 asp 页很少更改,且缓存的开销也很大(例如,整个产品目录),则应考虑事先产生 html,而不是在响应每个请求时重新显示。[/p] [p]  应将数据缓存在哪里,有哪些缓存策略?通常,数据缓存在 web 服务器的内存或磁盘中。下两个技巧讲述了这两个方法。[/p] [p][b]技巧 2: 将经常使用的数据缓存在 application 或 session 对象中[/b][/p] [p]  asp application 和 session 对象为将数据缓存在内存中提供了方便的容器。您可以将数据指派到 application 和 session 对象中,这些数据在 http 调用之间保留在内存中。session 数据是按每个用户分别存储的,而 application 数据则在所有用户之间共享。[/p] [p]  什么时候将数据装载到 application 或 session 中呢?通常,数据是在启动 application 或 session 时装载。要在 application 或 session 启动过程中装载数据,应将适当的代码分别添加到 application_onstart() 或 session_onstart() 中。这些函数应在 global.asa 中,如果没有,则可以添加这些函数。还可以在第一次需要时装载该数据。为此,在 asp 页中添加一些代码(或编写一个可重复使用的脚本函数),以检查数据是否存在,如果不存在,就装载数据。这是一个传统的性能技术,称为“惰性计算” - 在您知道需要某一个值以前不计算该值。例如:[/p] [p]<% [br]function getemploymentstatuslist [br]dim d [br]d = application(?employmentstatuslist?) [br]if d = ?? then [br]' fetchemploymentstatuslist function (not shown) [br]' fetches data from db, returns an array [br]d = fetchemploymentstatuslist() [br]application(?employmentstatuslist?) = d [br]end if [br]getemploymentstatuslist = d [br]end function [br]%>[/p] [p]  可以为所需要的每个数据块编写类似的函数。[/p] [p]  应以什么格式存储数据?可以存储任何变体类型,因为所有脚本变量都是变体型。例如,您可以存储字符串、整数或数组。通常,您将以这些变量类型之一存储 ado 记录集的内容。要从 ado 记录集获取数据,您可以手工将数据复制到 vbscript 变量,一次一个字段。使用一个 ado 记录集持久函数 getrows()、getstring() 或 save()(ado 2.5),可加快速度且更容易一些。其详细情况已超出本文所讨论的范围,但下面给出了一个函数举例,说明使用 getrows() 返回记录集数据的一个数组:[/p] [p]' get recordset, return as an array [br]function fetchemploymentstatuslist [br]dim rs [br]set rs = createobject(?adodb.recordset?) [br]rs.open ?select statusname, statusid from employeestatus?, _ [br]?dsn=employees;uid=sa;pwd=;? [br]fetchemploymentstatuslist = rs.getrows() ? return data as an array [br]rs.close [br]set rs = nothing [br]end function[/p] [p][br]  对上面举例做更进一步改进,可以将 html 缓存为列表,而不是数组。下面是简单的示例:[/p] [p]' get recordset, return as html option list [br]function fetchemploymentstatuslist [br]dim rs, fldname, s [br]set rs = createobject(?adodb.recordset?) [br]rs.open ?select statusname, statusid from employeestatus?, _ [br]?dsn=employees;uid=sa;pwd=;? [br]s = ?? & vbcrlf [br]rs.close [br]set rs = nothing ' see release early [br]fetchemploymentstatuslist = s ' return data as a string [br]end function[/p] [p]  在适当的条件下,可以将 ado 记录集本身缓存在 application 或 session 作用域中。有两个警告:[/p] [p]  必须将 ado 标记为自由线程 [br]  必须使用断开连接的记录集。 [br]  如果不能保证满足这两个要求,则不要缓存 ado 记录集。在下面的“非敏捷组件”和“不要缓存连接”技巧中,我们将讨论将 com 对象存储在 application 或 session 作用域中的危险性。[/p] [p]  当您将数据存储在 application 或 session 作用域时,数据将保留在那里,直到您以编程方式改变它、session 过期或 web 应用程序重新启动为止。如果数据需要更新怎么办?要手工强制对 application 数据进行更新,您可以访问只有管理员才可访问的 asp 页来更新数据。或者,您可以通过函数定期自动刷新数据。下面例子存储带有缓存数据的时间戳,并隔一段时间后刷新数据。[/p] [p]<% [br]' error handing not shown... [br]const update_interval = 300 ' refresh interval, in seconds [br][br]' function to return the employment status list [br]function getemploymentstatuslist [br]updateemploymentstatus [br]getemploymentstatuslist = application(?employmentstatuslist?) [br]end function [br][br]' periodically update the cached data [br]sub updateemploymentstatuslist [br]dim d, strlastupdate [br]strlastupdate = application(?lastupdate?) [br]if (strlastupdate = ??) or _ [br](update_interval < datediff(?s?, strlastupdate, now)) then [br][br]' note: two or more calls might get in here. this is okay and will simply [br]' result in a few unnecessary fetches (there is a workaround for this) [br][br]' fetchemploymentstatuslist function (not shown) [br]' fetches data from db, returns an array [br]d = fetchemploymentstatuslist() [br][br]' update the application object. use application.lock() [br]' to ensure consistent data [br]application.lock [br]application(?employmentstatuslist?) = events [br]application(?lastupdate?) = cstr(now) [br]application.unlock [br]end if [br]end sub[/p] [p]  请参见 world's fastest listbox with application data,上面还有一个例子。[/p] [p]  要知道在 session 或 application 对象中缓存大的数组不是一个好的做法。在访问数组的任何元素之前,脚本语言的语法要求必须临时复制整个数组。例如,如果将由字符串组成的有 100,000 个元素的数组(该数组将美国邮政编码映射到当地的气象站)缓存在 application 对象中,asp 必须先将所有的 100,000 个气象站复制到临时数组中,然后才能提取一个字符串。在这种情况下,用自定义方法建立一个自定义组件来存储气象站 - 或使用一个词典组件会更好。[/p] [p]  再警告大家一下,不要将婴儿与洗澡水一起倒掉:数组能快速查寻和存储在内存中是邻近的关键数据对。索引一个词典比索引一个数组要慢得多。应针对您的实际情况,选择提供最佳性能的数据结构。[/p] [p]#p#[/p] [p][b]技巧 3:将数据和 html 缓存在 web 服务器的磁盘上[/b][/p] [p]  有时,数据可能太多,无法都缓存在内存中。“太多”只是一个说法,这要看您想消耗多少内存,以及需缓存的项目数和检索这些项目的频率。在任何情况下,如果数据太多而无法都缓存在内存中,则考虑将数据以文本或 xml 文件缓存在 web 服务器的硬盘上。可以同时将数据缓存在磁盘和内存中,为您的站点建立最适宜的缓存策略。[/p] [p]  注意当测量单个 asp 页的性能时,检索磁盘上的数据可能不一定要比从数据库检索数据更快。但缓存会降低数据库和网络上的负载。在高负载的情况下,这样做可大大改善总体吞吐量。当缓存开销很大的查询结果(如多表联接或复合存储过程)或大的结果集时,这是非常有效的。与往常一样,要测试一下几种方案的优劣。[/p] [p]  asp 和 com 提供一些建立基于磁盘的缓存方案的工具。ado 记录集 save() 和 open() 函数保存和装载磁盘中的记录集。可以使用这些方法重新编写上面 application 数据缓存技巧中的代码示例,用文件的 save() 代替写到 application 对象中的代码。[/p] [p]  有一些其它组件可以用于文件:[/p] [p]  scripting.filesystemobject 可使您创建、读和写文件。 [br]  与 internet explorer 一起提供的 microsoft® xml 解析器 (msxml) 支持保存和装载 xml 文档。 [br]  lookuptable 对象(例如,用在 msn 上)是从磁盘装载简单列表的最好选择。 [br]  最后,应考虑将数据的表示缓存在磁盘上,而不是数据本身。预先转换的 html 可以用 .htm 或 .asp 文件存储在磁盘上,超级链接可以直接指向这些文件。可以使用商用工具,如 xbuilder,或 microsoft® sql server™ internet 发布功能将产生 html 的过程自动化。或者,您可以将 html 代码片断放在 .asp 文件中。还可以使用 filesystemobject 从磁盘读取 html 文件,或使用 xml 尽早转换。[/p] [p][b]技巧 4:避免将非敏捷的组件缓存在 application 或 session 对象中[/b][/p] [p]  尽管将数据缓存在 application 或 session 对象中是一个好的做法,但缓存 com 对象却有严重的陷阱。通常,人们倾向于将经常使用的 com 对象缓存到 application 或 session 对象中。很遗憾,许多 com 对象(包括所有以 visual basic 6.0 或更低版本编写的对象)当存储在 application 或 session 对象时,会引起严重的瓶颈。[/p] [p]  具体来讲,当任何不敏捷的组件缓存在 session 或 application 对象时,将引起性能瓶颈。敏捷的组件是被标记为 threadingmodel=both 的组件,它聚集 free-threaded marshaler (ftm);或被标记为 threadingmodel=neutral 的组件。(neutral 模型是 windows® 2000 和 com+ 的新增模型。) 下列组件不是敏捷的:[/p] [p]  自由线程的组件(除非它们聚集 ftm)。 [br]  单元线程组件。 [br]  单线程组件。 [br]  配置的组件(microsoft transaction server (mts)/com+ 库和服务器程序包/应用程序)不是敏捷的,除非它们是 neutral 线程。单元线程组件和其它非敏捷的组件在页作用域内是最适合的(即,它们在单个 asp 页上创建和销毁)。[/p] [p]  在 iis 4.0 中,被标记为 threadingmodel=both 的组件被认为是敏捷的。在 iis 5.0 中,只有这一点还不够。组件必须不仅被标记 both,还必须聚集 ftm。有关敏捷性的文章讲述了如何使以 active template library 编写的 c++ 组件聚集 ftm。要注意如果组件缓存界面指针,那么那些指针本身必须是敏捷的,或必须存储在 com 共用界面表 (git) 中。如果您不能重新编译 both 线程组件以聚集 ftm,那么您可以将组件标记为 threadingmodel=neutral。或者,如果您不想让 iis 执行敏捷性检查(因此,您可以允许非敏捷的组件存储在 application 或 session 作用域中),您可以在配置数据库中将 asptrackthreadingmodel 设置为 true。不建议更改 asptrackthreadingmodel。[/p] [p]  如果您想将以 server.createobject 创建的非敏捷的组件存储在 application 对象中,iis 5.0 将出现一个错误。您可以在 global.asa 中使用 避免这一错误,但不建议这样做,因为这会导致汇集和串行化,关于这一点将在下面讲述。[/p] [p]  如果您缓存非敏捷的组件会出现什么毛病?缓存在 session 对象中的非敏捷的组件将 session 锁定于 asp 工作者线程。asp 维护一个工作者线程池来处理请求。通常情况下,一个新请求总是由第一个可用的工作者线程来处理。如果 session 被锁定于一个线程,那么请求必须等到其相关的线程可用为止。这里有一个类比,也许会有所帮助:您去一家超级市场,挑选了一些商品,并在 #_3 收款台付款。其后,每当您在那家超级市场为商品付款时,您总是必须在 #_3 收款台付款,即使其它收款台前排队的人较少或者没有人排队,也是如此。[/p] [p]  将非敏捷的组件存储在 application 作用域对性能的影响甚至更坏。asp 必须创建一个特殊的线程运行存储在 application 作用域中的非敏捷组件。这会有两个结果:所有调用都必须汇集到此线程,且所有调用都排成长队。“汇集”的意思是参数必须存储在内存的共享区域;执行一个开销很大的到特殊线程的上下文切换;执行组件的方法;将结果汇集到共享区域;执行另一个开销很大的上下文切换,将控制返回到原始的线程。“串行化”意思是指每次只运行一个方法。两个不同的 asp 工作者线程不能同时在共享组件上执行多个方法。这样就杜绝了并发性,特别是在多处理器计算机上。更糟的是,所有非敏捷的 application 作用域的组件共享一个线程(主机 sta),因此串行化的影响甚至更显著。[/p] [p]  如之奈何?下面是一些一般的规则。如果您使用 visual basic (6.0) 或更早版本编写对象,那么不要将它们缓存在 application 或 session 对象中。如果您不知道对象的线程模型,不要缓存它。不要缓存非敏捷的对象,而应在每个页面创建和释放它们。对象直接在 asp 工作者线程上运行,因此没有汇集或串行化。如果 com 对象在 iis 服务器上运行,且如果它们不花长时间初始化和删除,性能尚可。注意单线程对象不应该这样使用。小心 - vb 可创建单线程对象!如果您必须这样使用单线程对象(如 microsoft excel 电子表格),别指望会有很高的吞吐量。[/p] [p]  当 ado 被标记为自由线程,ado 记录集可以安全地缓存。要将 ado 标记为自由线程,使用 makfre15.bat 文件,该文件通常位于目录 [url=file://program/]\\program[/url] files\common\system\ado 中。[/p] [p]  警告 如果您使用 microsoft access 作为数据库,不应将 ado 标记为自由线程的。ado 记录集也必须切断连接。一般来说,如果您不能控制站点中的 ado 配置(例如,您是一个独立的软件厂商 [isv],向管理他们自己的配置客户销售 web 应用程序),最好不要缓存记录集。[/p] [p]  词典组件也是敏捷的对象。lookuptable 从数据文件中装载其数据,可用于组合框数据和配置信息。duwamish books 中的 pagecache 对象可提供词典语法,caprock dictionary 也可提供。这些对象或其派生对象可以构成有效缓存策略的基础。注意 scripting.dictionary 对象不是敏捷的,不应该存储在 application 或 session 作用域中。[/p] [p][b]技巧 5:不要将数据库连接缓存在 application 或 session 对象中[/b][/p] [p]  缓存 ado 连接通常是很糟糕的策略。如果一个 connection 对象存储在 application 对象中,并在所有的页面中使用,那么所有页面将争抢这一连接。如果 connection 对象存储在 asp session 对象中,那么将为每个用户创建数据库连接。这就会使连接池的优势荡然无存,并给 web 服务器和数据库带来不必要的压力。[/p] [p]  可以不缓存数据库连接,而是在使用 ado 的每个 asp 页面中创建和删除 ado 对象。这是很有效的,因为 iis 内嵌了数据库连接池。更准确地说,iis 自动启用 oledb 和 odbc 连接池。这就能确保在每个页面上创建和删除连接将是有效的。[/p] [p]  因为连接的记录集存储一个到数据库连接的引用,所以您不应将连接的记录集缓存在 application 或 session 对象中。但是,您可以安全地缓存断开连接的记录集,它们不保存到其数据连接的引用。要断开记录集连接,执行下面的两个步骤:[/p] [p]set rs = server.createobject(?adodb.recordset?) [br]rs.cursorlocation = aduseclient ' step 1 [br][br]' populate the recordset with data [br]rs.open strquery, strprov [br][br]' now disconnect the recordset from the data provider and data source [br]rs.activeconnection = nothing ' step 2[/p] [p]  有关连接池的更详细信息,可以在 ado 和 sql server 参考资料中找到。[/p] [p][b]技巧 6:合理地使用 session 对象[/b][/p] [p]  既然我们已经讨论了缓存在 application 和 session 中的优点,现在开始讨论避免使用 session 对象的问题。正如下面所讨论的,当与忙的站点一起使用时,session 有几个缺点。“忙”的意思一般是指一秒钟要求几百页面或成千上万同时用户的站点。这个技巧对于必须水平扩展的站点 - 即,那些利用多台服务器以处理负载或实现容错的站点 - 甚至更重要。对于较小的站点,诸如 intranet 站点,要想实现 session 带来的方,必然增大系统开销。[/p] [p]  简言之,asp 自动为每个访问 web 服务器的用户创建一个 session。每个 session 大约需要 10 kb 的内存开销(最主要的是数据存储在 session 中),这就使所有的请求都减慢。在配置的超时时段(通常是 20 分钟)结束以前,session 一直保留有效。[/p] [p]  session 的最大的问题不是性能,而是可扩展性。session 不能跨越几台 web 服务器,一旦在一台服务器上创建 session,其数据就留在那儿。这就意味着如果您在一个 web 服务器群使用 session,您必须设计一个策略,将每个用户请求始终发到用户 session 所在的那台服务器上。这被称为将用户“粘”在 web 服务器上。术语“粘性会话”就是从这里派生而来的。如果 web 服务器崩溃,被“粘住的”用户将丢失他们的会话状态,因为会话不是粘到磁盘上。[/p] [p]  实现粘性会话的策略包括硬件和软件解决方案。诸如 windows 2000 advanced server 中的网络负载平衡和 cisco 的 local director 之类的解决方案都可以实现粘性会话,代价是要损失一定程度的可扩展性。这些解决方案是不完善的。不建议此时部署您自己的软件解决方案(我们过去常常使用 isapi 筛选器和 url 转换等等)。[/p] [p]  application 对象也不跨越多台服务器,如果您必须跨越 web 服务器群共享和更新 application 数据,您必须使用后端数据库。但是,只读 application 数据在 web 服务器群中仍是有用的。[/p] [p]  如果只是因为要增加运行时间(处理故障转移和服务器维护),大多数关键任务站点至少需部署两台 web 服务器。因此,在设计关键任务应用程序时,必须实现“粘性会话”,或干脆避免使用 session,以及任何其它将用户状态存储在单个 web 服务器上的状态管理技术。[/p] [p]  如果您不使用 session,一定要将它们关闭。您可以通过 internet services manager,为应用程序执行此操作(参见 ism 文档)。如果您决定使用 session,您可以采用一些方法减轻它们对性能的影响。[/p] [p]  您可以将不需要 session 的内容(如帮助屏幕,访问者区域等等)移到另一个关闭了 session 的 asp 应用程序中。您可以逐页提示 asp,您不再需要该页面上的 session 对象,使用以下放在 asp 页面最上面的指令:[/p] [p]<% @enablesessionstate=false %>[/p] [p]  使用这一指令有一个很好的理由是,这些 session 在框架集方面存在一个有意思的问题。asp 保证任何时候 session 只有一个请求执行。这样就确保如果浏览器为一个用户请求多个页面,一次只有一个 asp 请求接触 session,这样就避免了当访问 session 对象时发生的多线程问题。很遗憾,一个框架集中的所有页面将以串行方式显示,一个接一个,而不是同时显示。用户可能必须等候很长时间,才能看到所有的框架。该故事的寓意:如果某些框架集页面不依靠 session,一定要使用 @enablesessionstate=false 指令告诉 asp。[/p] [p]  有许多管理 session 状态的方法,可替代 session 对象的使用。对于少量的状态(少于 4 kb),我们通常建议使用 cookies、querystring 变量和隐式变量。对于更大数据量,如购物小车,后端数据库是最适合的选择。有关 web 服务器群中状态管理技术的文章很多。有关详细信息,请参见 session 状态参考资料。[/p] [p][b]技巧 7: 将代码封装在 com 对象中[/b][/p] [p]  如果您有许多 vbscript 或 jscript,您可以经常将代码移到编译的 com 对象中,从而可改善性能。编译的代码通常比解释的代码运行得更快。编译的 com 对象可以通过“早绑定”访问其它 com 对象,与脚本使用的“晚绑定”相比,“早绑定”是调用 com 对象的更有效方法。[/p] [p]  将代码封装在 com 对象中还有一些优点(除性能之外):[/p] [p]  com 对象有利于将表示逻辑与业务逻辑分开。 [br]  com 对象可以保证代码重复使用。 [br]  许多开发人员发现以 vb、c++ 或 visual j++ 编写的代码比 asp 更容易调试。 [br]  com 对象也有缺点,包括初始开发时间和需要不同的程序设计技巧。注意封装少量的 asp 可能引起性能下降,而不会得到性能改进。这种情况通常在少量的 asp 代码被封装进 com 对象时发生。在这种情况下,创建和调用 com 对象的系统开销超过了编译的代码的优点。应反复地试验,以确定什么样的 asp 脚本和 com 对象代码的组合产生最好的性能。注意,与 microsoft windows nt® 4.0/iis 4.0 相比,windows 2000/iis 5.0 中在脚本和 ado 性能方面有了很大的改进。因此,随着 iis 5.0 的推出,编译代码比 asp 代码的性能优势有所降低。[/p] [p]  有关在 asp 中使用 com 的优点和缺点的详细讨论,参见 asp component guidelines and programming distributed applications with and microsoft visual basic 6.0。如果您部署 com 组件,以负荷对它们进行测试特别重要。事实上,理所当然应对所有的 asp 应用程序进行负荷测试。[/p] [p]#p#[/p] [p][b]技巧 8:迟一点获得资源,早一点释放资源[/b][/p] [p]  这里是一个小技巧供您参考。一般来说,最好迟一点获得资源,早一点释放资源。这适用于 com 对象以及文件句柄和其它资源。[/p] [p]  这种优化方法主要用于 ado 连接和记录集。当您使用完记录集,比方说在显示一个表及其数据之后,应立即释放它,而不是等到页面结束时再释放。将 vbscript 变量设置为 nothing 是最好的做法。不要让记录集超出作用域之外。而且,要释放任何相关的 command 或 connection 对象(在将记录集或连接设置为 = nothing 之前,不要忘记调用 close())。这会缩短数据库必须为您准备资源的时间,并尽快释放数据库到连接池的连接。[/p] [p][b]技巧 9:进程外执行过程以性能换取可靠性[/b][/p] [p]  asp 和 mts/com+ 两者都有配置选项,可使您兼顾可靠性和性能。当建立和部署应用程序时,应知道如何兼顾两者的性能。[/p] [p]  asp 选项 [br]  可以配置 asp 应用程序,以便以三种方法之一运行。在 iis 5.0 中,引入了“隔离级”这一术语以说明这些选项。这三个隔离级分别是低级、中级和高级:[/p] [p]  低级隔离。这在 iis 的所有版本中都得到支持,且是最快的。它在 inetinfo.exe 中运行 asp,inetinfo.exe 是主要 iis 进程。如果 asp 应用程序崩溃,iis 也会崩溃。(要在 iis 4.0 下重新启动 iis,web 站点管理员应使用诸如 inetmon 之类的工具监视站点,如果服务器发生故障,应启用批处理文件以重新启动服务器。iis 5.0 引入了可靠的重新启动,该方法可使发生故障的服务器自动重新启动。) [br]  中级隔离。iis 5.0 引入了这个新的级别,它被称为进程外级别,因为 asp 在 iis 进程之外运行。在中级隔离中,被配置作为中级隔离运行的所有 asp 应用程序都共享一个进程空间。这就减少了在一台服务器运行多个进程外 asp 应用程序所需要的进程数量。中级隔离是 iis 5.0 中的默认隔离级别。 [br]  高级隔离。在 iis 4.0 和 iis 5.0 中支持这一级别,高级隔离也是进程外的。如果 asp 崩溃,web 服务器并不会崩溃。下次 asp 请求时,asp 应用程序就会自动重新启动。在高级隔离中,配置作为高级隔离运行的每个 asp 应用程序都在其自有进程空间中运行。这样做可保护 asp 应用程序彼此之间不相互干扰。其缺点是它要求每个 asp 应用程序都要有一个单独的进程。当在一台服务器上必须运行许多应用程序时,系统开销就会大大增加。 [br]  哪个选项最好的呢?在 iis 4.0 中,进程外运行将显著降低性能。在 iis 5.0 中,做了许多改进,将进程外运行 asp 应用程序所产生的开销降到最低限度。事实上,在绝大多数测试中,iis 5.0 中的 asp 进程外应用程序比 iis 4.0 中的进程内应用程序运行得更快。不管怎样,在两个平台上,进程内(低隔离级)性能最佳。但是,如果访问率相对较低或最大吞吐量较低,低隔离级的优势不太明显。因此,在您每一 web 服务器每秒钟需要数百或成千上万页面时,才会觉得有必要设置低隔离级。与往常一样,应对多种配置进行测试,确定您要采取哪一种折衷方案。[/p] [p]  注意 当您运行 asp 进程外应用程序时(中级或高级隔离),它们在 nt4 中的 mts 和在 windows 2000 中的 com+ 中运行。即,在 nt4 中它们在 mtx.exe 中运行;而在 windows 2000 中,它们在 dllhost.exe 中运行。您可以在任务管理器中看到这些进程在运行。您还可以看到 iis 如何为进程外 asp 应用程序配置 mts 程序包或 com+ 应用程序。[/p] [p]  com 选项 [br]  com 组件也有三种配置选项,虽然与 asp 选项不完全类似。com 组件可以是“未配置的”、配置为库应用程序或配置为服务器应用程序。“未配置的”意思是指组件没有注册 com+。组件将在调用程序的进程空间运行,那就是说,它们是“进程内的”。库应用程序也是进程内的,但使用 com+ 的服务,包括安全、事务和上下文支持。服务器应用程序被配置为在它们自有的进程空间内运行。[/p] [p]  您可以看到未配置的组件比库应用程序略有一些优势。库应用程序比服务器应用程序的性能优点更大。这是因为库应用程序与 asp 在同一进程内运行,而服务器应用程序在它们的自有进程内运行。进程间的调用比进程内调用开销更大。而且,当在进程之间传递诸如记录集之类的数据时,必须在两个进程之间复制所有的数据。[/p] [p]  陷阱!当使用 com 服务器应用程序时,如果您在 asp 和 com 之间传递对象,要确保对象执行“按值汇集”或 mbv。执行 mbv 的对象将它们自己从一个进程复制到另一个进程。这比下面一种方法好,采用这种方法时,对象仍在创建者的进程中,另外一个进程反复地调用创建进程以使用该对象。切断连接的 ado 记录集将“按值汇集”,连接的记录集则不然。scr

该文章在 2010/7/3 13:25:51 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved