具有异步UDP操作的.NET IOCP ThreadPool开销
|
我已经开发了一种VoIP媒体服务器,该服务器可以与远程SIP端点交换RTP数据包。它需要很好地扩展-尽管我最初担心我的C#实现不会接近它所替代的C ++版本,但我已经使用各种分析器来磨练实现,并且性能非常接近。
我通过创建可重用对象池来限制大多数对象分配,我使用ReceiveFromAsync和SendToAsync发送/接收数据报,并且使用生产者/消费者队列在系统中传递RTP数据包。现在,在配备2个2.4GHz Xeon处理器的计算机上,我可以处理大约1000个并发流,每个流每秒发送/接收50个数据包。但是,迭代配置文件/调整/配置文件让我着迷了-我相信那里的效率更高!
触发处理的事件是在SocketAsyncEventArgs上调用Completed委托-该委托又通过处理管道发送RTP数据包。
剩下的令人沮丧的是,IOCP线程池中似乎存在大量开销。探查器显示,“我的代码”中只有72%的“包含采样”时间-在此之前的时间似乎是线程池开销(下面的堆栈帧)。
因此,我的问题是:
我在我的理解中缺少什么吗?
可以减少这种开销吗?
是否可以替换异步套接字函数使用的线程池,以使用开销较小的自定义轻量级线程池?
100%MediaGateway
95.35%Thread :: intermediateThreadProc(无效*)
88.37%ThreadNative :: SetDomainLocalStore(class Object *)
88.37%BindIoCompletionCallbackStub(无符号长,无符号长,结构_OVERLAPPED *)
86.05%BindIoCompletionCallbackStubEx(无符号长,无符号长,结构_OVERLAPPED *,int)
86.05%ManagedThreadBase :: ThreadPool(结构ADID,void(*)(void *),void *)
86.05%CrstBase :: Enter(无效)
86.05%AppDomainStack :: PushDomain(结构ADID)
86.05%Thread :: ShouldChangeAbortToUnload(类框架*,类框架*)
86.05%AppDomainStack :: ClearDomainStack(无效)
83.72%ThreadPoolNative :: CorWaitHandleCleanupNative(void *)
83.72%__CT ?? _ R0PAVEEArgumentException @@@ 84
83.72%DispatchCallDebuggerWrapper(unsigned long *,unsigned long,unsigned long *,unsigned
__int64,void *,无符号__int64,无符号int,无符号char *,类ContextTransitionFrame *)
83.72%DispatchCallBody(unsigned long *,unsigned long,unsigned long *,unsigned __int64,void *,unsigned __int64,unsigned int,unsigned char *)
83.72%MethodDesc :: EnsureActive(无效)
81.40%_CallDescrWorker @ 20
81.40%System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint32,uint32,值类型System.Threading.NativeOverlapped *)
76.74%System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(uint32,uint32,valuetype System.Threading.NativeOverlapped *)
76.74%System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(值类型System.Net.Sockets.SocketError,int32,值类型System.Net.Sockets.SocketFlags)
74.42%System.Threading.ExecutionContext.Run(类System.Threading.ExecutionContext,类System.Threading.ContextCallback,对象)
72.09%System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(对象)
72.09%System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(类System.Net.Sockets.SocketAsyncEventArgs)
没有找到相关结果
已邀请:
2 个回复
席陋临拈
禽兢玫坞劲