【发布时间】:2011-10-17 23:33:17
【问题描述】:
我使用 HttpListener 作为一个简单的 http 服务器。我一直在通过让 HttpListener 向每个请求返回字符串“OK”来对请求/秒性能进行基准测试——这已经达到每秒 16,000 个请求的限制。基于以下代码,我可以做些什么来进一步优化性能?还是我们达到了 Windows Http.sys 的极限?
图片上传不工作,这里是 Visual Studio 性能跟踪的链接:
Public Class HTTPServer
Shared Listener As HttpListener = New HttpListener
Public Shared Sub Start()
ServicePointManager.DefaultConnectionLimit = 500
ServicePointManager.Expect100Continue = False
ServicePointManager.MaxServicePoints = 500
Listener.Prefixes.Add("http://localhost/")
Listener.Start()
For i As Integer = 1 To (System.Environment.ProcessorCount * 2)
Dim NewThread As New System.Threading.Thread(AddressOf ListenerThread)
NewThread.Priority = ThreadPriority.Normal
NewThread.IsBackground = True
NewThread.Start()
Next
End Sub
Private Shared Sub ListenerThread()
Dim SyncResult As IAsyncResult
While True
SyncResult = Listener.BeginGetContext(New AsyncCallback(AddressOf ListenerCallback), Listener)
SyncResult.AsyncWaitHandle.WaitOne()
End While
End Sub
Private Shared Sub ListenerCallback(ByVal StateObject As IAsyncResult)
Dim Listener As HttpListener = DirectCast(StateObject.AsyncState, HttpListener)
Dim Context As HttpListenerContext = Listener.EndGetContext(StateObject)
Dim Request As HttpListenerRequest = Context.Request
Dim Response As HttpListenerResponse = Context.Response
Dim ResponseString As String = "OK"
Dim Buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(ResponseString)
Response.ContentLength64 = Buffer.Length
Dim OutputStream As System.IO.Stream = Response.OutputStream
OutputStream.Write(Buffer, 0, Buffer.Length)
OutputStream.Close()
OutputStream.Dispose()
End Sub
End Class
【问题讨论】:
-
对不起,你是怎么得到每秒 16K 的请求的?我用 300 个并行请求进行了测试,每 40 秒收到 30K 个请求。并使用 Pylot 对 1-500 个代理进行压力测试,每秒收到约 250 个请求。请解释一下;)我在同一台机器(本地主机)上进行的所有测试。我做错了什么?谢谢!!!
-
P.S.我从一个线程(只有一个并行线程)发出 16K 请求,大约 54 秒完成;我不明白:)))
-
现在我每 2-4 秒收到约 13-16K 请求)))据我所知,由于增量锁定、跟踪文件等,我的第一次测试很慢;我删除了所有这些“垃圾”:)
标签: vb.net iis httplistener