https://download.csdn.net/download/eidolon_foot/12568768
8. LATENCY_BUDGET
OpenDDS:
OpenDDS还通过数据读取器的扩展接口提供了摘要延迟统计信息。此扩展接口位于OpenDDS::DCPS模块中,IDL定义为:
此策略为应用程序提供了一种向中间件指示数据通信的“紧迫性”的方法。通过具有非零的持续时间,服务可以优化其内部操作。
当且仅当不等式“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策略中设置的延迟预算值,“请求的持续时间”则是订阅方期望的延迟预算。只有当数据发布方提供的延迟预算值小于或等于订阅方请求的延迟预算值时,两者被认为是兼容的。这意味着,系统允许提供方有更低(更好)的延迟性能,但不应该比订阅方请求的延迟更高。