DDS QoS - LATENCY_BUDGET

https://download.csdn.net/download/eidolon_foot/12568768

8. LATENCY_BUDGET

OpenDDS:

The LATENCY_BUDGET policy applies to topic, data reader, and data writer entities via the latency_budget member of their respective QoS policy structures. Below is the IDL related to the LatencyBudget QoS policy:
延迟预算策略通过其各自的QoS策略结构的延迟预算成员应用于主题、数据读取器和数据写入器实体。下面是与LatencyBudget QoS策略相关的IDL:
struct LatencyBudgetQosPolicy {
Duration_t duration;
};
The default value of duration is zero indicating that the delay should be minimized. This policy is considered a hint to the transport layer to indicate the urgency of samples being sent. OpenDDS uses the value to bound a delay interval for reporting unacceptable delay in transporting samples from publication to subscription. This policy is used for monitoring purposes only at this time. Use the TRANSPORT_PRIORITY policy to modify the sending of samples. The data writer policy value is used only for compatibility comparisons and if left at the default value of zero will result in all requested duration values from data readers being matched.
duration的默认值为零,表示应该将延迟最小化。此策略被视为对传输层的提示,以指示发送样本的紧迫性。OpenDDS使用该值绑定一个延迟间隔,用于报告将样本从发布传输到订阅时的不可接受延迟。此策略目前仅用于监视目的。使用传输优先级策略修改样本的发送。数据写入器策略值仅用于兼容性比较,如果保留为默认值零,则将匹配来自数据读取器的所有请求持续时间值。
An additional listener extension has been added to allow reporting delays in excess of the policy duration setting. The OpenDDS::DCPS::DataReaderListener interface has an additional operation for notification that samples were received with a measured transport delay greater than the latency_budget policy duration. The IDL for this method is:
添加了一个附加的侦听器扩展,以允许报告超过策略持续时间设置的延迟。OpenDDS::DCPS::DataReaderListener接口有一个附加操作,用于通知收到的样本的传输延迟测量值大于latency_budget策略持续时间。该方法的IDL为:
struct BudgetExceededStatus {
long total_count;
long total_count_change;
DDS::InstanceHandle_t last_instance_handle;
};
void on_budget_exceeded(
in DDS::DataReader reader,
in BudgetExceededStatus status);
To use the extended listener callback you will need to derive the listener implementation from the extended interface, as shown in the following code fragment:
要使用扩展侦听器回调,需要从扩展接口派生侦听器实现,如以下代码片段所示:
class DataReaderListenerImpl
    : public virtual
      OpenDDS::DCPS::LocalObject<OpenDDS::DCPS::DataReaderListener>
 
Then you must provide a non-null implementation for the on_budget_exceeded() operation. Note that you will need to provide empty implementations for the following extended operations as well:
然后必须为on_budget_exceeded()操作提供非空实现。请注意,您还需要为以下扩展操作提供空实现:
on_subscription_disconnected()
on_subscription_reconnected()
on_subscription_lost()
on_connection_deleted()
OpenDDS also makes the summary latency statistics available via an extended interface of the data reader. This extended interface is located in the OpenDDS::DCPS module and the IDL is defined as:

OpenDDS还通过数据读取器的扩展接口提供了摘要延迟统计信息。此扩展接口位于OpenDDS::DCPS模块中,IDL定义为:

