Performance 本地IPC的平均性能度量

Performance 本地IPC的平均性能度量,performance,sockets,tcp,ipc,rpc,Performance,Sockets,Tcp,Ipc,Rpc,我们现在正在评估当前项目的不同IPC(或者更确切地说是RPC)方法,该项目处于非常早期的阶段。性能是一件大事,所以我们正在做一些测量来帮助我们的选择。我们将进行通信的进程将驻留在同一台机器上 一个单独的有效选项是完全避免IPC(通过将一个进程的功能封装在.NET DLL中,并让另一个进程使用它),但这是我们真正希望避免的选项,因为这两个软件是由两个单独的公司开发的,我们发现维护良好的“围栏”非常重要,他们是好邻居 我们的测试包括使用每种方法跨进程边界传递消息(包含大小不同的blob)。以下是我们

我们现在正在评估当前项目的不同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序列化消息。我们已经确定,这也提供了令人满意的结果


@user289770,我想你有相当大的有效负载,否则你也会对延迟感兴趣。@user289770,你测量过包括协议开销在内的传输速率,还是只测量有效负载?你估计过你有多少开销吗?@Albin,是的,我的许多邮件都有相当大的有效负载(可能高达30MB)。其余的将是几KBs。我已经测量了传输速率,包括协议开销——这就是重点。对不起,我可能误解了这个问题:以MBs为单位的大小仅指有效负载。测量的时间包括所有内容,包括任何开销。您可以尝试通过udp进行远程处理以进行比较吗?