试pȝWindow 2003 Server ,IIS 6.0 ,ASP.Net 3.5 sp1
Dual 1.8双核Q?G内存Q?4G虚拟内存?/p>
Z探寻IIS的最大ƈ发数Q先要做几个假设?/p>
1、假设最大ƈ发数是当前的连接数。意思是当前能承受最大的q接Q那么就表明最大的q发?br />
2、假设IIS应用E序池处于默认状态,更改讄会(x)Ҏ(gu)大连接数产生影响?/p>
做完假设Q现在做限制Q设|站点保持HTTPq接Q超时设|成0Q就是不?x)超时。在站点h的default.aspx面讄U程Thread.Sleep(int.MaxValue)Q接下来开发一个用来保持连接的程序?/p>

Code
class Program {
private volatile static int errorCount = 0;
private volatile static int rightCount = 0;
static void Main(string[] args) {
ServicePointManager.DefaultConnectionLimit = 10000;
int count = 0;
int all = 0;
while (true) {
all++; count++;
CreateThread();
Thread.Sleep(10);
if (count >= 200) {
Console.WriteLine(string.Format("sucess:{0};error:{1}", all - errorCount, errorCount));
count = 0;
}
if (all > 1800)
break;
}
Console.ReadKey();
}
static void CreateThread() {
Thread thread = new Thread(ActiveRequest);
thread.IsBackground = true;
thread.Start();
}
static void ActiveRequest() {
RequestClient client = new RequestClient("http://192.168.18.2/default.aspx?d=" + Guid.NewGuid());
client.RequestProcess();
if (client.IsError) {
errorCount++;
Console.WriteLine(string.Format("错误消息:{0}", client.Messages));
} else {
rightCount++;
//Console.WriteLine(client.Messages);
}
}
}
/**
* author : yurow
* http://birdshover.cnblogs.com
* description:
*
* history : created by yurow 2009-8-16 0:29:05
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace MaxLinked {
/// <summary>
///
/// </summary>
public class RequestClient {
HttpWebRequest request;
WebResponse response;
public RequestClient(string url) {
request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Timeout = int.MaxValue;
request.KeepAlive = true;
ErrorCode = -1;
}
public void AddHeader(string name, string value) {
request.Headers.Add(name, value);
}
private bool isError = false;
private StringBuilder buffer = new StringBuilder();
public int ErrorCode { get; set; }
public bool IsError {
get { return isError; }
}
public string Messages {
get { return buffer.ToString(); }
}
public void RequestProcess() {
try {
response = request.GetResponse();
} catch (WebException ex) {
ErrorCode = (int)ex.Status;
buffer.Append(ex.Message);
isError = true;
}
if (response != null) {
Stream stream = null;
StreamReader reader = null;
try {
//stream = response.GetResponseStream();
//reader = new StreamReader(stream, Encoding.UTF8);
//buffer.Append(reader.ReadToEnd());
} catch (Exception ex) {
buffer.Append(ex.Message);
isError = true;
} finally {
//if (reader != null)
// reader.Close();
//if (stream != null)
// stream.Close();
}
} else {
isError = true;
buffer.Append("建立q接p|Q?/span>");
}
}
public void Close() {
if (response != null)
response.Close();
request.Abort();
}
}
}
E序讄为只能启?800个线E,q是׃.Net单进E最大线E数好像?000个。因此,要测试最大ƈ发数Q要需要同时开几个试q程。把pȝ虚拟内存调到最大|U程q多?x)急剧占用内存。现在开始测试?/p>
打开web站点的性能计数器,把显C比例调?万?/p>
发现?000个连接时QIIS服务器崩溃(503错误Q,L了个澡,发现IIS服务器无法自׃复错误。又试了几ơ,发现最大ƈ发值是8200个,但是一般到5000左右׃(x)崩溃Q有时候甚臛_?000个?/p>
?200个计,一个用户开一个浏览器览|页Q可能会(x)占用2?个连接(参考?a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" class="postTitle2" >IISq接数实验——Web开发必?/span> 》),按两个计,那么IIS默认情况下,最大ƈ发数?000个左叟?/p>
打开应用E序池配|,把最大工作进E数调高Q默认ؓ(f)1Q,能有效提高最大连接数。我记得以前看过一文章,讲的是调?左右比较合适?/p>