我正嘗試儘可能多的排擠我的UDP數據收集套接字儘可能使用下面的代碼:高性能UDP服務.NET
public void Start()
{
if (socket == null) Open();
this.stats.PositionServerStarted = DateTime.Now;
this.state = SocketWorkerState.Running;
AsyncBeginReceive();
}
private void AsyncBeginReceive()
{
DataPacket dataPacket = new DataPacket(socket, this.settings.IPAddress,
this.settings.Port, SocketWorker.MaxDataRead);
Interlocked.Increment(ref stats.ProcessingThreads);
socket.BeginReceiveFrom(dataPacket.BytePacket, 0,
SocketWorker.MaxDataRead, SocketFlags.None,
ref dataPacket.RemoteEndPoint, new AsyncCallback(AsyncEndReceive),
dataPacket);
}
private void AsyncEndReceive(IAsyncResult ar)
{
DataPacket dataPacket= null;
AsyncBeginReceive();
dataPacket = (DataPacket)ar.AsyncState;
dataPacket.EnteredQueue = DateTime.Now;
dataPacket.DataLength= dataPacket.SourceSocket.EndReceiveFrom(ar,
ref dataPacket.RemoteEndPoint);
Interlocked.Decrement(ref stats.ProcessingThreads);
Interlocked.Increment(ref this.stats.PacketsQueued);
ThreadPool.QueueUserWorkItem(new WaitCallback(OnPacketArrived),
dataPacket);
Interlocked.Decrement(ref this.stats.PacketsQueued);
}
private void OnPacketArrived(object packet)
{
//go ahead and process the packet
}
有沒有人對如何改進這個任何想法?從AsyncEndReceive()
撥打AsyncBeginReceive()
認爲是最佳做法?
我已經調整了線程池來
ThreadPool.SetMinThreads(20,20);
ThreadPool.SetMaxThreads(250, 250);
但如果我說實話這似乎並沒有對性能產生很大的影響。
如何從UDP套接字中讀取「更大的塊」,您要麼獲取整個數據報,要麼不是。 – 2011-02-10 17:59:26
更改mtu尺寸? – AnthonyLambert 2011-10-11 12:48:51