struct LatencyStatistics {
GUID_t publication;
unsigned long n;
double maximum;
double minimum;
double mean;
double variance;
};
typedef sequence<LatencyStatistics> LatencyStatisticsSeq;
local interface DataReaderEx : DDS::DataReader {
  /// Obtain a sequence of statistics summaries.
  void get_latency_stats( inout LatencyStatisticsSeq stats);
  /// Clear any intermediate statistical values.
  void reset_latency_stats();
  /// Statistics gathering enable state.
  attribute boolean statistics_enabled;
};
To gather this statistical summary data you will need to use the extended interface. You can do so simply by dynamically casting the OpenDDS data reader pointer and calling the operations directly. In the following example, we assume that reader is initialized correctly by calling DDS::Subscriber::create_datareader() :
要收集这些统计摘要数据,您需要使用扩展接口。您可以通过动态转换OpenDDS数据读取器指针并直接调用操作来实现。在下面的示例中,我们假设通过调用DDS::Subscriber::create_datareader()正确初始化了读取器:
DDS::DataReader_var reader;
// ...
// To start collecting new data.
dynamic_cast<OpenDDS::DCPS::DataReaderImpl*>(reader.in())->
reset_latency_stats();
dynamic_cast<OpenDDS::DCPS::DataReaderImpl*>(reader.in())->
statistics_enabled(true);
// ...
// To collect data.
OpenDDS::DCPS::LatencyStatisticsSeq stats;
dynamic_cast<OpenDDS::DCPS::DataReaderImpl*>(reader.in())->
get_latency_stats(stats);
for (unsigned long i = 0; i < stats.length(); ++i)
{
std::cout << "stats[" << i << "]:" << std::endl;
std::cout << " n = " << stats[i].n << std::endl;
std::cout << " max = " << stats[i].maximum << std::endl;
std::cout << " min = " << stats[i].minimum << std::endl;
std::cout << " mean = " << stats[i].mean << std::endl;
std::cout << " variance = " << stats[i].variance << std::endl;
}
formal/2015-04-10:
This policy provides a means for the application to indicate to the middleware the “urgency” of the data-communication. By having a non-zero duration the Service can optimize its internal operation.

此策略为应用程序提供了一种向中间件指示数据通信的“紧迫性”的方法。通过具有非零的持续时间,服务可以优化其内部操作。

This policy is considered a hint. There is no specified mechanism as to how the service should take advantage of this hint.
这项政策被认为是一个暗示。对于服务应该如何利用这个提示,没有指定的机制。
The value offered is considered compatible with the value requested if and only if the inequality “offered duration <= requested duration ” evaluates to ‘TRUE.’

当且仅当不等式“offered duration<=requested duration”的计算结果为“TRUE”时,才认为提供的值与请求的值兼容

用ChatGPT

《OpenDDS Developer's Guide》:

这段文字是从《OpenDDS Developer's Guide》版本3.14中关于“LATENCY_BUDGET”质量服务(QoS)策略的说明。现对其内容进行翻译及简要讲解:
3.2.15 延迟预算
LATENCY_BUDGET 策略适用于主题(Topic)、数据读取器(DataReader)和数据写入器(DataWriter)实体,通过它们各自的QoS策略结构中的 latency_budget 成员来实现。以下是与 LatencyBudget QoS策略相关的 IDL(接口定义语言)代码:

struct LatencyBudgetQosPolicy {
    Duration_t duration;
};

duration 的默认值为零,表示应该尽量减少延迟。这一策略被认为是对传输层的一个提示,以表明发送样本的紧迫性。OpenDDS 使用该值来限定报告从出版到订阅传输样本的不可接受延迟的时间间隔。目前,这一策略仅用于监测目的。要修改样本的发送,请使用 TRANSPORT_PRIORITY 策略。数据写入器的策略值仅用于兼容性比较,如果保留为零的默认值,将导致所有来自数据读取器的请求的持续时间值都能匹配。
已经添加了一个额外的监听器扩展,用于报告超出策略持续时间设置的延迟。OpenDDS::DCPS::DataReaderListener 接口新增了一个操作,用于通知样本被接收时测量到的传输延迟超过了 latency_budget 策略设定的持续时间。这个方法的 IDL 为:

struct BudgetExceededStatus {
    long total_count;
    long total_count_change;
    DDS::InstanceHandle_t last_instance_handle;
};
void on_budget_exceeded(
    in DDS::DataReader reader,
    in BudgetExceededStatus status);

要使用扩展的监听器回调,您需要从扩展接口派生出监听器的实现,如下代码片段所示:

class DataReaderListenerImpl
    : public virtual OpenDDS::DCPS::LocalObject<OpenDDS::DCPS::DataReaderListener>

然后必须为 on_budget_exceeded() 操作提供一个非空的实现。注意,还需要为空实现以下扩展操作:
- on_subscription_disconnected()
- on_subscription_reconnected()
- on_subscription_lost()
- on_connection_deleted()
OpenDDS 还通过数据读取器的一个扩展接口,提供了总结延迟统计信息。这个扩展接口位于 OpenDDS::DCPS 模块中,其 IDL 定义如下:

