跳转至

链路利用率跟踪

组件

  • 跟踪器实现:ptop-link-utilization-tracker.cc/h
  • 助手工具:ptop-link-utilization-tracker-helper.cc/h

部署模式对比

从这里开始,我们的 安装步骤就有两种实现

  • 第一种是最原始的ns-3直接创建:先创建对象,再使用tracker进行安装
    • obj -> tracker (device, duration)
  • 第二种是这里新提出的,使用scheduler调度器,通过配置文件的方式统一配置辅助类
    • config_file (scheduled) -> helper

很显然这又是一个balance的问题,简单分析一下:

特性 调度器模式 手动模式
配置复杂度 低(自动配对) 高(手动配置)
灵活性 中等
多节点管理 自动处理 需自行实现
典型场景 全网络监测 特定节点测试

使用调度器

  1. 配置文件设置:
    Text Only
    1
    2
    enable_link_utilization_tracking=true
    link_utilization_tracking_interval_ns=100000000 # 100ms间隔
    
  2. 代码集成:
    C++
    1
    2
    3
    4
    5
    #include "ns3/ptop-link-utilization-tracker-helper.h" // 头文件
    
    PtopLinkUtilizationTrackerHelper helper(basicSimulation, topology); // 创建对象并使用辅助类
    
    helper.WriteResults(); // 运行后调用
    

手动安装

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include "ns3/ptop-link-utilization-tracker.h" // 头文件

Ptr<PointToPointNetDevice> device = ...; // 获取网络设备

auto tracker = CreateObject<PtopLinkUtilizationTracker>(device, 100000000); // 追踪器本体 (安装给谁,追踪时长)

// 结果处理示例
const std::vector<std::tuple<int64_t, int64_t, int64_t>> intervals = tracker->FinalizeUtilization();
for (size_t j = 0; j < intervals.size(); j++) {
    int64_t interval_start_ns = std::get<0>(intervals[j]);
    int64_t interval_end_ns = std::get<1>(intervals[j]);
    int64_t interval_busy_time_ns = std::get<2>(intervals[j]);
    double interval_utilization = ((double) interval_busy_time_ns) / (double) (interval_end_ns - interval_start_ns);
    // ... 然后做一些处理,比如打印结果
}
Warning

调度器模式默认全链路安装跟踪器!

结果文件保存于logs_ns3目录,具体格式解析参考官方文档

默认全链路安装实际上可以进行优化,我们其实更喜欢局部自定义的扩展性,但是目前没实现