• [dpdk] 读官方文档(3)


    续前节,

    测试小程序

    1. 想编译测试程序首先需要设置两个环境变量,为什么呢,因为测试程序的Makefile里用了。。。 rpm装了打包好的devel包,这个rpm也会自带这两个环境变量。就是说写第三方程序的时候,习惯上,约定了这两个环境变量

    [root@dpdk tools]# cat ~/env.sh 
    export RTE_SDK=/root/dpdk-16.07
    export RTE_TARGET=x86_64-native-linuxapp-gcc
    [root@dpdk tools]# 

    2. 文档里说:The UIO drivers and hugepages must be setup prior to running an application.

    UIO包括:uio_pci_generic, uio, igb_uio, vfio_pci

    vfio_pci 在host里我已经学会怎么玩了。uio不知道是啥,好想要和igb_uio放在一起用

    sudo modprobe uio
    sudo insmod kmod/igb_uio.ko
    [root@dpdk tools]# locate igb_uio.ko
    /root/dpdk-16.07/build/build/lib/librte_eal/linuxapp/igb_uio/.igb_uio.ko.cmd
    /root/dpdk-16.07/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko
    /root/dpdk-16.07/build/kmod/igb_uio.ko
    /root/dpdk-16.07/x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio/.igb_uio.ko.cmd
    /root/dpdk-16.07/x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko
    /root/dpdk-16.07/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
    [root@dpdk tools]# 

    我觉得弄一下 uio_pci_generic

    首先,有一个非常好用的工具 tools/dpdk-devbind.sh . (我就是客气一下,我并没有觉得特别好用,当然也觉得难用,因为我根本就没怎么用)

    (1) 现运行这个命令,看一看

    [root@dpdk tools]# ./dpdk-devbind.py --status
    
    Network devices using DPDK-compatible driver
    ============================================
    <none>
    
    Network devices using kernel driver
    ===================================
    0000:00:03.0 'Virtio network device' if= drv=virtio-pci unused= 
    0000:00:04.0 'Ethernet Connection (3) I218-V' if=ens4 drv=e1000e unused= *Active*
    
    Other network devices
    =====================
    <none>

    (2)加载驱动 uio_pci_generic

    [root@dpdk tools]# modprobe uio_pci_generic

    (3) 再运行看一下,然后发现unused发生了变化,可是也没什么大不了的。

    [root@dpdk tools]# ./dpdk-devbind.py --status
    
    Network devices using DPDK-compatible driver
    ============================================
    <none>
    
    Network devices using kernel driver
    ===================================
    0000:00:03.0 'Virtio network device' if= drv=virtio-pci unused=uio_pci_generic 
    0000:00:04.0 'Ethernet Connection (3) I218-V' if=ens4 drv=e1000e unused=uio_pci_generic *Active*
    
    Other network devices
    =====================
    <none>

    (4)把网卡从原驱动e1000e上面解绑,和vfio_pci的操作没有区别。

    [root@dpdk tools]# lspci -nn -s 00:04.0
    00:04.0 Ethernet controller [0200]: Intel Corporation Ethernet Connection (3) I218-V [8086:15a3] (rev 03)
    [root@dpdk tools]# echo 0000:00:04.0 > /sys/bus/pci/devices/0000:00:04.0/driver/unbind 
    [root@dpdk tools]# ./dpdk-devbind.py --status
    
    Network devices using DPDK-compatible driver
    ============================================
    <none>
    
    Network devices using kernel driver
    ===================================
    0000:00:03.0 'Virtio network device' if= drv=virtio-pci unused=uio_pci_generic 
    
    Other network devices
    =====================
    0000:00:04.0 'Ethernet Connection (3) I218-V' unused=uio_pci_generic

    (5) 绑到 uio_pci_generic 上面去。

    [root@dpdk tools]# echo '0000:00:04.0' > /sys/bus/pci/drivers/uio_pci_generic/bind  
    [root@dpdk tools]# ./dpdk-devbind.py --status                                   
    
    Network devices using DPDK-compatible driver
    ============================================
    0000:00:04.0 'Ethernet Connection (3) I218-V' drv=uio_pci_generic unused=
    
    Network devices using kernel driver
    ===================================
    0000:00:03.0 'Virtio network device' if= drv=virtio-pci unused=uio_pci_generic 
    
    Other network devices
    =====================
    <none>

    (6) 至此,绑完了就。就文档说(4)和(5)可以用一条命令搞定。并没有测试。

    ./tools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1

    大页,我早已经在虚拟机里设置好了。

    3. EAL库。

     (1) 就是dpdk的程序都可以接受命令行参数。其他是可选的,只有一个-c mask是比较主要的,用掩码觉得运行程序的逻辑核。

    [root@dpdk build]# ./helloworld -c 1 |grep hello
    hello from core 0
    [root@dpdk build]# ./helloworld -c 2 |grep hello
    hello from core 1
    [root@dpdk build]# ./helloworld -c 4 |grep hello
    hello from core 2
    [root@dpdk build]# ./helloworld -c 3 |grep hello
    hello from core 0
    hello from core 1
    [root@dpdk build]# ./helloworld -c 6 |grep hello
    hello from core 2
    hello from core 1
    [root@dpdk build]# 

    给mask参数之前,你必须知道你的cpu结构。

    这么多年都是这样的。

    [root@dpdk build]# cat /proc/cpuinfo 

    后来觉得可视性不好,于是写了个脚本整理了一下输出结果。可是那又怎么样呢? 依然很土。

    然后,对,刚刚,dpdk的文档里介绍了这个:lstopo (pkg: hwloc). 输出结果是酱紫的!

    牛逼的!我还能说什么。。。 还有nographic版本:

    [tong@T7 ~]$ lstopo-no-graphics 
    Machine (7927MB)
      Package L#0 + L3 L#0 (4096KB)
        L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
          PU L#0 (P#0)
          PU L#1 (P#1)
        L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
          PU L#2 (P#2)
          PU L#3 (P#3)
      HostBridge L#0
        PCI 8086:1616
          GPU L#0 "card1"
          GPU L#1 "renderD129"
          GPU L#2 "controlD65"
        PCI 8086:15a3
        PCIBridge
          PCI 8086:095b
            Net L#3 "wlan0"
        PCIBridge
          PCI 10de:1347
            GPU L#4 "card0"
            GPU L#5 "renderD128"
            GPU L#6 "controlD64"
        PCI 8086:9c83
          Block(Disk) L#7 "sda"
          Block(Disk) L#8 "sdb"
    [tong@T7 ~]$ 

    (2) 内存参数。可以申请在hugepage中预申请内存,并决定node。

    使用参数 -m ,或 --socket-mem

    (3)  测试程序。test, testpmd

    4. HPET (High Precision Event Timer) 高精度定时器。

      (1)查看硬件支持与BOIS状态,如下有输出,代表启用,没有任何输入代表没有启用或不支持:

    [root@dpdk ~]# grep hpet /proc/timer_list 
    Clock Event Device: hpet
     set_next_event: hpet_legacy_next_event
     set_mode:       hpet_legacy_set_mode
    [root@dpdk ~]# 

      (2)内核支持。内核参数 HPET_MMAP 可以将计数器映射近用户态进程地址空间。

      (3)dpdk支持。CONFIG_RTE_LIBEAL_USE_HPET 编译时设置编译选项,默认为n。

    5. 使用非超级用户运行。

    6. 电源管理。

    7. Isolation Core。指定的CPU将不参加系统内核任务调度,从而可以单独被专用。

    支持内核参数如下:

    isolcpus=2,4,6

    8. KNI kernel Mode (Dpdk Kernel NIC Interface) 并不知道是干嘛的。

    9. IOMMU。与之前的类似。

    10. 40G网卡。 i40e驱动

      确保 firmware 支持。我也不知道怎么确保。。。

    快速设置脚本 dpdk-setup.sh

    自动化工具用于完成前边提到的大部分内容。

    获取最佳网卡性能

    内存:

    查看通道数,频率之类的,不太懂。先这么地把。(下图例子为host主机 T450 板载4G,外插4G。均为DDR3 1600 ;我还看了我的台式机输出,台式机DDR2 800 X 4 双通道。然而并不能通过输出很显然的反馈出上述信息,所以这部分知识还是需要仔细学习的。)

    [tong@T7 ~]$ sudo dmidecode -t memory |grep Locator
            Locator: ChannelA-DIMM0
            Bank Locator: BANK 0
            Locator: ChannelB-DIMM0
            Bank Locator: BANK 2
    [tong@T7 ~]$ sudo dmidecode -t memory |grep Speed
            Speed: 1600 MHz
            Configured Clock Speed: 1600 MHz
            Speed: 1600 MHz
            Configured Clock Speed: 1600 MHz
    [tong@T7 ~]$ 

    网卡:

    设备相关的内容。最近无业,手上都是家庭环境,没有专有设备。略。

    BOIS:

    硬件 passthrough 启用 vt-d。前文介绍过了。

    Kernel设置:

    大页 / isolation core / iommu

    dpdk设置:

    基于硬件编译库 / 挂载大页 / 查看cpu node 相关信息

    [root@dpdk tools]# lstopo-no-graphics 

    查看网卡在哪个Node上:

    [root@dpdk tools]# cat /sys/bus/pci/devices/0000:00:04.0/numa_node 
    -1
    [root@dpdk tools]# 

    很显然这个输出结果证明没有node绑定。那么这玩意应该怎么绑上去啊???愿意分享的请留言  : )

    网卡绑定到用户态驱动 vfio uio 等:

    略,跟前边一样。

    l3fwd

    就是个check list。看源文档。

    至此,入门指南读完,下一节读开发指南 : )

  • 相关阅读:
    c# 获取某个对象的[公有属性]的名称,类型,值
    iis10 HTTP 错误 500.19
    MVC 使用EF Code First数据迁移之添加字段
    emeditor 配置教程
    独立程序员如何赚钱致富
    win7/win8通过媒体流(DLNA技术)共享音乐照片和视频
    sails中文文档地址
    游戏碰撞的原理
    Android图片圆角效果
    Android 系统 root 破解原理分析 (续)
  • 原文地址:https://www.cnblogs.com/hugetong/p/5914938.html
Copyright © 2020-2023  润新知