Performance 本地IPC的平均性能度量
我们现在正在评估当前项目的不同IPC(或者更确切地说是RPC)方法,该项目处于非常早期的阶段。性能是一件大事,所以我们正在做一些测量来帮助我们的选择。我们将进行通信的进程将驻留在同一台机器上 一个单独的有效选项是完全避免IPC(通过将一个进程的功能封装在.NET DLL中,并让另一个进程使用它),但这是我们真正希望避免的选项,因为这两个软件是由两个单独的公司开发的,我们发现维护良好的“围栏”非常重要,他们是好邻居 我们的测试包括使用每种方法跨进程边界传递消息(包含大小不同的blob)。以下是我们得到的数据(性能范围与消息大小范围相关):Performance 本地IPC的平均性能度量,performance,sockets,tcp,ipc,rpc,Performance,Sockets,Tcp,Ipc,Rpc,我们现在正在评估当前项目的不同IPC(或者更确切地说是RPC)方法,该项目处于非常早期的阶段。性能是一件大事,所以我们正在做一些测量来帮助我们的选择。我们将进行通信的进程将驻留在同一台机器上 一个单独的有效选项是完全避免IPC(通过将一个进程的功能封装在.NET DLL中,并让另一个进程使用它),但这是我们真正希望避免的选项,因为这两个软件是由两个单独的公司开发的,我们发现维护良好的“围栏”非常重要,他们是好邻居 我们的测试包括使用每种方法跨进程边界传递消息(包含大小不同的blob)。以下是我们
- Web服务(HTTP上的SOAP):
- 25-30 MB/s当二进制数据编码为Base64时(默认)
- 70-100 MB/s使用MTOM时
- .NET远程处理(TCP上的二进制格式化程序):100-115 MB/s
- 控制组-DLL方法调用+内存复制:800-1000 MB/s
现在,我们到处寻找这些(和其他)IPC方法的平均性能数据,包括原始TCP环回套接字的性能,但找不到任何数据。这些数字看起来正常吗?为什么这些本地IPC方法的性能至少比复制内存慢10倍?即使使用原始套接字,也无法获得更好的结果-TCP的开销有那么大吗?共享内存是最快的
生产者进程可以将其输出放入进程之间共享的内存中,并通知其他进程共享的数据已经更新。在Linux上,您自然会将互斥锁和条件变量放在同一共享内存中,以便其他进程可以等待条件变量的更新。内存映射文件+同步对象是正确的选择(与共享内存几乎相同,但具有更多控制)。套接字对于本地通信来说太慢了。尤其是有时,使用localhost的网络驱动程序比通过网络的慢
- 我们系统的几个部分已经过重新设计,因此我们不必传递30MB的消息,而是3MB的消息。这使我们可以选择使用BinaryFormatter而不是命名管道(IpcChannel)进行.NET远程处理,从而获得令人满意的结果
- 我们的应急计划(万一我们确实需要传递30MB消息)是通过命名管道手动传递protobuf序列化消息。我们已经确定,这也提供了令人满意的结果