2017-12-25 17 views
0

Wir haben ein Problem mit der Leistungseinbuße beim Linux-Uplift von Kernel 3.4 auf 4.1 festgestellt. Scheinbar liegt es daran, dass der neue Kernel viel mehr Zeit benötigt, um Softirqs zu bedienen.Warum wurden Zeit-Service-Softirqs auf Kernel 4.1 im Vergleich zu Kernel 3.4 erhöht?

Wir haben einen Test mit Traffic Generator (IXIA) durchgeführt, der GTP-C-Pakete (über UDP) und eine einfache Anwendung erzeugt, die das empfangene Paket zurücksendet. Es tauscht nur Quell- und Ziel-IP-Adressen aus. Wir haben die folgenden Ergebnisse mit mpstat Dienstprogramm:

  • Kernel 3,4
 
# mpstat -P ALL 60 1 
Linux 3.4.91-grsec (...) 12/22/17 _x86_64_ (20 CPU) 

15:58:43  CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 
15:58:53  all 0.26 0.00 2.21 0.00 0.00 0.41 0.00 0.00 97.12 
15:58:53  0 1.03 0.00 3.79 0.00 0.00 12.91 0.00 0.00 82.27 
15:58:53  1 4.18 0.00 41.44 0.00 0.00 0.00 0.00 0.00 54.38 
15:58:53  2 0.30 0.00 0.30 0.00 0.00 0.40 0.00 0.00 99.00 
... 

# mpstat -I ALL -P 0 60 1 
Linux 3.4.91-grsec (...) 12/25/17 _x86_64_ (20 CPU) 

10:53:16  CPU intr/s 
10:54:16  0  0.00 

10:53:16  CPU  0/s  3/s  4/s  8/s  9/s  67/s  68/s  69/s  70/s  71/s  72/s  73/s  74/s  75/s  76/s  77/s  78/s  79/s  80/s  81/s  82/s  83/s  84/s  103/s  104/s  105/s  106/s  107/s  108/s  109/s  110/s  111/s  112/s  113/s  114/s  115/s  116/s  117/s  118/s  119/s  120/s  121/s  122/s  123/s  124/s  125/s  126/s  127/s  128/s  129/s  130/s  131/s  132/s  133/s  134/s  135/s  136/s  137/s  138/s  139/s  140/s  141/s  142/s  143/s  144/s  NMI/s  LOC/s  SPU/s  PMI/s  IWI/s  RTR/s  RES/s  CAL/s  TLB/s  TRM/s  THR/s  MCE/s  MCP/s  ERR/s  MIS/s 
10:54:16  0  0.00  5.50  0.00  0.00  0.00  0.00  71.59  0.50  1.60  6.47  1.50  16.66  0.50  1.50  0.00  71.59  0.50  0.60  6.47  1.50  16.66  1.50  1.50  126.91 17445.01  9.93  1.87  1.28  1.25  1.27  4.82  0.83  1.37  1.58  7.45  14.38  3.45 18060.49  2.18  0.97  1.00  0.58  0.83  0.00  87.70 17503.72  7.62  1.22  0.75  0.67  0.98  2.98  0.53  1.87  1.58  1.50  6.62 18028.71  1.53  0.53  0.50  0.50  0.50  0.50  0.00  0.40  174.64  0.00  0.40  0.00  0.00  282.10  0.00  0.92  0.00  0.00  0.00  0.00  0.00  0.00 

10:53:16  CPU  HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s  RCU/s 
10:54:16  0  0.00  166.49  0.25 62813.75  0.00   0.00  0.00  298.20  0.87  130.00 
... 
  • Kernel 4,1
 
# mpstat -P ALL 60 1 
Linux 4.1.21 (...) 12/22/17 _x86_64_ (20 CPU) 

16:19:12  CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 
16:19:22  all 0.28 0.00 2.23 0.00 0.00 2.65 0.00 0.00 94.84 
16:19:22  0 1.40 0.00 2.59 0.00 0.00 52.79 0.00 0.00 43.21 
16:19:22  1 3.66 0.00 42.47 0.00 0.00 0.00 0.00 0.00 53.87 
16:19:22  2 0.10 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.70 
... 

# mpstat -I ALL -P 0 60 1 
Linux 4.1.21 (...) 12/25/17 _x86_64_ (20 CPU) 

10:35:45  CPU intr/s 
10:36:45  0  0.00 

10:35:45  CPU  0/s  3/s  4/s  8/s  9/s  31/s  32/s  33/s  34/s  35/s  36/s  37/s  38/s  39/s  41/s  42/s  43/s  44/s  45/s  46/s  47/s  48/s  49/s  69/s  70/s  71/s  72/s  73/s  74/s  75/s  76/s  77/s  78/s  79/s  80/s  81/s  82/s  83/s  84/s  85/s  86/s  87/s  88/s  89/s  91/s  92/s  93/s  94/s  95/s  96/s  97/s  98/s  99/s  100/s  101/s  102/s  103/s  104/s  105/s  106/s  107/s  108/s  109/s  110/s  111/s  NMI/s  LOC/s  SPU/s  PMI/s  IWI/s  RTR/s  RES/s  CAL/s  TLB/s  TRM/s  THR/s  MCE/s  MCP/s  ERR/s  MIS/s 
10:36:45  0  0.00  5.43  0.00  0.00  0.00  0.00  81.55  0.50  0.60  2.50  0.50  12.63  0.50  2.00  0.00  81.55  0.50  0.60  2.50  0.50  12.63  0.50  1.50  134.87 16949.32  3.25  2.62  3.55  1.32 17720.62  7.03  7.35  3.58  1.63  6.73  3.53  4.48  5.33  1.37  1.42  0.83  10.58  0.52  0.00  90.33 16160.05  3.72  2.07  0.73  0.82  2.53 17669.83  7.23  2.17  1.50  0.50  1.57  0.50  0.50  0.50  0.50  0.50  10.50  0.50  0.00  0.05 1005.90  0.00  0.05  0.00  0.00  4.05  0.00  1.85  0.00  0.00  0.00  0.02  0.00  0.00 

