在将 linux 从内核 3.4 升级到 4.1 版本时,我们发现了性能下降问题。看来,这是因为新内核花费了更多时间来服务软中断。
我们使用生成 GTP-C 数据包(通过 UDP)的流量生成器 (IXIA) 和一个简单的应用程序进行了测试,该应用程序将接收到的数据包发回。它只是交换源 IP 地址和目标 IP 地址。我们使用 mpstat 实用程序得到以下结果:
- 内核 3.4
# mpstat -P 全部 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 全部 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/秒 79/秒 80/秒 81/秒 82/秒 83/秒 84/秒 103/秒 104/秒 105/秒 106/秒 107/秒 108/秒 109/秒 110/秒 111/秒 112/秒 113/秒 114/秒 115/秒 116/秒 117/秒 118/秒 119/秒 120/秒 121/秒 122/秒 123/秒 124/秒 125/秒 126/秒 127/秒 128/秒 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/sMCP/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.53 1.58 1.58 1.50 6.62 18028.71 1.53 0.53 0.53 0.50 0.50 0.50 0.50 0.50 0.50 0.40 0.40 0.40 0.40 174.64 0.00 0.00 0.00 0.40 0.40 0.40 0.00 0.00 0.00 0.00 282.00 0.00 0.00 0.92 0.00 0.00 0.00 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 ...
- 内核 4.1
# mpstat -P 全部 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 全部 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/秒 79/秒 80/秒 81/秒 82/秒 83/秒 84/秒 85/秒 86/秒 87/秒 88/秒 89/秒 91/秒 92/秒 93/秒 94/秒 95/秒 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/sMCP/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.73 0.82 2.53 17669.83 7.23 7.23 2.17 1.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.05.00 0.05.00 0.00 0.00 0.00 0.00 0.05 0.05 0.00 0.00 0.00 0.00 0.00 4.04 4.0.00 0.00 0.00 0.00 0.00 0.00 0 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 ...
测试条件:
- 流量速率:50000 fps
- 应用程序使用taskset命令绑定到CPU 1
- 所有中断(与以太网接口相关)都绑定到 CPU 0。
正如我们所见,“%soft”在 CPU 0 上显着增加:12.91% -> 52.79%。但是 NET_RX/s 减少了:62813.75 -> 56777.58。
我们还尝试使用 perf 实用程序分析 CPU 0。不幸的是,没有找到任何线索。
- 内核 3.4
# perf stat -C 0 -e irq:softirq_entry,irq:softirq_exit,irq:softirq_raise -a sleep 60 “睡眠 60”的性能计数器统计信息: 3690739 irq:softirq_entry [100.00%] 3691328 irq:softirq_exit [100.00%] 4366035 中断:softirq_raise 60.020019821 秒时间过去 # perf stat -C 0 -d -a sleep 60 “睡眠 60”的性能计数器统计信息: 59978.442551 任务时钟 # 0.999 CPU 使用 [100.00%] 138638 上下文切换 # 0.002 M/秒 [100.00%] 4206 CPU 迁移 # 0.070 K/秒 [100.00%] 91404 页面错误 # 0.002 M/sec 49824470562 周期 # 0.831 GHz [49.34%] 32279104677stalled-cycles-frontend #64.79% 前端周期空闲 [48.20%] 停滞的周期后端 41765280058 指令 # 0.84 insns 每周期 # 每个insn 0.77 个停滞周期[62.35%] 6939461584 个分支#115.699 M/sec [62.90%] 69255081 分支未命中 # 所有分支的 1.00% [61.90%] 13778063320 L1-dcache-loads #229.717 M/sec [63.72%] 757751494 L1-dcache-load-misses # 所有 L1-dcache 命中的 5.50% [63.85%] 153774796 LLC 负载 # 2.564 M/秒 [50.09%] LLC-负载未命中 60.065977609 秒时间过去
- 内核 4.1
# perf stat -C 0 -e irq:softirq_entry,irq:softirq_exit,irq:softirq_raise -a sleep 60 'CPU(s) 0' 的性能计数器统计信息: 3540101 irq:softirq_entry (100.00%) 3540380 irq:softirq_exit (100.00%) 4365512 中断:softirq_raise 60.061923392 秒时间过去 # perf stat -C 0 -d -a sleep 60 'CPU(s) 0' 的性能计数器统计信息: 60105.618981 task-clock (msec) # 1.001 CPUs used (100.00%) 112358 上下文切换 # 0.002 M/秒 (100.00%) 3042 次 CPU 迁移 # 0.051 K/秒 (100.00%) 23077 页面错误 # 0.384 K/秒 69596616908 周期 # 1.158 GHz (44.44%) 47063269010stalled-cycles-frontend #67.62% 前端周期空闲 (44.43%) 停滞的周期后端 47882140206 指令 # 0.69 insns 每周期 # 每个insn 0.98 个停滞周期(55.54%) 8644786229 个分支# 143.827 M/sec (55.54%) 82066359 分支未命中 # 占所有分支的 0.95% (55.55%) 15150062571 L1-dcache-loads #252.057 M/sec (44.45%) 891694267 L1-dcache-load-misses # 所有 L1-dcache 命中的 5.89% (22.23%) 192155955 LLC 负载 # 3.197 M/秒 (22.23%) 148469 LLC-load-misses # 所有 LL-cache 命中的 0.08% (33.33%) 60.062744860 秒时间过去
也许,有人面临类似的问题。任何意见和建议将不胜感激。