struct LatencyStatistics {
    GUID_t publication;
    unsigned long n;
    double maximum;
    double minimum;
    double mean;
    double variance;
};
typedef sequence<LatencyStatistics> LatencyStatisticsSeq;
local interface DataReaderEx : DDS::DataReader {
    /// 获取统计摘要序列。
    void get_latency_stats( inout LatencyStatisticsSeq stats);
    /// 清除任何中间统计值。
    void reset_latency_stats();
    /// 统计数据收集启用状态。
    attribute boolean statistics_enabled;
};

要收集这些统计摘要数据,需要使用扩展接口。可以通过动态转换 OpenDDS 数据读取器指针并直接调用这些操作来实现。在以下示例中,我们假设 reader 由调用 DDS::Subscriber::create_datareader() 正确地初始化:

DDS::DataReader_var reader;
// ...
// 开始收集新数据。
dynamic_cast<OpenDDS::DCPS::DataReaderImpl*>(reader.in())->reset_latency_stats();
dynamic_cast<OpenDDS::DCPS::DataReaderImpl*>(reader.in())->statistics_enabled(true);
// ...
// 收集数据。
OpenDDS::DCPS::LatencyStatisticsSeq stats;
dynamic_cast<OpenDDS::DCPS::DataReaderImpl*>(reader.in())->get_latency_stats(stats);
for (unsigned long i = 0; i < stats.length(); ++i)
{
    std::cout << "stats[" << i << "]:" << std::endl;
    std::cout << "n = " << stats[i].n << std::endl;
    std::cout << "max = " << stats[i].maximum << std::endl;
    std::cout << "min = " << stats[i].minimum << std::endl;
    std::cout << "mean = " << stats[i].mean << std::endl;
std::cout << "variance = " << stats[i].variance << std::endl;
}

这段代码用于动态转换数据读取器指针,以便收集和统计延迟数据。代码示例中:使用了 dynamic_cast 将 DDS::DataReader 类型的变量 reader 转换为 OpenDDS::DCPS::DataReaderImpl 类型,以便调用 reset_latency_stats 和 statistics_enabled 方法来重置统计信息并启用统计记录。
接着,使用 get_latency_stats 方法将收集到的统计信息填充到 OpenDDS::DCPS::LatencyStatisticsSeq stats 变量中,并通过一个循环遍历这些统计信息。每一组统计信息中,包含了以下数据:
- n 是样本数。
- maximum 是观察到的最大延迟。
- minimum 是观察到的最小延迟。
- mean 是平均延迟。
- variance 是延迟的方差。
这些统计数据可以用于分析和优化 DDS 系统的延迟表现。这个扩展接口和它的方法为开发者提供了一个强大的工具,可以评估和确保分布式系统满足特定的性能要求。

《Data Distribution Service (DDS)》Version 1.4 :

这段内容来自于《数据分发服务 (DDS)》1.4 版本的正式文档,它讲解了"LATENCY_BUDGET"(延迟预算)策略。下面是按照这段内容,翻译并解释的中文版:
2.2.3.8 延迟预算
该策略为应用程序提供了一种方式,以向中间件指示数据通信的“紧迫性”。通过设置一个非零的持续时间,服务可以优化其内部操作。
这一策略被视为一个提示。关于服务如何利用这一提示,并没有指定的机制。仅当满足“提供的持续时间小于等于请求的持续时间”该不等式评估结果为‘真’时,提供的值和请求的值被认为是兼容的。
中文解释:
“延迟预算”策略允许应用程序向DDS中间件传达有关数据通信紧迫性的信息。如果应用程序设置了一个非零的持续时间,这表示希望中间件尽可能优化其内部处理流程,以减少通信延迟。
需要注意的是,这个策略仅仅是一个提示给中间件,并没有具体指明中间件需要如何实现这一提示的利用。中间件可能会根据这个提示进行一些优化策略,但具体细节并不在此标准中定义。
“提供的持续时间”是指数据发布方在QoS策略中设置的延迟预算值,“请求的持续时间”则是订阅方期望的延迟预算。只有当数据发布方提供的延迟预算值小于或等于订阅方请求的延迟预算值时,两者被认为是兼容的。这意味着,系统允许提供方有更低(更好)的延迟性能,但不应该比订阅方请求的延迟更高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值