10:35:45  CPU  HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s  RCU/s 
10:36:45  0  0.00 1000.05  2.93 56777.58  0.00   0.00  0.57  285.15  0.00 1313.05 
... 

Die Testbedingungen:

  1. Verkehrsrate: 50000 fps
  2. Die Anwendung auf die CPU 1 unter Verwendung taskset Befehl
  3. Alle Interrupts gebunden ist (die mit Ethernet-Schnittstellen verbunden sind) sind mit der CPU 0.

Wie wir gebunden kann sehen, "% soft" ist auf der CPU deutlich erhöht 0: 12,91% -> 52,79%. NET_RX/s ist jedoch verringert: 62813.75 -> 56777.58.

Wir haben auch versucht, die CPU 0 mit dem Perf Utility zu profilieren. Leider ist keine Spur gefunden.

  • Kernel 3,4
 
# perf stat -C 0 -e irq:softirq_entry,irq:softirq_exit,irq:softirq_raise -a sleep 60 

Performance counter stats for 'sleep 60': 

      3690739 irq:softirq_entry           [100.00%] 
      3691328 irq:softirq_exit            [100.00%] 
      4366035 irq:softirq_raise           

     60.020019821 seconds time elapsed 
# perf stat -C 0 -d -a sleep 60 

Performance counter stats for 'sleep 60': 

     59978.442551 task-clock    # 0.999 CPUs utilized   [100.00%] 
      138638 context-switches   # 0.002 M/sec     [100.00%] 
       4206 CPU-migrations   # 0.070 K/sec     [100.00%] 
      91404 page-faults    # 0.002 M/sec     
     49824470562 cycles     # 0.831 GHz      [49.34%] 
     32279104677 stalled-cycles-frontend # 64.79% frontend cycles idle [48.20%] 
    stalled-cycles-backend 
     41765280058 instructions    # 0.84 insns per cycle   
              # 0.77 stalled cycles per insn [62.35%] 
     6939461584 branches     # 115.699 M/sec     [62.90%] 
      69255081 branch-misses    # 1.00% of all branches   [61.90%] 
     13778063320 L1-dcache-loads   # 229.717 M/sec     [63.72%] 
     757751494 L1-dcache-load-misses  # 5.50% of all L1-dcache hits [63.85%] 
     153774796 LLC-loads     # 2.564 M/sec     [50.09%] 
    LLC-load-misses   

     60.065977609 seconds time elapsed 
  • Kernel 4,1
 
# perf stat -C 0 -e irq:softirq_entry,irq:softirq_exit,irq:softirq_raise -a sleep 60 

Performance counter stats for 'CPU(s) 0': 

      3540101  irq:softirq_entry            (100.00%) 
      3540380  irq:softirq_exit            (100.00%) 
      4365512  irq:softirq_raise           

     60.061923392 seconds time elapsed 

# perf stat -C 0 -d -a sleep 60 

Performance counter stats for 'CPU(s) 0': 

     60105.618981  task-clock (msec)   # 1.001 CPUs utilized   (100.00%) 
      112358  context-switches   # 0.002 M/sec     (100.00%) 
       3042  cpu-migrations   # 0.051 K/sec     (100.00%) 
      23077  page-faults    # 0.384 K/sec     
     69596616908  cycles     # 1.158 GHz      (44.44%) 
     47063269010  stalled-cycles-frontend # 67.62% frontend cycles idle  (44.43%) 
     stalled-cycles-backend 
     47882140206  instructions    # 0.69 insns per cycle   
                # 0.98 stalled cycles per insn (55.54%) 
     8644786229  branches     # 143.827 M/sec     (55.54%) 
      82066359  branch-misses    # 0.95% of all branches   (55.55%) 
     15150062571  L1-dcache-loads   # 252.057 M/sec     (44.45%) 
     891694267  L1-dcache-load-misses  # 5.89% of all L1-dcache hits (22.23%) 
     192155955  LLC-loads     # 3.197 M/sec     (22.23%) 
      148469  LLC-load-misses   # 0.08% of all LL-cache hits  (33.33%) 

     60.062744860 seconds time elapsed 

Vielleicht konfrontiert, jemand mit einem ähnlichen Problem. Alle Ratschläge und Vorschläge werden sehr geschätzt.

Antwort

0

Hatte ein ähnliches Problem beim Upgrade von 3.16 auf 4.9 Kernel (d. H. Debian Jessie zu Debian Stretch).

Die Netzwerkleistung für UDP ist deutlich gesunken.

Wir hatten keinen Geistesblitz, der uns half, den Schuldigen dafür zu finden.

Allerdings haben wir einige Tuning und kamen ziemlich nah an die vorherige Leistung:

1) Mit RSS. Weisen Sie die CPU-Kerne den Empfangswarteschlangen der NICs statisch zu. Stoppen Sie den irqbalance-Dienst. RPS und RFS haben die Leistung nicht weiter verbessert als in unserem Fall, aber abhängig von Ihrer Hardware könnte es für Sie nützlich sein.

2) Reduzieren Sie das Intervall, in dem der Scheduler aktiv wird. Ich habe einfach die Parameter von this article verwendet.

Some further literature