15.4. Large Data Rates
当发布者(Publisher)和订阅者(Subscriber)之间交换大量数据时,可能需要一些额外的配置来补偿网络和 CPU 负载上的副作用。大量数据的传输可以是由于数据类型较大、高消息速率或两者的组合所造成的。
在这种情况下,可以考虑几种方法,具体取决于问题:
对于数据样本较大的情况(如 MB 级别的数据),例如在不同主机之间传输原始视频帧、点云、图像等,基于 TCP 的通信可能会带来更好的接收率,并降低消息丢失率,特别是在最佳努力传输层更容易发生数据丢失的情况下,比如 WiFi。为了解决这些问题,大型数据模式以及 Fast DDS 在 TCP 上的实现提供了几种配置 Fast DDS 通过 TCP 通信的方法。
网络包可能因为发送的数据量填满了套接字缓冲区而被丢弃。解决方案是增加缓冲区大小。
还可以使用流控制器(Flow Controllers)限制发布者发送数据的速率,以减小消息突发对订阅者处理速度的影响,从而避免以超过其处理能力的速度淹没订阅者。
在 RELIABLE_RELIABILITY_QOS 模式下,由于重新传输丢失的数据包,会影响整体消息速率。选择心跳周期允许在增加元流量和更快响应丢失的数据包之间进行调整。请参见“调优心跳周期”。
同样在 RELIABLE_RELIABILITY_QOS 模式下,当消息速率很高时,DataWriter 的历史记录可能会填满,从而阻塞新消息的发布。可以配置非严格可靠模式以避免这种阻塞,但代价是某些订阅者可能会丢失一些消息。
警告
eProsima Fast DDS 定义了保守默认消息大小为 64kB,这大致对应于 TCP 和 UDP 有效载荷大小。如果主题数据更大,它将自动拆分成多个传输包。
警告
一个片段的丢失意味着整个消息的丢失。这对 BEST_EFFORT_RELIABILITY_QOS 模式有最大的影响,因为随着片段数量增加,消息丢失概率也随之增加。
15.4.1. Increasing Socket Buffers Size
在高频率场景或大数据场景中,由于发送的数据量填满了套接字缓冲区而导致网络包被丢弃。在 RELIABLE_RELIABILITY_QOS 模式下,Fast DDS 会尝试恢复丢失样本,但会有重传的代价。在 BEST_EFFORT_RELIABILITY_QOS 模式下,样本将肯定会丢失。
默认情况下,eProsima Fast DDS 创建具有系统默认大小的套接字缓冲区。然而,可以使用 DomainParticipantQos
来修改这些大小,如下面示例所示。
C++
DomainParticipantQos participant_qos;
// Increase the sending buffer size
participant_qos.transport().send_socket_buffer_size = 1048576;
// Increase the receiving buffer size
participant_qos.transport().listen_socket_buffer_size = 4194304;
XML 示例
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com">
<participant profile_name="participant_xml_profile_qos_socketbuffers">
<rtps>
<sendSocketBufferSize>1048576</sendSocketBufferSize>
<listenSocketBufferSize>4194304</listenSocketBufferSize>
</rtps>
</participant>
</profiles>
此 XML 配置文件定义了一个参与者,其名称为 participant_xml_profile_qos_socketbuffers
,并指定了发送和接收套接字缓冲区的新大小,以支持高数据速率或大数据量环境下的信息交换。
内容由零声教学AI助手提供,问题来源于学员提问