找回密码
 立即注册
搜索
查看: 1177|回复: 4

[软件] debian安装dpdk+OVS交换机以及配合KVM代码模板

[复制链接]
     
发表于 2018-7-2 03:37 | 显示全部楼层 |阅读模式
本帖最后由 塔奇克马 于 2018-7-2 04:04 编辑

万兆虚拟交换机dpdk加速.
99%玩虚拟机的人应该是用不上的,优化方面不好搞.这个需要配合10G/万兆网络用的.一些加速特性也是万兆网卡上的.99%需要虚拟交换机的人只要macvtap bridge就够用了
这个是利用阻止CPU中断和共享内存还有用户态机制来加速的.
但是我还是折腾了一下,如果谁有需求可以玩一玩.
如果测速不理想,请自行翻阅文档靠自己.


基本配置需求:4G内存
推荐需求:万兆网卡 支持1G大内存页面的CPU 内存越大越好 sr-iov ACS RSS 等
安装使用的系统是openmediavault 基于debian 9(stretch)
代价:所有用到这个的虚拟机必须使用大内存页,交换机本身需要用掉至少1025M的内存,如果按照2M大内存计算就是513个.dpdk所用的轮询模式需要占用一个逻辑核心 100%.

首先去下载两个压缩包dpdk-stable-18.02.2和openvswitch-2.9.0放到一个文件夹下(版本不能变),比如我放到/usr/src/下面

先安装点软件哈
  1. apt install xz-utils
  2. apt-get install libnuma-dev -y
  3. apt-get install linux-headers-`uname -r` -y
  4. apt install gcc make autoconf automake libtool openssl libssl-dev python2.7-dev python3.5-dev  desktop-file-utils groff graphviz  checkpolicy selinux-policy-dev python-sphinx python-twisted-core python-zope.interface libcap-ng-dev libpcap0.8-dev  -y
复制代码
修改下启动CMD添加大内存页,开启vt-d.isolcpus参数,这个是让linux内核不去用哪个逻辑核心,我这里不让用最后2 3逻辑核心,0 1 这两个逻辑核心给linux内核用.主要是防止中断产生影响性能,这个参数不是必须的
  1. sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="default_hugepagesz=2m hugepagesz=2m hugepages=513 iommu=pt intel_iommu=on isolcpus=2,3 "/' /etc/default/grub
  2. update-grub
复制代码
恩....debian 启动脚本这个文件不存在需要建立下.在加入点东西比如 vfio模块载入,这个dpdk的vfio要用到(当然也有不需要直通的驱动可选),直通也要用到.
  1. echo \
  2. '#!/bin/sh -e
  3. #
  4. # rc.local
  5. #
  6. # This script is executed at the end of each multiuser runlevel.
  7. # Make sure that the script will "exit 0" on success or any other
  8. # value on error.
  9. #
  10. # In order to enable or disable this script just change the execution
  11. # bits.
  12. #
  13. # By default this script does nothing.
  14. modprobe vfio-pci
  15. exit 0
  16. ' \
  17. >/etc/rc.local
  18. chmod +x /etc/rc.local
复制代码
看情况在启动脚本中加入内存页预分配
  1. sed -i '/exit 0/i echo 1500 > \/sys\/kernel\/mm\/hugepages\/hugepages-2048kB\/nr_hugepages' /etc/rc.local
复制代码
这里呢,我分配给了1500页面也就是3G内存,不只是虚拟交换机要用,虚拟机也要用到所以才要分配这么多,看情况自己计算
下面也是大内存页相关,直接运行就对了
  1. mkdir -p /mnt/huge
  2. echo "
  3. nodev /mnt/huge hugetlbfs defaults 0 0
  4. " >> /etc/fstab
复制代码
解压下源码
  1. cd /usr/src/
  2. xz -d dpdk-18.02.2.tar.xz
  3. tar xvf dpdk-18.02.2.tar
  4. tar xzvf openvswitch-2.9.0.tar.gz
复制代码
添加下环境变量
  1. echo "
  2. export DPDK_DIR=/usr/src/dpdk-stable-18.02.2
  3. export DPDK_TARGET=x86_64-native-linuxapp-gcc
  4. export DPDK_BUILD=\$DPDK_DIR/\$DPDK_TARGET
  5. " >> ~/.bashrc
复制代码
这里重启下,让启动命令和环境变量剩下.
  1. reboot now
复制代码
两个包编译下(因为楼主只有4核所以是4多了可以自己看着办)
  1. cd /usr/src/dpdk-stable-18.02.2/
  2. make install -j4 T=$DPDK_TARGET DESTDIR=DPDK_install
  3. cd /usr/src/openvswitch-2.9.0/
  4. ./boot.sh
  5. ./configure --with-dpdk=$DPDK_BUILD
  6. cd /usr/src/
  7. make install -j4
复制代码
建立一些OVS相关的文件夹和文件
  1. mkdir -p /usr/local/etc/openvswitch
  2. ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema
  3. mkdir  -p /usr/local/var/run/openvswitch
  4. mkdir -p /root/log/
