On 07.03.2019 13:29, ppnaik wrote:
> Hi Ilya,
> 
> Thanks for your suggestion.
> We tried pinning the PMD threads to core. But still the issue exists that 
> only single queue is working instead of multiqueue.
> We tried using 'dpdkvhostuserclient' instead of 'dpdkvhostuser' but we are 
> getting the following error and the VM is not able to find the interface.

Hi.
Thanks for logs. See comments inline.

> 
> ovs-vswitchd log
> 
> 2019-03-07T07:42:40.517Z|00212|dpdk|INFO|VHOST_CONFIG: vhost-user client: 
> socket created, fd: 1091
> 2019-03-07T07:42:40.517Z|00213|netdev_dpdk|INFO|vHost User device 
> 'dpdkvhostuser0' created in 'client' mode, using client socket 
> '/tmp/dpdkvhostclient0'
> 2019-03-07T07:42:40.517Z|00214|dpdk|WARN|VHOST_CONFIG: failed to connect to 
> /tmp/dpdkvhostclient0: No such file or directory
> 2019-03-07T07:42:40.517Z|00215|dpdk|INFO|VHOST_CONFIG: /tmp/dpdkvhostclient0: 
> reconnecting...
> 2019-03-07T07:42:40.517Z|00216|dpif_netdev|WARN|There's no available 
> (non-isolated) pmd thread on numa node 1. Queue 0 on port 'dpdk-p0' will be 
> assigned to the pmd on core 1 (numa node 0). Expect reduced performance.
> 
> The output of the following commands now is:
> 
> 
> ovs-appctl dpif-netdev/pmd-rxq-show
> 
> pmd thread numa_id 0 core_id 1:
>   isolated : false
>   port: dpdk-p0           queue-id:  0  pmd usage:  0 %
> pmd thread numa_id 0 core_id 2:
>   isolated : false
>   port: dpdkvhostuser0    queue-id:  0  pmd usage:  0 %
> 
> 
> ovs-vsctl show:
> 
> 356b0bfb-979c-408a-be1e-4567d52ef57f
>     Bridge "br0"
>         Port "dpdk-p0"
>             Interface "dpdk-p0"
>                 type: dpdk
>                 options: {dpdk-devargs="0000:81:00.1,n_rxq=2"}

You configured 'n_rxq' as part of 'dpdk-devargs'. This should be separate
config to take effect:

    ovs-vsctl set Interface dpdk-p0 type=dpdk options:n_rxq=2 
options:dpdk-devargs="0000:81:00.1"
  

>         Port "br0"
>             Interface "br0"
>                 type: internal
>         Port "dpdkvhostuser0"
>             Interface "dpdkvhostuser0"
>                 type: dpdkvhostuserclient
>                 options: {vhost-server-path="/tmp/dpdkvhostuser0"}
> 
> ovs-vswitchd --version
>      ovs-vswitchd (Open vSwitch) 2.11.90
>      DPDK 18.11.0
> 
> qemu-system-x86_64 --version
>       QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.34), Copyright 
> (c) 2003-2008 Fabrice Bellard

Oh. Unfortunately vhost-user-client supported in qemu only since 2.7 version.
You need to switch back to usual vhost-user ports or update the qemu.

