【问题标题】:IPC speed and compareIPC速度和比较
【发布时间】:2011-02-20 16:37:08
【问题描述】:

我正在尝试实现一个涉及跨不同模块的 IPC 的实时应用程序。这些模块正在执行一些数据密集型处理。我在原型中使用消息队列作为 IPC 的主干(Activemq),这很容易(考虑到我完全是 IPC 新手),但它非常非常慢。

这是我的情况:

  • 我已隔离 IPC 部分,以便将来可以通过其他方式进行更改。
  • 我有 3 周的时间来实施另一个更快的版本。 ;-(
  • IPC 应该很快,但也比较容易上手

我一直在研究不同的 IPC 方法:套接字、管道、共享内存。但是,我没有 IPC 方面的经验,而且我绝对不可能在 3 周内让这个演示失败……从哪个 IPC 开始比较安全?

谢谢。 百合

【问题讨论】:

    标签: sockets ipc real-time shared-memory pipe


    【解决方案1】:

    使用 共享内存 解决方案可获得最佳效果。

    最近我遇到了同样的IPC benchmarking。而且我认为我的结果对所有想要比较 IPC 性能的人都有用。

    管道基准:

    Message size:       128
    Message count:      1000000
    Total duration:     27367.454 ms
    Average duration:   27.319 us
    Minimum duration:   5.888 us
    Maximum duration:   15763.712 us
    Standard deviation: 26.664 us
    Message rate:       36539 msg/s
    

    FIFO(命名管道)基准测试:

    Message size:       128
    Message count:      1000000
    Total duration:     38100.093 ms
    Average duration:   38.025 us
    Minimum duration:   6.656 us
    Maximum duration:   27415.040 us
    Standard deviation: 91.614 us
    Message rate:       26246 msg/s
    

    消息队列基准测试:

    Message size:       128
    Message count:      1000000
    Total duration:     14723.159 ms
    Average duration:   14.675 us
    Minimum duration:   3.840 us
    Maximum duration:   17437.184 us
    Standard deviation: 53.615 us
    Message rate:       67920 msg/s
    

    共享内存基准测试:

    Message size:       128
    Message count:      1000000
    Total duration:     261.650 ms
    Average duration:   0.238 us
    Minimum duration:   0.000 us
    Maximum duration:   10092.032 us
    Standard deviation: 22.095 us
    Message rate:       3821893 msg/s
    

    TCP 套接字基准测试:

    Message size:       128
    Message count:      1000000
    Total duration:     44477.257 ms
    Average duration:   44.391 us
    Minimum duration:   11.520 us
    Maximum duration:   15863.296 us
    Standard deviation: 44.905 us
    Message rate:       22483 msg/s
    

    Unix 域套接字基准测试:

    Message size:       128
    Message count:      1000000
    Total duration:     24579.846 ms
    Average duration:   24.531 us
    Minimum duration:   2.560 us
    Maximum duration:   15932.928 us
    Standard deviation: 37.854 us
    Message rate:       40683 msg/s
    

    ZeroMQ 基准测试:

    Message size:       128
    Message count:      1000000
    Total duration:     64872.327 ms
    Average duration:   64.808 us
    Minimum duration:   23.552 us
    Maximum duration:   16443.392 us
    Standard deviation: 133.483 us
    Message rate:       15414 msg/s
    

    【讨论】:

      【解决方案2】:

      我自己也遇到过类似的问题。

      我发现以下页面很有帮助 - IPC performance: Named Pipe vs Socket(特别是)和 Sockets vs named pipes for local IPC on Windows?

      听起来大家一致认为,如果您真的关心性能,那么共享内存是可行的方法,但如果您拥有的当前系统是一个消息队列,那么它可能是一个相当不错的选择。 ..不同的结构。套接字和/或命名管道可能更容易实现,如果其中任何一个符合您的规范,那么您就完成了。

      【讨论】:

        【解决方案3】:

        在 Windows 上,您可以使用 WM_COPYDATA,这是一种特殊的基于共享内存的 IPC。这是一种古老但简单的技术:“进程 A”发送一条消息,其中包含指向其内存中某些数据的指针,并等待“进程 B”处理(抱歉)该消息,例如创建数据的本地副本。这种方法非常快,并且也适用于 Windows 8 Developer Preview(请参阅我的 benchmark)。任何类型的数据都可以通过这种方式传输,即在发送方对其进行序列化,并在接收方对其进行反序列化。实现发送方和接收方消息队列也很简单,使通信异步。

        【讨论】:

        • 根据你的基准,我只是想知道,为什么win7的性能这么差。
        • 因为它是一款上网本,速度相对较慢,单核 Atom CPU
        【解决方案4】:

        您可以查看这篇博文https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

        基本上,它比较了 Enduro/X,后者基于 POSIX 队列(内核队列 IPC)与 ZeroMQ,后者可以同时在几个不同的传输类上传递消息,包括。 tcp://(网络套接字)、ipc://inproc://pgm://epgm:// 用于多播。

        从图表中您可能会看到,在队列上运行的较大数据包 Enduro/X 有时会胜过套接字。

        两个系统都运行良好,每秒约 400 000 条消息,但 5KB 消息时,内核队列运行得更好。

        (图片来源:https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/


        更新: 另一个更新作为对下面评论的回答,我也重新运行了测试以在 ipc:// 上运行 ZeroMQ,见图:

        我们看到 ZeroMQ ipc:// 更好,但在某些范围内 Enduro/X 再次显示更好的结果,然后 ZeroMQ 再次接管。

        因此我可以说 IPC 的选择取决于您计划做的工作。

        注意 ZeroMQ IPC 在 POSIX 管道上运行。 Enduro/x 在 POSIX 队列上运行。

        【讨论】:

        • 让我问一下,你注意到了吗,引用的测试/比较在同一个传输类上没有使用 ZeroMQ(试图比较一个tcp://ipc:// )?您能否提供一个公平的苹果对苹果的比较结果,其中 Enduro/X 和 ZeroMQ 都使用 IPC
        • 见上,我用ipc://重新测试过
        • +1 照顾。 Enduro/X 如何在混合了多个传输类的分布式系统中处理 BLOB 的情况下工作 - tcp://(用于集群分布式 SIG)+inproc://(用于最快/最低延迟的进程内消息传递)+epgm://(用于最终内容流)?性能扩展如何工作 - 一旦在给定数量的 I/O 线程下添加 2、4、8、16、32、64、128、256、512、1024 个对等点(.Context() 引擎可以运行)?
        • Enduro/X 使用 tcp 桥接多达 32 个集群服务器节点。每个集群节点在进程之间执行本地 IPC(如上图)。进程是由应用程序服务器控制的单独的可执行副本(因此,如果任何二进制文件死亡,则可以提供负载平衡和容错)。 Enduro/X 不做任何多播形式(XATMI 服务的订阅/发布事件范例除外)。因此需要终端设备的多播,然后开发人员需要创建适配器 XATMI 服务器或客户端来自己进行 epgm 流。在此处查看自述文件github.com/endurox-dev/endurox
        • 为了满足 user3666197 的要求,您可以结合 Enduro/X 作为应用服务器、ipc:// 和 tcp:// 传输。而对于 epgm:// 你可以使用 ZeroMQ。两个系统都支持 BLOB 处理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2020-05-26
        • 2018-02-14
        • 2020-05-10
        • 1970-01-01
        相关资源
        最近更新 更多