ntop / PF_RING

High-speed packet processing framework
http://www.ntop.org
GNU Lesser General Public License v2.1
2.68k stars 352 forks source link

i40e: performance drops when using more than 1 RSS queue per interface #248

Closed desbma closed 6 years ago

desbma commented 7 years ago

When using 2 zcount instances each on a 10 GbE interface I managed to get almost no loss (the few frames lost are because of #244, bust as a percentage it is extremely low).

However when I use more than the default 1 RSS queue per interface, performance drops dramatically:

$ ethtool -L enp15s0f0 combined 2
$ ethtool -L enp15s0f1 combined 2

and then running on 4 different terminals:

$ sudo ~/PF_RING-6.6.0/userland/examples_zc/zcount -i zc:enp15s0f0@0 -c 0 -g 0
$ sudo ~/PF_RING-6.6.0/userland/examples_zc/zcount -i zc:enp15s0f0@1 -c 1 -g 4
$ sudo ~/PF_RING-6.6.0/userland/examples_zc/zcount -i zc:enp15s0f1@0 -c 2 -g 8
$ sudo ~/PF_RING-6.6.0/userland/examples_zc/zcount -i zc:enp15s0f1@1 -c 3 -g 12

For 10 seconds of 2 x 10 Gb/s of 64 bytes frames (~148 809 000 frames per interface), I capture about 62 200 000 frames per process, so about 124 400 000 frames per interface which is ~16% lost frames.

Is there some tweaks I could do to improve performance in this case?

My environment is the following:

Thank you

EDIT : During traffic each core hosting a zcount instance is loaded by about 20% (user time).

cardigliano commented 7 years ago

Please provide the output of:

  1. lstopo
  2. top (press 1) while running the test
desbma commented 7 years ago

As requested:

  1. lstopo:

    $ lstopo --of console
    Machine (252GB total)
    NUMANode L#0 (P#0 63GB)
    Package L#0 + L3 L#0 (35MB)
      L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
        PU L#0 (P#0)
        PU L#1 (P#56)
      L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
        PU L#2 (P#4)
        PU L#3 (P#60)
      L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
        PU L#4 (P#8)
        PU L#5 (P#64)
      L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
        PU L#6 (P#12)
        PU L#7 (P#68)
      L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
        PU L#8 (P#16)
        PU L#9 (P#72)
      L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
        PU L#10 (P#20)
        PU L#11 (P#76)
      L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
        PU L#12 (P#24)
        PU L#13 (P#80)
      L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
        PU L#14 (P#28)
        PU L#15 (P#84)
      L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
        PU L#16 (P#32)
        PU L#17 (P#88)
      L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
        PU L#18 (P#36)
        PU L#19 (P#92)
      L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
        PU L#20 (P#40)
        PU L#21 (P#96)
      L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
        PU L#22 (P#44)
        PU L#23 (P#100)
      L2 L#12 (256KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12
        PU L#24 (P#48)
        PU L#25 (P#104)
      L2 L#13 (256KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13
        PU L#26 (P#52)
        PU L#27 (P#108)
    HostBridge L#0
      PCIBridge
        PCI 14e4:165f
          Net L#0 "eno3"
        PCI 14e4:165f
          Net L#1 "eno4"
      PCIBridge
        PCI 14e4:165f
          Net L#2 "eno1"
        PCI 14e4:165f
          Net L#3 "eno2"
      PCIBridge
        PCI 8086:1572
          Net L#4 "enp15s0f0"
        PCI 8086:1572
          Net L#5 "enp15s0f1"
      PCIBridge
        PCI 1000:005d
          Block(Disk) L#6 "sda"
          Block(Disk) L#7 "sdb"
      PCIBridge
        PCIBridge
          PCIBridge
            PCIBridge
              PCI 102b:0534
      PCI 8086:1d02
        Block(Removable Media Device) L#8 "sr0"
    NUMANode L#1 (P#1 63GB) + Package L#1 + L3 L#1 (35MB)
    L2 L#14 (256KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14
      PU L#28 (P#1)
      PU L#29 (P#57)
    L2 L#15 (256KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15
      PU L#30 (P#5)
      PU L#31 (P#61)
    L2 L#16 (256KB) + L1d L#16 (32KB) + L1i L#16 (32KB) + Core L#16
      PU L#32 (P#9)
      PU L#33 (P#65)
    L2 L#17 (256KB) + L1d L#17 (32KB) + L1i L#17 (32KB) + Core L#17
      PU L#34 (P#13)
      PU L#35 (P#69)
    L2 L#18 (256KB) + L1d L#18 (32KB) + L1i L#18 (32KB) + Core L#18
      PU L#36 (P#17)
      PU L#37 (P#73)
    L2 L#19 (256KB) + L1d L#19 (32KB) + L1i L#19 (32KB) + Core L#19
      PU L#38 (P#21)
      PU L#39 (P#77)
    L2 L#20 (256KB) + L1d L#20 (32KB) + L1i L#20 (32KB) + Core L#20
      PU L#40 (P#25)
      PU L#41 (P#81)
    L2 L#21 (256KB) + L1d L#21 (32KB) + L1i L#21 (32KB) + Core L#21
      PU L#42 (P#29)
      PU L#43 (P#85)
    L2 L#22 (256KB) + L1d L#22 (32KB) + L1i L#22 (32KB) + Core L#22
      PU L#44 (P#33)
      PU L#45 (P#89)
    L2 L#23 (256KB) + L1d L#23 (32KB) + L1i L#23 (32KB) + Core L#23
      PU L#46 (P#37)
      PU L#47 (P#93)
    L2 L#24 (256KB) + L1d L#24 (32KB) + L1i L#24 (32KB) + Core L#24
      PU L#48 (P#41)
      PU L#49 (P#97)
    L2 L#25 (256KB) + L1d L#25 (32KB) + L1i L#25 (32KB) + Core L#25
      PU L#50 (P#45)
      PU L#51 (P#101)
    L2 L#26 (256KB) + L1d L#26 (32KB) + L1i L#26 (32KB) + Core L#26
      PU L#52 (P#49)
      PU L#53 (P#105)
    L2 L#27 (256KB) + L1d L#27 (32KB) + L1i L#27 (32KB) + Core L#27
      PU L#54 (P#53)
      PU L#55 (P#109)
    NUMANode L#2 (P#2 63GB) + Package L#2 + L3 L#2 (35MB)
    L2 L#28 (256KB) + L1d L#28 (32KB) + L1i L#28 (32KB) + Core L#28
      PU L#56 (P#2)
      PU L#57 (P#58)
    L2 L#29 (256KB) + L1d L#29 (32KB) + L1i L#29 (32KB) + Core L#29
      PU L#58 (P#6)
      PU L#59 (P#62)
    L2 L#30 (256KB) + L1d L#30 (32KB) + L1i L#30 (32KB) + Core L#30
      PU L#60 (P#10)
      PU L#61 (P#66)
    L2 L#31 (256KB) + L1d L#31 (32KB) + L1i L#31 (32KB) + Core L#31
      PU L#62 (P#14)
      PU L#63 (P#70)
    L2 L#32 (256KB) + L1d L#32 (32KB) + L1i L#32 (32KB) + Core L#32
      PU L#64 (P#18)
      PU L#65 (P#74)
    L2 L#33 (256KB) + L1d L#33 (32KB) + L1i L#33 (32KB) + Core L#33
      PU L#66 (P#22)
      PU L#67 (P#78)
    L2 L#34 (256KB) + L1d L#34 (32KB) + L1i L#34 (32KB) + Core L#34
      PU L#68 (P#26)
      PU L#69 (P#82)
    L2 L#35 (256KB) + L1d L#35 (32KB) + L1i L#35 (32KB) + Core L#35
      PU L#70 (P#30)
      PU L#71 (P#86)
    L2 L#36 (256KB) + L1d L#36 (32KB) + L1i L#36 (32KB) + Core L#36
      PU L#72 (P#34)
      PU L#73 (P#90)
    L2 L#37 (256KB) + L1d L#37 (32KB) + L1i L#37 (32KB) + Core L#37
      PU L#74 (P#38)
      PU L#75 (P#94)
    L2 L#38 (256KB) + L1d L#38 (32KB) + L1i L#38 (32KB) + Core L#38
      PU L#76 (P#42)
      PU L#77 (P#98)
    L2 L#39 (256KB) + L1d L#39 (32KB) + L1i L#39 (32KB) + Core L#39
      PU L#78 (P#46)
      PU L#79 (P#102)
    L2 L#40 (256KB) + L1d L#40 (32KB) + L1i L#40 (32KB) + Core L#40
      PU L#80 (P#50)
      PU L#81 (P#106)
    L2 L#41 (256KB) + L1d L#41 (32KB) + L1i L#41 (32KB) + Core L#41
      PU L#82 (P#54)
      PU L#83 (P#110)
    NUMANode L#3 (P#3 63GB)
    Package L#3 + L3 L#3 (35MB)
      L2 L#42 (256KB) + L1d L#42 (32KB) + L1i L#42 (32KB) + Core L#42
        PU L#84 (P#3)
        PU L#85 (P#59)
      L2 L#43 (256KB) + L1d L#43 (32KB) + L1i L#43 (32KB) + Core L#43
        PU L#86 (P#7)
        PU L#87 (P#63)
      L2 L#44 (256KB) + L1d L#44 (32KB) + L1i L#44 (32KB) + Core L#44
        PU L#88 (P#11)
        PU L#89 (P#67)
      L2 L#45 (256KB) + L1d L#45 (32KB) + L1i L#45 (32KB) + Core L#45
        PU L#90 (P#15)
        PU L#91 (P#71)
      L2 L#46 (256KB) + L1d L#46 (32KB) + L1i L#46 (32KB) + Core L#46
        PU L#92 (P#19)
        PU L#93 (P#75)
      L2 L#47 (256KB) + L1d L#47 (32KB) + L1i L#47 (32KB) + Core L#47
        PU L#94 (P#23)
        PU L#95 (P#79)
      L2 L#48 (256KB) + L1d L#48 (32KB) + L1i L#48 (32KB) + Core L#48
        PU L#96 (P#27)
        PU L#97 (P#83)
      L2 L#49 (256KB) + L1d L#49 (32KB) + L1i L#49 (32KB) + Core L#49
        PU L#98 (P#31)
        PU L#99 (P#87)
      L2 L#50 (256KB) + L1d L#50 (32KB) + L1i L#50 (32KB) + Core L#50
        PU L#100 (P#35)
        PU L#101 (P#91)
      L2 L#51 (256KB) + L1d L#51 (32KB) + L1i L#51 (32KB) + Core L#51
        PU L#102 (P#39)
        PU L#103 (P#95)
      L2 L#52 (256KB) + L1d L#52 (32KB) + L1i L#52 (32KB) + Core L#52
        PU L#104 (P#43)
        PU L#105 (P#99)
      L2 L#53 (256KB) + L1d L#53 (32KB) + L1i L#53 (32KB) + Core L#53
        PU L#106 (P#47)
        PU L#107 (P#103)
      L2 L#54 (256KB) + L1d L#54 (32KB) + L1i L#54 (32KB) + Core L#54
        PU L#108 (P#51)
        PU L#109 (P#107)
      L2 L#55 (256KB) + L1d L#55 (32KB) + L1i L#55 (32KB) + Core L#55
        PU L#110 (P#55)
        PU L#111 (P#111)
    HostBridge L#9
      PCIBridge
        PCI 1000:005d
          Block(Disk) L#9 "sdc"
  2. top output (cut because with 112 cores, lines don't fit in console):

    top - 10:34:14 up 5 days, 3 min,  5 users,  load average: 0,24, 0,10, 0,03
    Tâches: 989 total,   1 en cours, 988 en veille,   0 arrêté,   0 zombie
    %Cpu0  : 19,1 ut,  0,7 sy,  0,0 ni, 80,2 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu1  :  0,7 ut,  1,0 sy,  0,0 ni, 98,3 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu2  :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu3  :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu4  : 19,9 ut,  0,7 sy,  0,0 ni, 79,5 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu5  :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu6  :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu7  :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu8  : 21,0 ut,  0,0 sy,  0,0 ni, 79,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu9  :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu10 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu11 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu12 : 18,3 ut,  0,7 sy,  0,0 ni, 81,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu13 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu14 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu15 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu16 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu17 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu18 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu19 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu20 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu21 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu22 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu23 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu24 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu25 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu26 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu27 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu28 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu29 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu30 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu31 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu32 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu33 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu34 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu35 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu36 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu37 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu38 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu39 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu40 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu41 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu42 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
    %Cpu43 :  0,0 ut,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
cardigliano commented 7 years ago

Please try running zcount in active-wait mode (-a) as I need to figure out if it somehow depends on passive wait sleeping too much or on some hw-related issue.

desbma commented 7 years ago

It's much better with -a, although I still have more loss than with a single RSS queue.

For 10s of 2 x 10 Gb/s of 64 B frames traffic, I get:

EDIT : I also noticed the most loss seem to occur in the first zcount instance, I tried to pin it to core 16 instead of 0 (Intel recommends to avoid core 0 with DPDK because Linux uses core 0 for some timers apparently), but it did not change much performance.

cardigliano commented 7 years ago

@desbma please note that i40e interfaces have per-port drop counters, thus all drops from all queues are accounted to queue 0. As of RSS vs single queue, strange that you have more drops, however using more RSS queues you also increase the working set in memory, probably affecting cache trashing, that could explain this (depending on traffic rate, number of rss queues, cache size, etc).

cardigliano commented 6 years ago

A few changes have been made changes to irq management and other code, RSS is doing line-rate in our lab. Please reopen in case.