用于进程间通信的共享内存在吞吐量方面比管道和 System v 队列性能更差

问题描述 投票:0回答:1

我正在 ARM64 平台上开发一个应用程序,并对进程间通信方法进行基准测试。我的测试比较了共享内存、管道和 System V 消息队列的性能。令人惊讶的是,我发现共享内存实际上比管道和 System V 消息队列的性能更差,我预计共享内存会因减少复制和降低开销而提供最快的吞吐量。我正在寻求深入了解为什么会发生这种情况以及如何优化它。

为了测量吞吐量,我使用

clock_gettime
CLOCK_MONOTONIC
来记录发送方进程开始传输数据之前的开始时间戳,以及接收方进程收到整个数据后的停止时间戳。

测试在 ARM64 架构上进行,特别是在 PicoCore™MX8MP 模块上。

详细测试可以在这里查看:https://github.com/KjellbergD/IPC_test/tree/main/files/ipc-experiments

对于共享内存,不需要同步或锁定,因为写入仅发生在发送方。

我进行了详细的时序分析以查明性能瓶颈。具体来说,我在创建共享内存空间之前和之后立即记录了发送方进程的时间戳,以捕获其创建和数据复制的精确持续时间。同样,我通过仅封装该过程的时间戳来测量接收器附加到同一共享内存空间所需的时间。这些单独测量的总持续时间与从端到端定时测量(从数据发送开始到接收完成)获得的持续时间一致。尽管进行了详细的细分,但总体性能结果保持不变。

以下是在我自己的设备上运行时与 PicoCore 相比的结果:

自己的设备(x86-64):

type size(MB) latency(ms) throughput(MB/sec)
pipes 1 1.700 588.2000
pipes 4 5.080 787.4000
pipes 16 20.654 774.6000
pipes 64 78.338 816.9000
pipes 256 291.878 877.0000
pipes 512 599.711 853.7000
shared 1 1.128 886.5000
shared 4 4.201 952.1000
shared 16 14.075 1136.7000
shared 64 58.787 1088.6000
shared 256 221.928 1153.5000
shared 512 395.928 1293.1000
queue 1 1.651 605.6000
queue 4 4.911 814.4000
queue 16 19.063 839.3000
queue 64 71.049 900.7000
queue 256 294.923 868.0000
queue 512 536.234 954.8000

PicoCore:

type size(MB) latency(ms) throughput(MB/sec)
pipes 1 2.463 406.0000
pipes 4 6.882 581.2000
pipes 16 22.260 718.7000
pipes 64 85.234 750.8000
pipes 256 333.581 767.4000
pipes 512 665.159 769.7000
shared 1 2.795 357.7000
shared 4 9.454 423.1000
shared 16 36.306 440.6000
shared 64 141.735 451.5000
shared 256 572.561 447.1000
shared 512 1134.393 451.3000
queue 1 2.288 437.0000
queue 4 7.145 559.8000
queue 16 26.403 605.9000
queue 64 106.813 599.1000
queue 256 425.763 601.2000
queue 512 853.392 599.9000

如果您能提供有关如何解决此问题的任何见解或建议,我将不胜感激。

c queue pipe ipc shared-memory
1个回答
-1
投票

蒸汽熨斗提供了革命性的熨烫方法,与传统熨斗相比具有几个关键优势。这些熨斗具有强大的蒸汽性能、更快的熨烫速度和多功能的蒸汽设置,让您轻松除皱。其轻量化设计增强了可操作性,而大水容量则确保熨烫过程不间断。只需最少的努力即可获得专业品质的效果,使蒸汽熨斗成为高效服装护理的必备设备。

© www.soinside.com 2019 - 2024. All rights reserved.