cyclonedds与shm

执行步骤

1、sudo apt install cmake libacl1-dev libncurses5-dev pkg-config maven

2、下载iceoryx

git clone https://github.com/eclipse-iceoryx/iceoryx.git -b release_2.0
cd iceoryx
cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DBUILD_SHARED_LIBS=ON -Hiceoryx_meta

cmake --build build --config Release --target install

3、下载cyclonedds

git clone https://github.com/eclipse-cyclonedds/cyclonedds.git
cd cyclonedds
cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DBUILD_EXAMPLES=On -DCMAKE_PREFIX_PATH=~/iceoryx/install/
cmake --build build --config Release --target install

4、共享内存的配置和通信中间件的切换

共享内存服务的性能在很大程度上取决于其性能 它的配置与要求它支持的用例相匹配。通过配置 正确共享内存,可以大幅提高性能。

冰羚的记忆被布置为固定大小的片段的数量,这些片段是 冰羚羊的记忆池。当订阅者从 iceoryx 请求内存块时, 适合所需尺寸(并且可用)的最小块提供给 池中的订阅者。如果找不到满足这些要求的块, 请求块的发布者给出错误并中止进程。

默认配置具有不同数量和大小的块,最大可达 4MiB。冰羚羊 未提供合适的配置时回退到此配置 文件,或者在默认位置找不到。

下面是一个内存池为 2^15 的 iceoryx 配置文件的示例 块,可以存储 16384 字节的数据类型(+64 字节标头 = 16448 字节块):

[general]
version = 1

[[segment]]

[[segment.mempool]]
size = 16448
count = 32768

将此文件另存为主目录中的 iox_config.toml

Cyclone DDS 也需要正确配置,以允许它使用共享内存交换。

export CYCLONEDDS_URI=path/cyclonedds.xml

<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/iceoryx/etc/cyclonedds.xsd">
    <Domain id="any">
        <SharedMemory>
            <Enable>true</Enable>
            <LogLevel>info</LogLevel>
        </SharedMemory>
    </Domain>
</CycloneDDS>
  • 将 Tracing::Category 设置为 shm 会显示与共享内存相关的 Cyclone DDS 日志,而 SharedMemory::LogLevel 决定 iceoryx 显示的日志级别:
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/iceoryx/etc/cyclonedds.xsd">
    <Domain id="any">
        <Tracing>
            <Category>shm</Category>
            <OutputFile>stdout</OutputFile>
        </Tracing>
        <SharedMemory>
            <Enable>true</Enable>
            <LogLevel>info</LogLevel>
        </SharedMemory>
    </Domain>
</CycloneDDS>

5、示例使用

  • 打开一个新终端,使用RouDi
~/iceoryx/build/iox-roudi -c iox_config.toml
  • 打开一个新终端,运行发布服务器。
export LD_LIBRARY_PATH=~/iceoryx/install/lib/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
export CYCLONEDDS_URI=file://cyclonedds.xml
~/cyclonedds/build/bin/ShmThroughputPublisher 16384 0 1 10 "Throughput example"
  • 打开一个新终端,运行订阅者。
export LD_LIBRARY_PATH=~/iceoryx/install/lib/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
export CYCLONEDDS_URI=file://cyclonedds.xml
~/cyclonedds/build/bin/ShmThroughputSubscriber 10 0 "Throughput example" 16384

相对性能取决于许多因素,例如:

  • 邮件大小
  • Iceoryx 内存池配置
  • 进行的其他交换次数
  • 等等

因此,个别结果可能有所不同

6、共享内存的限制

由于数据在共享内存上交换的方式,有一些 需要限制可以交换的数据类型,并需要交付以确保其正确性功能。
  • 固定大小的数据类型:

要交换的数据类型需要具有固定大小。这排除了 在数据类型的任何级别使用字符串和序列。这并不能阻止 数组的使用,因为它们的大小在编译时是固定的。如果这些类型中的任何一种 在生成数据类型的 IDL 代码中遇到成员变量, 共享内存交换已禁用。

此限制的可能解决方法是使用固定大小的字符数组 而不是字符串(以及代替序列的其他类型的数组),并接受 开销。

  • 数据交换:

在这里插入图片描述

  • 进一步的限制是每个进程的最大订阅数 Iceoryx服务是127。

7、iceoryx内部事件

要了解Eclipse iceoryx服务的内部事件,请点击此处 是来自Iceoryx的有用工具,称为Iceoryx Introspection

~/iceoryx/build/iox-introspection-client --all

猜你喜欢

转载自blog.csdn.net/yiyu20180729/article/details/132111151