zoukankan      html  css  js  c++  java
  • [dpdk] 读官方文档(1)

    前提:已读了这本书<<深入浅出dpdk(朱清河等著)>>。

    目标:读官方文档,同时跟着文档进行安装编译等工作。

               http://dpdk.org/doc/guides/index.html

    环境:thinkpadT450 + archlinux + kvm + CentOS 7(逐层自下而上的关系)

    KVM参数:
    sudo qemu-system-x86_64 -nographic -enable-kvm -numa node -numa node -drive file=disk.img,if=virtio 
      -cdrom /home/tong/ISO/CentOS-7-x86_64-DVD-1511.iso -boot order=c -m 2G 
      -net nic,model=virtio,macaddr='00:00:00:00:00:03' -net tap,ifname=tap0 

    当前dpdk版本:dpdk-16.07

    前提交代完,接下来是正文。内容会是一种笔记的形式,我遇见问题,就会在下边写下来。

    一 编译:

    make config T=x86_64-native-linuxapp-gcc
    sed -ri 's,(PMD_PCAP=).*,1y,' build/.config
    make

    问题一:编译错误

    In file included from /root/dpdk-16.07/lib/librte_eal/linuxapp/eal/eal_pci.c:42:0:
    /root/dpdk-16.07/build/include/rte_memcpy.h:814:2: error: incompatible type for argument 2 of ‘_mm_storeu_si128’
      MOVEUNALIGNED_LEFT47(dst, src, n, srcofs);
      ^
    In file included from /root/dpdk-16.07/build/include/rte_common.h:289:0,
                     from /root/dpdk-16.07/build/include/rte_log.h:45,
                     from /root/dpdk-16.07/lib/librte_eal/linuxapp/eal/eal_pci.c:37:
    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/emmintrin.h:700:1: note: expected ‘__m128i’ but argument is of type ‘int’
     _mm_storeu_si128 (__m128i *__P, __m128i __B)

    咋解决:查看了这个头文件emmintrin.h 内容是这样的,也就是说这是个CPU平台相关的问题,所以很可能需要调整kvm的cpu参数,或者dpdk的编译参数,从这两个方面入手:

    /* The Intel API is flexible enough that we must allow aliasing with other
       vector types, and their scalar components.  */
    typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
    typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));

    dpdk的编译参数并没有神马好改的,你重要指定一个CPU平台给它,所以我必须让qemu模拟intel或者是虚拟机直接认得本地CPU,然而qemu的手册并不清晰,又没有时间系统的学习qemu,只能试了。(qemu kvm也需要系统学习!

    尝试1:不给qemu CPU参数:

     qemu-system-x86_64 -nographic -enable-kvm -m 2G -drive file=disk.img,if=virtio 
    -net nic,model=virtio,macaddr='00:00:00:00:00:03' -net tap,ifname=tap0

    进入系统后查看cpuinfo

    [root@dpdk dpdk-16.07]# cat /proc/cpuinfo 
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 6
    model name      : QEMU Virtual CPU version 2.5+
    stepping        : 3
    ......

    编译报同样的错,毫无悬念。

    尝试2:指定CPU类型,模拟至强E3

    qemu-system-x86_64 -nographic -enable-kvm -m 2G -cpu IvyBridge -drive file=disk.img,if=virtio -net nic,model=virtio,macaddr='00:00:00:00:00:03' -net tap,ifname=tap0

    编译成功:

    [root@dpdk dpdk-16.07]# cat /proc/cpuinfo 
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 58
    model name      : Intel Xeon E3-12xx v2 (Ivy Bridge)
    stepping        : 9
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    ... ...

    编译错误二:

      SYMLINK-FILE include/exec-env/rte_dom0_common.h
      INSTALL-LIB librte_eal.a
    == Build lib/librte_eal/linuxapp/igb_uio
    make: *** /lib/modules/3.10.0-327.el7.x86_64/build: No such file or directory.  Stop.
    make[5]: *** [igb_uio.ko] Error 2
    make[4]: *** [igb_uio] Error 2
    make[3]: *** [linuxapp] Error 2
    make[2]: *** [librte_eal] Error 2
    make[1]: *** [lib] Error 2
    make: *** [all] Error 2

    解决:人家文档写的清楚需要内核开发包 “kernel - devel.x86_64”

    yum install kernel-devel
    ln -fs /usr/src/kernels/3.10.0-327.36.1.el7.x86_64/ /lib/modules/3.10.0-327.el7.x86_64/build

    问题三:因为enable了PCAP,没错就是前边那个sed,鬼知道它是干嘛的,反正要装 libpcap-devel.

    编译通过,好棒!: )

    二,调整硬件架构

    调整虚拟机为numa架构,并设置hugepage。

    # numa参数只调整结构,并不申请资源,所以还是需要m和smp两个参数来进行资源申请。
    sudo
    qemu-system-x86_64 -nographic -vnc 127.0.0.1:0 -enable-kvm -m 2G -cpu Nehalem #Nehalem就是i7,我的物理CPU是i7,模拟至强的时候,warning有一些特性不支持,为了防止后续出现诡异的错误,就模拟了i7. -smp cores=2,threads=2,sockets=2 #两颗CPU,两个核心,超线程 -numa node,mem=1G,cpus=0-3,nodeid=0 -numa node,mem=1G,cpus=4-7,nodeid=1 -drive file=disk.img,if=virtio -net nic,model=virtio,macaddr='00:00:00:00:00:03' -net tap,ifname=tap0 &

    然后在虚拟机里的效果就是这样的:

    [root@dpdk ~]# cat /proc/cpuinfo 
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 0
    siblings        : 4
    core id         : 0
    cpu cores       : 2
    apicid          : 0
    initial apicid  : 0
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 1
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 0
    siblings        : 4
    core id         : 0
    cpu cores       : 2
    apicid          : 1
    initial apicid  : 1
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 2
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 0
    siblings        : 4
    core id         : 1
    cpu cores       : 2
    apicid          : 2
    initial apicid  : 2
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 3
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 0
    siblings        : 4
    core id         : 1
    cpu cores       : 2
    apicid          : 3
    initial apicid  : 3
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 4
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 1
    siblings        : 4
    core id         : 0
    cpu cores       : 2
    apicid          : 4
    initial apicid  : 4
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 5
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 1
    siblings        : 4
    core id         : 0
    cpu cores       : 2
    apicid          : 5
    initial apicid  : 5
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 6
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 1
    siblings        : 4
    core id         : 1
    cpu cores       : 2
    apicid          : 6
    initial apicid  : 6
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    
    processor       : 7
    vendor_id       : GenuineIntel
    cpu family      : 6
    model   : 26
    model name      : Intel Core i7 9xx (Nehalem Class Core i7)
    stepping        : 3
    microcode       : 0x1
    cpu MHz         : 2394.456
    cache size      : 4096 KB
    physical id     : 1
    siblings        : 4
    core id         : 1
    cpu cores       : 2
    apicid          : 7
    initial apicid  : 7
    fpu     : yes
    fpu_exception   : yes
    cpuid level     : 11
    wp      : yes
    flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
    bogomips        : 4788.91
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    cat /proc/cpuinfo
    [root@dpdk ~]# numastat 
                               node0           node1
    numa_hit                  193979          184758
    numa_miss                      0               0
    numa_foreign                   0               0
    interleave_hit              7016            6897
    local_node                187494          184103
    other_node                  6485             655
    numastat

    大页:

    查看cpuinfo: If pse exists, 2M hugepages are supported; if pdpe1gb exists, 1G hugepages are supported. 所以我只支持2M,而且我也没有那么多内存。但是我的物理cpu是支持1G的,这让我感觉很牛逼,我是说host主机。

    通过设置内核参数:测试发现,保留的大页会平均分给两个node。

    [root@dpdk ~]# cat /boot/grub2/grub.cfg|grep huge
            linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8 hugepages=32
    [root@dpdk ~]# cat /proc/meminfo |grep Huge
    AnonHugePages:      8192 kB
    HugePages_Total:      32
    HugePages_Free:       32
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
    [root@dpdk ~]# cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages 
    16
    [root@dpdk ~]# cat /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages 
    16

     挂载大页到启动项里,(干这个事的时候出现了插曲,搞了一下nbd和lvm的挂载,真爱粉们可以去另一篇里边追剧哦),截止到目前完全不知道为啥要这样做。

    [root@dpdk ~]# cat /etc/fstab 
    ... ...
    # custom
    nodev /mnt/huge hugetlbfs defaults 0 0
    [root@dpdk ~]# 

    反正,测试程序  testpmd能跑起来了,算告一段落,太长了,我要切!

  • 相关阅读:
    HashMap
    java反射
    arraylist和linkedlist区别
    int和Integer的区别
    java 数组排序并去重
    矩阵链乘法问题
    找零问题
    硬币收集问题
    最大借书量问题
    钢条切割问题
  • 原文地址:https://www.cnblogs.com/hugetong/p/5901691.html
Copyright © 2011-2022 走看看