目录

Sigcomm2022 Retina

实验复现

实验复现使用环境:

  1. Ubuntu 20.04 LTS (16*[email protected] 256G)
  2. X710 10G Ethernet Adapter 和 Nvidia Bluefield2 DPU

安装

安装依赖

警告

由于使用DPDK 20.08,meson不能安装0.60以上的版本,否则会导致编译问题。

1
sudo apt install meson=0.53.2-2ubuntu2

安装其他依赖

1
sudo apt install build-essential pkg-config libnuma-dev python3-pyelftools libpcap-dev libclang-dev python3-pip

安装Mellanox驱动

信息
若不存在Mellanox网卡,这一步或许可以省略。

mellanox的卡还是需要安装MLNX_OFED,可以在Linux InfiniBand Drivers 这里下载,然后执行如下操作:

1
2
3
4
5
tar xvf MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64/
sudo ./mlnxofedinstall --dpdk --upstream-libs --with-mft --with-kernel-mft
ibv_devinfo    # verify firmware is correct, set to Ethernet
sudo /etc/init.d/openibd restart

安装DPDK

警告
根据官方文档,这里只能使用DPDK 20.08,下载其他版本会导致编译错误。
  • 下载DPDK 20.08
    1
    
    curl -LO https://fast.dpdk.org/rel/dpdk-21.08.tar.xz
    
  • 配置1GB大页内存 修改/etc/default/grub文件来保留1G的大页(同时隔离了要使用的CPU核心):
    1
    
    GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=64 iommu=pt intel_iommu=on isolcpus=1-8"
    
    更新GRUB并重启服务器
    1
    2
    
    sudo update-grub
    sudo reboot now
    
  • 重启之后挂载大页内存给DPDK使用
    1
    2
    
    sudo mkdir /mnt/huge
    sudo mount -t hugetlbfs pagesize=1GB /mnt/huge
    
  • 从源码上安装DPDK
    • 解压

      1
      
      tar xJf dpdk-21.08.tar.xz
      
    • 设置环境变量

      1
      2
      3
      
      export DPDK_PATH=/home/pengjd/Downloads/dpdk-21.08
      export LD_LIBRARY_PATH=$DPDK_PATH/lib/x86_64-linux-gnu
      export PKG_CONFIG_PATH=$LD_LIBRARY_PATH/pkgconfig
      
    • 编译DPDK

      信息

      视情况而定要不要编译regex/octeontx2这个驱动(默认状况下,我的环境会编译这个驱动,但是最后会导致编译不出来),若不需要编译,则可执行下面代码:

      1
      2
      
      # cd $DPDK_PATH/build
      meson configure -Ddisable_drivers=regex/octeontx2
      

      1
      2
      3
      4
      5
      
      meson --prefix=$DPDK_PATH build
      cd $DPDK_PATH/build
      ninja
      sudo ninja install
      sudo ldconfig
      
    • 绑定网络端口 我们这里绑定的是X710的口2,显示在系统里面是ens4f1

      1
      2
      3
      4
      
      # load the vfio-pci module
      sudo modprobe vfio-pci
      # bind
      sudo $DPDK_PATH/usertools/dpdk-devbind.py --bind=vfio-pci ens4f1
      

      绑定好了可以输入以下命令查看绑定情况:

      1
      
      sudo $DPDK_PATH/usertools/dpdk-devbind.py --status
      

安装rust

信息

使用VSCode开发的时候(并使用rust-analyzer),过程宏需要展开,否则会提示报错,需要在rust-analyzer的settings.json添加:

1
{"rust-analyzer.procMacro.attributes.enable": true}

此外,由于编译的过程还需要DPDK的支持,因此之前的环境变量要确保成功配置了,否则编译、显示都会有异常。

具体安装Rust请参考Rust官网:https://www.rust-lang.org/zh-CN/

编译Retina

  • 克隆代码
    1
    
    git clone https://github.com/stanford-esrg/retina.git
    
  • 编译所有应用
    1
    
    cargo build --release
    
  • 运行
    1
    
    sudo env LD_LIBRARY_PATH=$LD_LIBRARY_PATH RUST_LOG=error ./target/release/my_app
    

X710相关

警告
由于Retina是用Mellanox ConnectX5为测试基准的,因此在使用X710的时候,会出现运行时的错误,需要更改对应的源代码。具体更改参数参考网站

我们这里需要更改retina/core/src/port/mod.rs295行代码有关rss_hf的内容:

1
2
port_conf.rx_adv_conf.rss_conf.rss_hf =
      (dpdk::ETH_RSS_NONFRAG_IPV4_TCP | dpdk::ETH_RSS_FRAG_IPV4) as u64;

运行示例

基本示例应用

1
sudo env LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./target/release/basic

pcap_dump应用

离线使用
1
sudo env LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./target/release/pcap_dump --config configs/offline.toml
在线使用
信息
对应的代码的过滤器也要更改一下

对应的配置文件online_ens4f1.toml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# This configuration is an example to show Retina in "online" mode, which
# polls the specified network interface(s) for live traffic.
# 
# See https://stanford-esrg.github.io/retina/retina_core/config/index.html
# for configuration options.

main_core = 0
nb_memory_channels = 6

[mempool]
    capacity = 262_144
    cache_size = 512

[online]
    duration = 60
    # nb_rxd = 32_768
    nb_rxd = 64
    promiscuous = true
    mtu = 1500
    hardware_assist = true

    [online.monitor.display]
        throughput = true
        mempool_usage = true
        port_stats = ["rx_good_packets",
                        "rx_good_bytes",
                        # "rx_phy_packets",
                        # "rx_phy_bytes",
                        "rx_mbuf_allocation_errors", 
                        # "rx_phy_discard_packets", 
                        "rx_missed_errors",
                        ]
    [online.monitor.log]
        directory = "./log"
        interval = 1000

    [[online.ports]]
        device = "0000:b1:00.1"
        cores = [1,2,3]

    # [[online.ports]]
    #     device = "0000:b1:00.2"
    #     cores = [5,6,7,8]

[conntrack]
    max_connections = 10_000_000
    max_out_of_order = 500
    timeout_resolution = 100
    udp_inactivity_timeout = 60_000
    tcp_inactivity_timeout = 300_000
    tcp_establish_timeout = 5000

执行以下语句开始测试:

1
2
# 开启了日志相关的内容
sudo env LD_LIBRARY_PATH=$LD_LIBRARY_PATH RUST_BACKTRACE=full RUST_LOG=debug ./target/release/pcap_dump --config configs/online_ens4f1.toml

论文十问

Q1: 论文试图解决什么问题?

Q2: 这是否是一个新的问题?

Q3: 这篇文章要验证一个什么科学假设?

Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?

Q5: 论文中提到的解决方案之关键是什么?

Q6: 论文中的实验是如何设计的?

Q7: 用于定量评估的数据集是什么?代码有没有开源?

Q8: 论文中的实验及结果有没有很好地支持需要验证的科学假设?

Q9: 这篇论文到底有什么贡献?

Q10: 下一步呢?有什么工作可以继续深入?

Reference

  1. Paper source: Retina Analyzing 100 GbE Traffic on Commodity Hardware.pdf
  2. 项目Github Repo: https://github.com/stanford-esrg/retina