> 
> Can you please help us with what we are missing?
> 
> Thanks,
> Priyanka
> 
> 
> On 2019-03-06 18:13, Ilya Maximets wrote:
>> On 06.03.2019 15:18, ppnaik wrote:
>>> Thanks for the response Ilya.
>>> We could get this setup working now.
>>>
>>> However, we could not get it working when we want to give two queues to the 
>>> VM interface.
>>>
>>> We added the queue option when creating the interface on OVS.
>>
>> There is no 'n_rxq'/'n_txq' options for vhost interfaces. Number of queues
>> obtained from the virtio device when QEMU connects. You could have this
>> in ovsdb, but it doesn't affect anything.
>> OTOH, physical ports has 'n_rxq' configurable.
>>
>>> We also enabled multiqueue in VM XML and gave the interface and set the 
>>> vectors too.
>>>
>>> ethtool inside the VM shows:
>>>
>>> ethtool -l ens3
>>> Channel parameters for ens3:
>>> Pre-set maximums:
>>> RX:        0
>>> TX:        0
>>> Other:        0
>>> Combined:    2
>>> Current hardware settings:
>>> RX:        0
>>> TX:        0
>>> Other:        0
>>> Combined:    2
>>>
>>> However, a DPDK application inside the VM is not able to get packets from 
>>> both queues. It still works with one queue.
>>
>> I assume that you have only one PMD thread that polls both physical
>> and virtual ports. Each PMD thread uses only one Tx queue per port.
>> So, if you want to utilize more queues in virtual interface, you need to
>> create more PMD threads using pmd-cpu-mask.
>> For example, with pmd-cpu-mask=0x30 there will be 2 PMD threads. One on
>> CPU #5 and another on CPU #6. Thread on core #5 will send packets to
>> let's say Tx queue #0, Thread on core #6 will send packets to Tx queue #1.
>> These packets will appear on Rx queue #0 and Rx queue #1 accordingly
>> inside VM.
>> But you need to be sure that both threads has packets to send, i.e. they
>> both polls some rx queues of other ports. For exmaple, you may configure
>> 2 queues on physical port and assign them to different PMD threads (this
>> should be done automatically). You may check the distribution of rx queues
>> between threads by 'ovs-appctl dpif-netdev/pmd-rxq-show'.
>> In this case, packets that appears on different rx queues of hw port will
>> go to different queues of vhost-user port.
>>
>>>
>>> Please help us resolve this issue.
>>>
>>> Thanks,
>>> Priyanka
>>>
>>>
>>> On 2019-03-06 16:48, Ilya Maximets wrote:
>>>> Hi.
>>>>
>>>> At first you need to look at ovs-vswitchd.log and the log of qemu.
>>>> There might be some errors.
>>>>
>>>> Some thoughts inline.
>>>>
>>>> Best regards, Ilya Maximets.
>>>>
>>>>> Hi All,
>>>>>
>>>>> Our setup is as follows:
>>>>>
>>>>> We have two servers which are connected peer to peer over 40G
>>>>> interfaces.
>>>>>
>>>>> On one server we have setup OVS and added the physical 40G interface as
>>>>> a DPDK interface to the ovs bridge.
>>>>>
>>>>> We created another dpdkvhostuser interface for the VM. We added this
>>>>> interface to the VM (by editing the XML). We are able to see this
>>>>> interface inside the VM and have configure IP to the interface.
>>>>>
>>>>> We want to communicate between the other server and VM inside this
>>>>> server through the OVS interface created for the VM.
>>>>>
>>>>> The steps we followed (on the server with OVS) are:
>>>>>
>>>>> modprobe uio
>>>>
>>>> IMHO, it's better to use vfio-pci. But it's up to you.
>>>>
>>>>>
>>>>> cd /usr/src/dpdk-18.11/x86_64-native-linuxapp-gcc/kmod/
>>>>>
>>>>> insmod igb_uio.ko
>>>>>
>>>>> cd /usr/src/dpdk-18.11/usertools/
>>>>> ./dpdk-devbind.py --bind=igb_uio 0000:81:00.1
>>>>>
>>>>>   export PATH=$PATH:/usr/local/share/openvswitch/scripts
>>>>>   export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
>>>>>
>>>>>   ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock
>>>>> --remote=db:Open_vSwitch,Open_vSwitch,manager_options
>>>>> --private-key=db:Open_vSwitch,SSL,private_key
>>>>> --certificate=db:Open_vSwitch,SSL,certificate
>>>>> --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
>>>>> --log-file
>>>>>
>>>>>   ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
>>>>>   ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start
>>>>>
>>>>> ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
>>>>> ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk
>>>>> options:dpdk-devargs=0000:81:00.1
>>>>> ovs-vsctl add-port br0 dpdkvhostuser0     -- set Interface
>>>>> dpdkvhostuser0 type=dpdkvhostuser ofport_request=3
>>>>
>>>> Consider using 'dpdkvhostuserclient' a.k.a. 'vhost-user-client' ports 
>>>> instead
>>>> because server mode 'dpdkvhostuser' ports are deprecated in OVS.
>>>>
>>>>>
>>>>> ovs-ofctl add-flow br0 in_port=1,action=output:3
>>>>> ovs-ofctl add-flow br0 in_port=3,action=output:1
>>>>>
>>>>> echo 'vm.nr_hugepages=2048' > /etc/sysctl.d/hugepages.conf
>>>>
>>>> Here you're allocating 2048 pages of 2MB. This is not enough
>>>> for your setup. You're trying to allocate 4096 MB for qemu memory
>>>> backing + OVS will need some hugepage memory for the mempools and stuff.
>>>> It'll be at total:
>>>>     4096 + 1024 (default for OVS if you have only 1 NUMA node) MB,
>>>> i.e. you need at least 512 more pages.
>>>>
>>>> Do you need to reload sysctl for changes to be applied?
>>>>
>>>>> grep HugePages_ /proc/meminfo
>>>>
>>>> So, where is the output? If the output is empty, you have no pages 
>>>> allocated.
>>>>
>>>>>
>>>>> edit VM XML to add this interface:
>>>>
>>>> If you're starting new VM with updated XML than I'll suggest using
>>>> better libvirt
>>>> syntax. i.e. it's better to use sections like "memoryBacking", "interface"
>>>> instead of manual attaching of cmdline arguments.
>>>> See 
>>>> http://docs.openvswitch.org/en/latest/topics/dpdk/vhost-user/#sample-xml
>>>>
>>>>>
>>>>> first line:
>>>>> <domain type='kvm'
>>>>> xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
>>>>>
>>>>> add before </domain> tag:
>>>>>
>>>>> <qemu:commandline>
>>>>>      <qemu:arg value='-chardev'/>
>>>>>      <qemu:arg
>>>>>
>>>>>
>>>>> value='socket,id=char1,path=/usr/local/var/run/openvswitch/dpdkvhostuser0'/>
>>>>>      <qemu:arg value='-netdev'/>
>>>>>      <qemu:arg
>>>>>
>>>>> value='vhost-user,id=mynet1,chardev=char1,vhostforce=on,queues=1'/>
>>>>>      <qemu:arg value='-device'/>
>>>>>      <qemu:arg
>>>>>
>>>>>
>>>>> value='virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet1,mq=on,vectors=4'/>
>>>>>      <qemu:arg value='-m'/>
>>>>>      <qemu:arg value='4096'/>
>>>>>      <qemu:arg value='-object'/>
>>>>>      <qemu:arg
>>>>>
>>>>>
>>>>> value='memory-backend-file,id=mem1,size=4096M,mem-path=/dev/hugepages,share=on'/>
>>>>>      <qemu:arg value='-mem-prealloc'/>
>>>>>      <qemu:arg value='-numa'/>
>>>>>      <qemu:arg value='node,memdev=mem1'/>
>>>>>    </qemu:commandline>
>>>>>
>>>>> Please help us resolve this issue. I assumed ping would work between
>>>>> the other server and the VM. But it is not working in our case. Also,
>>>>> let us know if we are missing some setup step or if there is some
>>>>> misconfiguration. If ping would not work can you let us know a way to
>>>>> verify the connectivity?
>>>>>
>>>>> Thanks,
>>>>> Priyanka
>>>
>>>
> 
> 
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to