复制代码
启动它吧
  1. ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
  2.                                --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
  3.                                --private-key=db:Open_vSwitch,SSL,private_key \
  4.                                --certificate=db:Open_vSwitch,SSL,certificate \
  5.                                --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
  6.                                --pidfile --detach --log-file=/root/log/ovsdb-server.log
  7. ovs-vswitchd unix:$DB_SOCK --pidfile --detach  --log-file=/root/log/ovs-vswitchd.log
复制代码
完善下vfio权限(不重要)
  1. chmod a+x /dev/vfio
  2. chmod 0666 /dev/vfio/*
复制代码
继续添加环境变量
  1. echo "
  2. export PATH=$PATH:/usr/local/share/openvswitch/scripts
  3. export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
  4. " >> ~/.bashrc
复制代码
退出重新登录下
  1. exit
复制代码
查看下网卡的PCIID
  1. /usr/src/dpdk-stable-18.02.2/usertools/dpdk-devbind.py --status
复制代码
记录ID然后绑定你的网卡,不过记住vfio下和直通规则是一样的,一个插槽下的所有设备都要绑定
楼主的网卡设备PCIID是0000:05:00.0
  1. /usr/src/dpdk-stable-18.02.2/usertools/dpdk-devbind.py --bind=vfio-pci 0000:05:00.0
复制代码
or
  1. $DPDK_DIR/usertools/dpdk-devbind.py --bind=vfio-pci 0000:05:00.0
复制代码

如果你觉得vt-d限制太多插槽设备独占,你可以UIO驱动绑定,那么命令就变成这样.载入两个模块,这个应该是加入到rc.local下系统启动载入的.
  1. modprobe uio
  2. insmod /usr/src/dpdk-stable-18.02.2/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
复制代码
UIO绑定
  1. /usr/src/dpdk-stable-18.02.2/usertools/dpdk-devbind.py --bind=igb_uio 0000:05:00.0
复制代码


分配内存,我这里给OVS-dpdk分配了1025内存,这是最低限度
  1. ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=1025
复制代码
一些参数命令
  1. ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
复制代码
ovs绑定到哪个核心分配下,这里我分配到第四个逻辑核心,这个是十六进制,怎么计算的呢?1代表要用到的核心0代表不用的核心,用二进制表示起来就是1000,你在计算器里打入这个二进制转换成十六进制就是8
  1. ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x8
复制代码
可选参数,当然你也可以分配给更多核心,规则参考上面的
  1. ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc
复制代码


可选参数,现在版本的qemu启动也没负面影响
  1. ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true
复制代码
建立虚拟交换机br0
  1. ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
复制代码
把绑定vfio/uio的 dpdk物理网卡加入到虚拟交换机中
  1. ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:05:00.0
复制代码
这个时候你可以TOP命令之后C在按下1会发现一个核心已经满载了,这个说明启动成功
可以在这个端口上启用0拷贝和物理端口队列大小(越大延迟越高但是同时获得更高的吞吐量如此反之)
  1. ovs-vsctl set Interface dpdk0 options:n_txq_desc=128 \
  2.                               options:dq-zero-copy=true
复制代码
可选参数,你可以把自己的网络改成大包9000机制(要求与之链接的主机 交换机 虚拟机网卡都要改成同样的. )
  1. ovs-vsctl -- set Interface dpdk0 mtu_request=9000
复制代码
设置rx队列数量,这个参数需要参考你分配给同一个插槽下面CPU的逻辑核心数量来决定 如果你pmd-cpu-mask分配给了两个逻辑核心那么就是2
  1. ovs-vsctl set Interface dpdk0 options:n_rxq=2
复制代码
建立一个和KVM geust主机通讯的端口
  1. ovs-vsctl add-port br0 vhost-user-1 -- set Interface vhost-user-1 \
  2.     type=dpdkvhostuser
复制代码
默认情况下生成的unix sock文件在
  1. /usr/local/var/run/openvswitch/vhost-user-1
复制代码
编辑KVM XML需要参考上面这个地址


到此为止DPDK-OVS基本形态已经搭建完成.
不过还需要建立流表,没有流表大概性能只有一半吧,根据测试.代码大概是这样...需要自行翻阅文档
  1. ovs-ofctl add-flow
复制代码

可能还需要启动RSS等网卡特性

参考文档
  1. http://docs.openvswitch.org/en/latest/intro/install/dpdk/
  2. http://docs.openvswitch.org/en/latest/topics/dpdk/vhost-user/
复制代码
等...其他忘记了...
编辑KVM虚拟机XML的命令是
  1. virsh edit <你虚拟机的名称>
复制代码


KVM.XML参考代表-------------------------<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit win7
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>win7</name>
  <uuid>f495616f-58c3-49ac-8b36-eef635d8bc21</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <memoryBacking>
    <hugepages>
      <page size='2048' unit='KiB' nodeset='0'/>
    </hugepages>
  </memoryBacking>
  <vcpu placement='static'>2</vcpu>
  <cputune>
    <shares>4096</shares>
    <vcpupin vcpu='0' cpuset='0'/>
    <vcpupin vcpu='1' cpuset='1'/>
    <emulatorpin cpuset='0-1'/>
  </cputune>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.8'>hvm</type>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
    <vmport state='off'/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>SandyBridge</model>
    <numa>
      <cell id='0' cpus='0-1' memory='1048576' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/win7_PIP.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </controller>
    <interface type='vhostuser'>
      <mac address='52:54:00:c8:cb:40'/>
      <source type='unix' path='/usr/local/var/run/openvswitch/vhost-user-1' mode='client'/>
      <model type='virtio'/>
      <driver>
        <host csum='off' gso='off' tso4='off' tso6='off' ecn='off' mrg_rxbuf='off'/>
        <guest csum='off' tso4='off' tso6='off' ecn='off' ufo='off'/>
      </driver>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </memballoon>
  </devices>
</domain>

红色就是添加注意的部分.蓝色是可选的大概,当然也可以参考官方的
  1. <domain type='kvm'>
  2.   <name>demovm</name>
  3.   <uuid>4a9b3f53-fa2a-47f3-a757-dd87720d9d1d</uuid>
  4.   <memory unit='KiB'>4194304</memory>
  5.   <currentMemory unit='KiB'>4194304</currentMemory>
  6.   <memoryBacking>
  7.     <hugepages>
  8.       <page size='2' unit='M' nodeset='0'/>
  9.     </hugepages>
  10.   </memoryBacking>
  11.   <vcpu placement='static'>2</vcpu>
  12.   <cputune>
  13.     <shares>4096</shares>
  14.     <vcpupin vcpu='0' cpuset='4'/>
  15.     <vcpupin vcpu='1' cpuset='5'/>
  16.     <emulatorpin cpuset='4,5'/>
  17.   </cputune>
  18.   <os>
  19.     <type arch='x86_64' machine='pc'>hvm</type>
  20.     <boot dev='hd'/>
  21.   </os>
  22.   <features>
  23.     <acpi/>
  24.     <apic/>
  25.   </features>
  26.   <cpu mode='host-model'>
  27.     <model fallback='allow'/>
  28.     <topology sockets='2' cores='1' threads='1'/>
  29.     <numa>
  30.       <cell id='0' cpus='0-1' memory='4194304' unit='KiB' memAccess='shared'/>
  31.     </numa>
  32.   </cpu>
  33.   <on_poweroff>destroy</on_poweroff>
  34.   <on_reboot>restart</on_reboot>
  35.   <on_crash>destroy</on_crash>
  36.   <devices>
  37.     <emulator>/usr/bin/qemu-system-x86_64</emulator>
  38.     <disk type='file' device='disk'>
  39.       <driver name='qemu' type='qcow2' cache='none'/>
  40.       <source file='/root/CentOS7_x86_64.qcow2'/>
  41.       <target dev='vda' bus='virtio'/>
  42.     </disk>
  43.     <interface type='vhostuser'>
  44.       <mac address='00:00:00:00:00:01'/>
  45.       <source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser0' mode='client'/>
  46.        <model type='virtio'/>
  47.       <driver queues='2'>
  48.         <host mrg_rxbuf='on'/>
  49.       </driver>
  50.     </interface>
  51.     <interface type='vhostuser'>
  52.       <mac address='00:00:00:00:00:02'/>
  53.       <source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser1' mode='client'/>
  54.       <model type='virtio'/>
  55.       <driver queues='2'>
  56.         <host mrg_rxbuf='on'/>
  57.       </driver>
  58.     </interface>
  59.     <serial type='pty'>
  60.       <target port='0'/>
  61.     </serial>
  62.     <console type='pty'>
  63.       <target type='serial' port='0'/>
  64.     </console>
  65.   </devices>
  66. </domain>
复制代码
教程到此结束.






回复

使用道具 举报

发表于 2018-7-2 03:39 | 显示全部楼层
看着好专业,大哥你是干什么的
回复

使用道具 举报

发表于 2018-7-2 03:42 | 显示全部楼层
从来没想过2M内存页还能以这种形式派上用场,相比4K提升多少?
回复

使用道具 举报

     
 楼主| 发表于 2018-7-2 04:12 | 显示全部楼层
zatsuza 发表于 2018-7-2 03:42
从来没想过2M内存页还能以这种形式派上用场,相比4K提升多少?

不是太了解,我就折腾下就放着了 ,这里存个档.

根据我了解的部分

他这个主要是在特性上体现
虚拟机
启用了内存共享映射
memAccess ='shared'
这是hugepages独有的参数.也是这个dpdk必须的参数
可能涉及到 Zero-Copy特性
回复

使用道具 举报

     
发表于 2018-7-2 10:04 | 显示全部楼层
膜拜一下,lz有技术博客吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-19 00:34 , Processed in 0.047434 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表