Hi Mike,

Thanks for the patch - comments below.

Mike Pattrick <m...@redhat.com> writes:

> Currently the ovs-tcpdump utility creates a virtual tunnel to send
> packets to. This method functions perfectly fine, however, it can
> greatly impact the performance of the monitored port.
>
> It has been reported to reduce packet throughput significantly. I was
> able to reproduce a reduction in throughput of 70 percent with a very
> simple setup of two hosts communicating through a single bridge. This
> testing was performed on Linux both with and without the kernel module
> module loaded. Another more complex DPDK test was configured with the
> data path going from a port, through one OVS bridge, through a DPDK
> enabled network card, then into a different OVS bridge, and finally
> into another port.
>
> Using the dummy driver instead of a tunnel results in the following
> reduction in throughput compared to no ovs-tcpdump.
>
> Kernel datapath - 5%
> Usermode datapath - 10%
> DPDK datapath - 17%

What about before the dummy driver change?  Can you add the numbers
pre/post this patch?

> Signed-off-by: Mike Pattrick <m...@redhat.com>
> ---
>  utilities/ovs-tcpdump.in | 17 +++--------------
>  1 file changed, 3 insertions(+), 14 deletions(-)
>
> diff --git a/utilities/ovs-tcpdump.in b/utilities/ovs-tcpdump.in
> index 5ec02383c..9be39827e 100755
> --- a/utilities/ovs-tcpdump.in
> +++ b/utilities/ovs-tcpdump.in
> @@ -52,7 +52,6 @@ except Exception:
>      print("       the correct location.")
>      sys.exit(1)
>  
> -tapdev_fd = None
>  _make_taps = {}
>  _make_mirror_name = {}
>  IFNAMSIZ_LINUX = 15      # this is the max name size, excluding the null 
> byte.
> @@ -68,20 +67,10 @@ def _doexec(*args, **kwargs):
>  
>  
>  def _install_tap_linux(tap_name, mtu_value=None):

One nit - this function doesn't install a tap device any longer.  Maybe
we should make it:

   def _install_net_device_linux(dev_name, mtu_value=None):

WDYT?

Otherwise, looks fine to me.

> -    """Uses /dev/net/tun to create a tap device"""
> -    global tapdev_fd
> +    _doexec(
> +        *['ip', 'link', 'add', str(tap_name), 'type', 'dummy']
> +        ).wait()
>  
> -    IFF_TAP = 0x0002
> -    IFF_NO_PI = 0x1000
> -    TUNSETIFF = 0x400454CA  # This is derived by printf() of TUNSETIFF
> -    TUNSETOWNER = TUNSETIFF + 2
> -
> -    tapdev_fd = os.open('/dev/net/tun', os.O_RDWR)
> -    ifr = struct.pack('16sH', tap_name.encode('utf8'), IFF_TAP | IFF_NO_PI)
> -    fcntl.ioctl(tapdev_fd, TUNSETIFF, ifr)
> -    fcntl.ioctl(tapdev_fd, TUNSETOWNER, os.getegid())
> -
> -    time.sleep(1)  # required to give the new device settling time
>      if mtu_value is not None:
>          pipe = _doexec(
>              *(['ip', 'link', 'set', 'dev', str(tap_name), 'mtu',

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to