应当注意的是,对本地计算机的连接数量从来都没有限制,因此,如果是连接到本地主机,则此设置无效。
maxworkerthreads 和 minfreethreads
如果收到 http 503 错误(“服务暂时过载”),则表明线程池中的线程已全部占用,并且请求队列也已超出最大值(apprequestqueuelimit 的默认设置为 100)。对于 iis 5.0 安装,可以简单地增加线程池的大小。而对于 iis 6.0 安装(与 iis 5.0 不兼容),这些设置将无效。
maxworkerthreads 和 maxiothreads 分别控制工作线程数以及处理新提交的 asp.net 请求的线程数。这些设置需要在您的 machine.config 中进行配置,它们将影响您计算机上运行的所有 web 应用程序。maxworkerthreads 是 machine.config 中的 processmodel 元素的一部分,并且您在查看后会发现,该设置的默认值为每个处理器 20 个线程。
minfreethreads 设置可以在 machine.config 中进行配置,或者在您的应用程序的 web.config 文件中的 httpruntime 元素下进行配置。该设置的作用是,当空闲的线程数低于所设置的限制时,将禁止使用线程池中的线程来处理传入的 http 请求。如果您需要某个进程线程池线程完成挂起的请求,这会很有用。如果所有的线程都被用来处理传入的 http 请求,并且这些请求在等待另一个线程完成其处理,那么就会进入死锁状态。例如,如果您正在从 asp.net 应用程序进行对某个 web 服务的异步 web 服务调用,并且在等待回调函数完成该请求,就会出现这种情况。因为回调必须在进程线程池中的空闲线程上进行。如果查看一下您的 machine.config,将会注意到 minfreethreads 设置的默认值为 8,如果工作线程池的限制为 20,则该默认值还可以满足需要,但是,如果线程池的大小增加到 100,该默认值就太小了。
应当注意的是,如果您的 asp.net 应用程序对本地计算机进行 web 服务调用,则线程池限制的问题将被激化。例如,我为此专栏创建的测试应用程序调用与 aspx 页面同处一台计算机上的 web 服务。因而,对于阻塞的调用,一个线程被同时用于 aspx 页面和 asmx web 服务请求。这有效地使 web 服务器处理的同时请求数增加了一倍。在同时进行两个 web 服务请求(使用异步 web 服务调用)的情况下,我们最终使同时进行的请求数增加了两倍。为避免在回调本地计算机时出现此类问题,您应当考虑您的应用程序的体系结构,使其简单地直接从 aspx 代码来执行 web 方法中的代码。
windows xp 限制
我们必须要注意,如果您在一个 windows? xp 计算机上进行某项测试,则所面临的另一个限制是 xp web 服务器对所允许的同时连接数的人为限制。因为 windows xp 不是服务器平台,其同时连接数被限制为 10。这对于开发环境中的测试通常没问题,但是如果试图进行任何复杂的测试,该限制问题就会比较严重。本地计算机的连接不受此限制影响。
真正的解决方案:异步请求处理
调整配置设置是一种改善问题的方法,而在实际设计 web 应用程序时通过某种方式彻底解决问题则是另一回事。等待阻塞的调用完成的线程永远也不会有更好的调整余地,因此,解决的办法是完全避免阻塞问题。异步处理请求就是一个适当的解决方案。这表现在两个方面:进行异步 web 服务调用,以及在 asp.net web 应用程序中异步处理请求。
异步 web 服务调用
在以前的专栏中,我写了有关异步调用 web 服务的问题。能够使线程不用等待 web 服务调用完成是创建释放线程以便处理更多请求的异步页面处理模型的关键部分。此外,异步调用 web 服务也比较简单。
请考虑以下 aspx 页面的 visual basic.net 代码:
' 错用同步 web 服务调用所造成的性能极差的
' 页面!
public class syncpage
inherits system.web.ui.page
protected withevents label1 as system.web.ui.webcontrols.label
protected withevents label2 as system.web.ui.webcontrols.label
private sub page_load(byval sender as system.object, _
byval e as system.eventargs) handles mybase.load
'调用 web 服务
dim proxy as new localhost.service1
label1.text = proxy.method1(500)
label2.text = proxy.method1(200)
end sub
end class
此代码非常易懂。页面加载时将创建一个 web 服务代理实例,然后用该实例两次调用一个名为 method1 的 web 方法。method1 只返回包含传递给该方法的输入参数的字符串。为了向该系统添加一定程度的延迟,method1 在返回字符串之前还休眠了 3 秒钟。从调用返回到 method1 的字符串被放在 aspx 页面上的两个标签的文本中。该页面提供的性能极差,并且像一块海绵一样从进程线程池中吸取线程。由于在 method1 web 方法中有 3 秒钟的延迟,对该页面的一个调用至少要 6 秒钟才能完成。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器