Windows下使用NS-3
1 环境说明
这是基于融合以太网 v2 (RoCEv2) 的 RDMA 的 NS-3 模拟器。 它包括 SWIFT、DCQCN、TIMELY、PFC、ECN等拥塞管理机制的实现。它基于 NS-3 版本 3.17,并移植到 Visual Studio 环境。详细信息参见 网址。
2 代码
https://github.com/tangjianback/RET 融合timely/swift/ret等基于时延的拥塞控制算法。
https://github.com/bobzhuyb/ns3-rdma 融合DCQCN基于ECN的拥塞控制算法。
2 编译 & 运行
一键编译代码需要 Visual Studio 2015,打开 windows/ns-3-dev/ns-3-dev.sln,即可构建整个解决方案。如果因任何原因无法获得 Windows 计算机或 Visual Studio,可以尝试使用原始 Makefile 构建它。 但现在可能需要在 waf 中编辑一些内容才能使其正常工作。
程序可以修改配置文件实现特定所需的功能。release/mix/下存放配置文件。config.txt配置RDMA基础环境能力包括交换机传输错误率,是否开启PFC, 交换机的ECMP粒度等基础配置。topology.txt设置网络的拓扑路径,包括路径图,线路长度和链路容量。flow.txt是设置控制流的开启,关闭,长度,等信息。
二进制的可运行文件将在 windows/ns-3-dev/x64/Release/main.exe 中生成。 在 windows/ns-3-dev/x64/Release/mix/config.txt 中包含一个示例配置文件 在 windows/ns-3-dev/x64/Release/ 中执行 main.exe:main.exe mix\config.txt
以RET代码为例,它以 40Gbps 的速度开启两个发送端,并且发送数据包到相同的接收端。控制台打印出见换机的拥塞队列长度的信息。对于DCQCN,它以 40Gbps 的速度运行 2:1 组播 1 秒。 请等待几分钟以使其完成。 跟踪将在 mix/mix.tr 处生成,如 mix/config.txt 所定义
3 模块修改,仿真设计
模块介绍
point-to-point/model/qbb-net-device.cc 和所有其他 qbb-* 文件:
DCQCN 和 PFC 实现。 它还包括返回 N 和返回 0,用于处理由于损坏而导致的数据包丢失。
网络/模型/broadcom-node.cc 和 .h:
这实现了 Broadcom ASIC 交换机模型,该模型主要执行各种与缓冲区阈值相关的操作。 其中包括决定是否应触发 PFC、是否应标记 ECN、缓冲区太满而应丢弃数据包等。它支持 PFC 的静态和动态阈值。
network/utils/broadcom-egress-queue.cc 和 .h:
这是实际的 MMU 缓冲数据包。 它还包括交换调度程序,即当上层请求发送数据包时,它将决定将哪个队列出队。 支持严格优先级和循环等策略。
applicaitons/models/udp-echo-client.cc:
我们在这里实现 DCQNC RDMA 客户端,这与 RoCEv2 包含 UDP 标头的事实相符。 特别是,当PFC暂停链接时,原始UDP客户端会出现问题。 原来的UDP客户端不断地以线速发送数据包,很快就建立了巨大的队列,内存耗尽。 在这里,如果发送速率被 PFC 推迟,我们会限制发送速率。
applicaitons/models/timely.cc:
这里主要实现了timely,swift,ret,dx基于时延的拥塞控制算法。
internet/model/seq-ts-header.cc 和 .h:
我们没有实现完整的 InfiniBand 标头。 相反,我们真正需要的只是序列号(用于检测损坏丢弃,也帮助我们了解吞吐量)和时间戳(TIMELY 需要)。这是我们将此信息编码到数据包中的地方。
main/third.cc:
main() 函数。包括整个mix配置文件夹的解析,整个仿真环境的初始化。
核心测试模块(基于RTT)
applicaitons/models/udp-echo-client.cc:
TimelySender::Init()
每条流的初始化,包括拥塞控制算法参数的初始化。
TimelySender::StartApplication(void)
流程序的开启,完成socket的绑定,已经收包回调函数的注册。
TimelySender::Send()
发送函数
TimelySender::Receive(Ptr<Socket> socket)
收包注册函数,在内部完成每次收到数据包的拥塞控制信息的更新,包括发送速率等信息。
TimelySender::delay_response(Ptr<Packet> packet)
增加基于RTT拥塞算法的端部处理时延,以拟合现实网络存在的时延抖动。
TimelySender::UpdateWindow_forXXXXX() 不同拥塞空算法的核心拥塞窗口,发送速率的调整逻辑。
Linux下使用NS-3网络
介绍
这是一个用于HPCC(High Precision Congestion Control,SIGCOMM 2019)的NS-3网络仿真器。它还包括了DCQCN、TIMELY、DCTCP、PFC、ECN和Broadcom共享缓冲交换机的实现。代码已经更新了这个仿真器,以支持HPCC-PINT,它将INT(In-band Network Telemetry)头部开销减少到仅为1字节。这改善了长流的完成时间。详见《PINT:Probabilistic In-band Network Telemetry》(SIGCOMM 2020)。该仿真器基于NS-3版本3.17。代码参见网址。
构建
快速开始
构建
./waf configure
请注意,如果gcc版本大于5,编译将失败,因为某些ns3代码风格。如果您遇到此问题,请使用以下命令:
CC='gcc-5' CXX='g++-5' ./waf configure
实验配置
请参考mix/config.txt获取示例。
mix/fat.txt是用于HPCC论文评估的拓扑结构,也用于PINT论文的HPCC-PINT评估。
运行
运行的直接命令是:./waf --run 'scratch/third mix/config.txt'
代码提供了run.py用于自动生成配置并运行实验。请使用python run.py -h获取用法。例如用法:python run.py --cc hp --trace flow --bw 100 --topo topology --hpai 50
要运行HPCC-PINT,请尝试:python run.py --cc hpccPint --trace flow --bw 100 --topo topology --hpai 50 --pint_log_base 1.05 --pint_prob 1
基于NS3添加/编辑的文件
以下是主要的文件。可能还有一些未在此处列出的文件,这些文件可能不重要或与核心逻辑无关。
point-to-point/model/qbb-net-device.cc/h:net-device RDMA
point-to-point/model/pause-header.cc/h:PFC数据包的头部
point-to-point/model/cn-header.cc/h:CNP的头部
point-to-point/model/pint.cc/h:PINT编码/解码算法
point-to-point/model/qbb-header.cc/h:ACK的头部
point-to-point/model/qbb-channel.cc/h:qbb-net-device的通道
point-to-point/model/qbb-remote-channel.cc/h
point-to-point/model/rdma-driver.cc/h:qp分配和管理多个NIC的层
point-to-point/model/rdma-queue-pair.cc/h:队列对
point-to-point/model/rdma-hw.cc/h:拥塞控制的核心逻辑
point-to-point/model/switch-node.cc/h:交换机的节点类
point-to-point/model/switch-mmu.cc/h:交换机的mmu模块
network/utils/broadcom-egress-queue.cc/h:交换机端口的多队列实现
network/utils/custom-header.cc/h:用于加速头部解析的定制头部类
network/utils/int-header.cc/h:INT的头部
applications/model/rdma-client.cc/h:生成RDMA流量的应用程序
仿真主要逻辑