我开发了一个 VoIP 媒体服务器,它与远程 SIP 端点交换 RTP 数据包。它需要很好地扩展 - 虽然我最初担心我的 C# 实现不会接近它所取代的 C++ 版本,但我使用了各种分析器来磨练实现并且性能非常接近。
我通过创建可重用对象池来限制大多数对象分配,我正在使用 ReceiveFromAsync 和 SendToAsync 来发送/接收数据报,并且我正在使用生产者/消费者队列在系统中传递 RTP 数据包。在具有 2 个 2.4GHz Xeon 处理器的机器上,我现在可以处理大约 1000 个并发流,每个流每秒发送/接收 50 个数据包。然而,迭代配置文件/调整/配置文件让我着迷 - 我确信那里的效率更高!
触发处理的事件是在 SocketAsyncEventArgs 上调用 Completed 委托 - 后者又通过处理管道发送 RTP 数据包。
剩下的令人沮丧的是,IOCP 线程池中的开销似乎很大。分析器显示只有 72% 的包容性采样时间在“我的代码”中 - 之前的时间似乎是线程池开销(下面的堆栈帧)。
所以,我的问题是:
- 我的理解是否遗漏了什么?
- 是否可以减少这种开销?
- 是否可以将异步套接字函数使用的线程池替换为使用开销较小的自定义轻量级线程池?
100% 媒体网关
95.35% 线程::intermediateThreadProc(void *)
88.37% ThreadNative::SetDomainLocalStore(类对象 *)
88.37% BindIoCompletionCallbackStub(unsigned long,unsigned long,struct _OVERLAPPED *)
86.05% BindIoCompletionCallbackStubEx(unsigned long,unsigned long,struct _OVERLAPPED *,int)
86.05% ManagedThreadBase::ThreadPool(struct ADID,void (*)(void *),void *)
86.05% CrstBase::Enter(无效)
86.05% AppDomainStack::PushDomain(struct ADID)
86.05% Thread::ShouldChangeAbortToUnload(class Frame *,class Frame *)
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 *,unsigned __int64,unsigned int,unsigned char *,class ContextTransitionFrame *)
83.72% DispatchCallBody(unsigned long *,unsigned long,unsigned long *,unsigned __int64,void *,unsigned __int64,unsigned int,unsigned char *)
83.72% MethodDesc::EnsureActive(void)
81.40% _CallDescrWorker@20
81.40% System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint32,uint32,valuetype System.Threading.NativeOverlapped*)
76.74% System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(uint32,uint32,valuetype System.Threading.NativeOverlapped*)
76.74% System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(valuetype System.Net.Sockets.SocketError,int32,valuetype System.Net.Sockets.SocketFlags)
74.42% System.Threading.ExecutionContext.Run(类 System.Threading.ExecutionContext,类 System.Threading.ContextCallback,对象)
72.09% System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(object)
72.09% System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(类 System.Net.Sockets.SocketAsyncEventArgs)