我正在尝试衡量Web服务的吞吐量.
为了做到这一点,我编写了一个小工具,可以连续发送请求并从多个线程中读取响应.
每个线程的内部循环的内容如下所示:
public void PerformRequest()
{
WebRequest webRequest = WebRequest.Create(_uri);
webRequest.ContentType = "application/ocsp-request";
webRequest.Method = "POST";
webRequest.Credentials = _credentials;
webRequest.ContentLength = _request.Length;
((HttpWebRequest)webRequest).KeepAlive = false;
using (Stream st = webRequest.GetRequestStream())
st.Write(_request, 0, _request.Length);
using (HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse())
using (Stream responseStream = httpWebResponse.GetResponseStream())
using (BufferedStream bufferedStream = new BufferedStream(responseStream))
using (BinaryReader reader = new BinaryReader(bufferedStream))
{
if (httpWebResponse.StatusCode != HttpStatusCode.OK)
throw new WebException("Got response status code: " + httpWebResponse.StatusCode);
byte[] response = reader.ReadBytes((int)httpWebResponse.ContentLength);
httpWebResponse.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,除了似乎有限制工具.如果我使用每40个线程运行该工具的两个实例,那么我获得的吞吐量明显高于具有80个线程的一个实例.
我找到了ServicePointManager.DefaultConnectionLimit属性,我设置为10000(如果我按照Jader …
我在Visual Studio 2010和Mono Develop 2.8上都开发了一个C#服务器.NET Framework 4.0
看起来这台服务器在Windows上比在Linux上表现得更好(在可扩展性方面).我使用Apache的ab工具在本机Windows(12个物理内核),8和12个内核Windows和Ubuntu虚拟机上测试了服务器可扩展性.
窗口响应时间非常平坦.当并发级别接近/克服核心数量时,它开始上升.
由于某种原因,Linux的响应时间要糟糕得多.从并发级别5开始,它们几乎呈线性增长.此外,8核和12核Linux VM的行为也相似.
所以我的问题是:为什么它在Linux上表现更差?(我该如何解决这个问题?).
请查看附带的图表,它显示了满足75%请求的平均时间作为请求并发的函数(范围栏设置为50%和100%).

我有一种感觉,这可能是由于mono的垃圾收集器.我尝试使用GC设置,但我没有成功.有什么建议吗?
一些其他背景信息:服务器基于HTTP侦听器,可快速解析请求并在线程池上对它们进行排队.线程池负责用一些密集的数学回复那些请求(计算约10秒的答案).