引子

  使用qlogic QL45000网卡测试业务性能,发现cpu软中断分布不均衡,而且很有规律,导致cpu空闲也不是很均衡,

会影响业务稳定性。

  设备使用3张网卡Qlogic网卡,配置为4*25G模式,也就是12个25G网口。三张网卡中其中两张接在物理cpu0上,

另一张接在物理cpu1上。笔者以为是由于三张网卡在物理架构上不均衡导致的cpu软中断不均衡,但是屏蔽了物理

cpu0上的其中一张网卡的四个网口后,cpu软中断仍然不均衡。所以,可能是其他原因导致的这个问题。

问题背景

  我们的设备主要是提供高并发业务,出向流量带宽达到网口带宽的80%,为了提高服务器网卡发包性能,一般会

对网卡中断绑核,应用程序也会做发包绑核。我们一般的绑核原则是网卡中断依次绑定在各个cpu核上,中断和cpu核

是一对一的,也就是ethX-RxTx-0 对应cpu0,ethX-RxTx-1对应cpu1,ethX-RxTx-N 对应cpuN,N是最大的cpu核数。

一般网卡可用队列数(一般队列数和网卡中断数对应的)是与cpu核数对应的。但是也有网卡可配置最大队列数小于

cpu核数,比如Mellanox网卡和我们现在用到的Qlogic网卡。

  当网卡可配置最大队列数小于cpu核数时,我们倾向于配置网卡队列数为cpu核数的一半,然后把网卡中断绑定到

该网卡所在numa节点对应的cpu上。目的是为了避免网卡NAPI poll跨numa节点处理中断(清理rx、tx队列),造成不

必要的系统消耗。

  在使用Qlogic网卡做业务性能测试时,就是按照以上说明做网卡队列设置和绑核。但是出现了系统软中断不均衡

的问题。下面显示了系统CPU负荷,网口出向流量、perf top等数据信息。

相关数据信息

CPU负荷信息:

CPU            %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

15:56:00     all    8.58    0.00   15.00    0.00    2.15   14.84    0.00    0.00    0.00   59.43

15:56:00       0   18.45    0.00    9.22    0.00    2.43   14.08    0.00    0.00    0.00   55.83

15:56:00       1    8.43    0.00    8.99    0.00    2.81   14.04    0.00    0.00    0.00   65.73

15:56:00       2    7.21    0.00   21.63    0.00    1.92   12.02    0.00    0.00    0.00   57.21

15:56:00       3    8.20    0.00   18.58    0.00    2.19   13.11    0.00    0.00    0.00   57.92

15:56:00       4    4.79    0.00    5.99    0.00    2.40   14.37    0.00    0.00    0.00   72.46

15:56:00       5    6.82    0.00    8.52    0.00    2.84   14.20    0.00    0.00    0.00   67.61

15:56:00       6    6.74    0.00   10.67    0.00    2.81   13.48    0.00    0.00    0.00   66.29

15:56:00       7    7.73    0.00   21.74    0.00    2.42   11.59    0.00    0.00    0.00   56.52

15:56:00       8    7.22    0.00   16.49    0.00    2.06   12.89    0.00    0.00    0.00   61.34

15:56:00       9   11.11    0.00   13.13    0.00    2.02   12.12    0.00    0.00    0.00   61.62

15:56:00      10   13.36    0.00   17.05    0.00    2.30   11.06    0.00    0.00    0.00   56.22

15:56:00      11    8.51    0.00   12.77    0.00    2.66   12.77    0.00    0.00    0.00   63.30

15:56:00      12    9.76    0.00   16.10    0.00    1.95   12.20    0.00    0.00    0.00   60.00

15:56:00      13    6.70    0.00   10.06    0.00    2.23   13.41    0.00    0.00    0.00   67.60

15:56:00      14    6.99    0.00   27.51    0.00    1.75   10.92    0.00    0.00    0.00   52.84

15:56:00      15   11.00    0.00   18.18    0.00    2.39   11.96    0.00    0.00    0.00   56.46

15:56:00      16    7.83    0.00   23.04    0.00    1.84   11.06    0.00    0.00    0.00   56.22

15:56:00      17    6.54    0.00   23.36    0.00    1.87   11.68    0.00    0.00    0.00   56.54

15:56:00      18    9.38    0.00   13.54    0.00    2.08   12.50    0.00    0.00    0.00   62.50

15:56:00      19    5.88    0.00    7.65    0.00    2.35   14.12    0.00    0.00    0.00   70.00

15:56:00      20    7.69    0.00   12.64    0.00    2.20   13.74    0.00    0.00    0.00   63.74

15:56:00      21    6.25    0.00   10.23    0.00    2.27   13.64    0.00    0.00    0.00   67.61

15:56:00      22    8.25    0.00   19.07    0.00    2.58   17.53    0.00    0.00    0.00   52.58

15:56:00      23    7.89    0.00   13.68    0.00    2.63   18.42    0.00    0.00    0.00   57.37

15:56:00      24    8.59    0.00   21.21    0.00    2.02   16.67    0.00    0.00    0.00   51.52

15:56:00      25   16.75    0.00   12.81    0.00    1.97   16.75    0.00    0.00    0.00   51.72

15:56:00      26    9.09    0.00   12.83    0.00    2.14   17.65    0.00    0.00    0.00   58.29

15:56:00      27    8.33    0.00    8.89    0.00    2.22   18.89    0.00    0.00    0.00   61.67

15:56:00      28    7.85    0.00   14.66    0.00    2.62   17.80    0.00    0.00    0.00   57.07

15:56:00      29   11.61    0.00   23.66    0.00    1.79   14.73    0.00    0.00    0.00   48.21

15:56:00      30    7.94    0.00   13.76    0.00    2.12   16.40    0.00    0.00    0.00   59.79

15:56:00      31    8.99    0.00   13.23    0.00    2.12   17.46    0.00    0.00    0.00   58.20

15:56:00      32   10.95    0.00   19.05    0.00    1.90   15.71    0.00    0.00    0.00   52.38

15:56:00      33   12.25    0.00   13.73    0.00    1.96   16.18    0.00    0.00    0.00   55.88

15:56:00      34    7.07    0.00   13.59    0.00    2.17   16.85    0.00    0.00    0.00   60.33

15:56:00      35    6.32    0.00    8.05    0.00    2.30   18.39    0.00    0.00    0.00   64.94

15:56:00      36    9.84    0.00   13.47    0.00    2.07   16.06    0.00    0.00    0.00   58.55

15:56:00      37    7.22    0.00   12.78    0.00    2.78   18.33    0.00    0.00    0.00   58.89

15:56:00      38    8.38    0.00   17.80    0.00    2.62   18.32    0.00    0.00    0.00   52.88

15:56:00      39   17.73    0.00   15.45    0.00    2.27   14.55    0.00    0.00    0.00   50.00

15:56:00      40    6.52    0.00   14.67    0.00    2.72   16.85    0.00    0.00    0.00   59.24

15:56:00      41    7.22    0.00   15.98    0.00    2.06   16.49    0.00    0.00    0.00   58.25

15:56:00      42    6.91    0.00   13.83    0.00    2.66   17.02    0.00    0.00    0.00   59.57

15:56:00      43    6.84    0.00   17.89    0.00    2.63   17.89    0.00    0.00    0.00   54.74

15:56:00      44    8.08    0.00   15.66    0.00    2.53   16.16    0.00    0.00    0.00   57.58

15:56:00      45    5.36    0.00   10.12    0.00    2.38   19.64    0.00    0.00    0.00   62.50

15:56:00      46    6.63    0.00   14.36    0.00    2.21   17.13    0.00    0.00    0.00   59.67

15:56:00      47    7.50    0.00   17.00    0.00    2.00   17.50    0.00    0.00    0.00   56.00

15:56:00      48    6.88    0.00   16.40    0.00    2.12   16.93    0.00    0.00    0.00   57.67

15:56:00      49    7.21    0.00   21.63    0.00    1.92   16.35    0.00    0.00    0.00   52.88

15:56:00      50    8.57    0.00   20.95    0.00    2.38   15.71    0.00    0.00    0.00   52.38

15:56:00      51    4.52    0.00   13.56    0.00    2.26   18.64    0.00    0.00    0.00   61.02

15:56:00      52    6.91    0.00   14.36    0.00    2.13   16.49    0.00    0.00    0.00   60.11

15:56:00      53    7.14    0.00    9.89    0.00    1.65   17.03    0.00    0.00    0.00   64.29

15:56:00      54   14.04    0.00   18.86    0.00    1.75   14.47    0.00    0.00    0.00   50.88

15:56:00      55   10.00    0.00   21.82    0.00    1.82   15.00    0.00    0.00    0.00   51.36

15:56:00      56    9.36    0.00   15.76    0.00    1.97   15.76    0.00    0.00    0.00   57.14

15:56:00      57    6.78    0.00    9.60    0.00    2.26   17.51    0.00    0.00    0.00   63.84

15:56:00      58    6.56    0.00   10.38    0.00    2.19   18.03    0.00    0.00    0.00   62.84

15:56:00      59    8.78    0.00   19.02    0.00    1.95   16.59    0.00    0.00    0.00   53.66

15:56:00      60    7.89    0.00   12.11    0.00    2.11   16.84    0.00    0.00    0.00   61.05

15:56:00      61    5.08    0.00    9.04    0.00    2.26   18.08    0.00    0.00    0.00   65.54

15:56:00      62    5.65    0.00    8.47    0.00    1.69   17.51    0.00    0.00    0.00   66.67

15:56:00      63    4.19    0.00    5.99    0.00    2.40   19.76    0.00    0.00    0.00   67.66

15:56:00      64    6.42    0.00   13.37    0.00    2.14   18.18    0.00    0.00    0.00   59.89

15:56:00      65    8.63    0.00   13.71    0.00    2.54   17.26    0.00    0.00    0.00   57.87

15:56:00      66    7.80    0.00   21.95    0.00    1.95   11.71    0.00    0.00    0.00   56.59

15:56:00      67    9.39    0.00   11.05    0.00    2.21   13.26    0.00    0.00    0.00   64.09

15:56:00      68    8.29    0.00   14.92    0.00    2.21   14.36    0.00    0.00    0.00   60.22

15:56:00      69   13.74    0.00   20.38    0.00    1.90   11.85    0.00    0.00    0.00   52.13

15:56:00      70   14.80    0.00   21.08    0.00    1.79   10.76    0.00    0.00    0.00   51.57

15:56:00      71   16.91    0.00   12.08    0.00    1.93   11.59    0.00    0.00    0.00   57.49

15:56:00      72    8.51    0.00   13.30    0.00    1.60   12.77    0.00    0.00    0.00   63.83

15:56:00      73    9.90    0.00   16.34    0.00    1.98   12.38    0.00    0.00    0.00   59.41

15:56:00      74    8.25    0.00   12.37    0.00    2.06   12.89    0.00    0.00    0.00   64.43

15:56:00      75    6.38    0.00   14.36    0.00    2.13   13.30    0.00    0.00    0.00   63.83

15:56:00      76    9.80    0.00   17.16    0.00    1.96   12.25    0.00    0.00    0.00   58.82

15:56:00      77    7.11    0.00   15.23    0.00    2.03   12.18    0.00    0.00    0.00   63.45

15:56:00      78    6.56    0.00   11.48    0.00    1.64   13.66    0.00    0.00    0.00   66.67

15:56:00      79    6.63    0.00    9.94    0.00    1.66   13.81    0.00    0.00    0.00   67.96

15:56:00      80    4.65    0.00    7.56    0.00    2.33   14.53    0.00    0.00    0.00   70.93

15:56:00      81    5.75    0.00    8.62    0.00    2.30   13.79    0.00    0.00    0.00   69.54

15:56:00      82    8.25    0.00   16.49    0.00    2.06   13.40    0.00    0.00    0.00   59.79

15:56:00      83    5.63    0.00   23.00    0.00    1.88   11.74    0.00    0.00    0.00   57.75

15:56:00      84    5.75    0.00    8.05    0.00    1.72   14.37    0.00    0.00    0.00   70.11

15:56:00      85   12.99    0.00   21.21    0.00    1.73   10.39    0.00    0.00    0.00   53.68

15:56:00      86    6.56    0.00   10.38    0.00    2.19   13.66    0.00    0.00    0.00   67.21

15:56:00      87    8.54    0.00   17.59    0.00    2.51   12.06    0.00    0.00    0.00   59.30

网卡流量信息:

注意:屏蔽了其中一个网卡

2019-01-25 16:06:09   bond5:     3.64 Mb/s In  81292.31 Mb/s Out -   2732.2 p/s In  7362624.8 p/s Out
2019-01-25 16:06:09   bond6:     3.39 Mb/s In  93455.77 Mb/s Out -   1812.2 p/s In  8463913.5 p/s Out
2019-01-25 16:06:09   bond7:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09   bond8:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09   bond9:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09  enp1s0bak:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09  enp2s0bak:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09    eth0:     0.90 Mb/s In  19991.22 Mb/s Out -    686.5 p/s In  1810597.2 p/s Out
2019-01-25 16:06:09    eth1:     0.91 Mb/s In  20768.09 Mb/s Out -    675.0 p/s In  1880961.8 p/s Out
2019-01-25 16:06:09   eth10:     3.17 Mb/s In  23021.46 Mb/s Out -   1449.2 p/s In  2084982.0 p/s Out
2019-01-25 16:06:09   eth11:     0.07 Mb/s In  23860.54 Mb/s Out -    115.5 p/s In  2160935.5 p/s Out
2019-01-25 16:06:09    eth2:     0.07 Mb/s In  23031.12 Mb/s Out -    122.2 p/s In  2085820.0 p/s Out
2019-01-25 16:06:09    eth3:     0.07 Mb/s In  23538.46 Mb/s Out -    125.0 p/s In  2131795.0 p/s Out
2019-01-25 16:06:09    eth4:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09    eth5:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09    eth6:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09    eth7:     0.00 Mb/s In      0.00 Mb/s Out -      0.0 p/s In       0.0 p/s Out
2019-01-25 16:06:09    eth8:     0.93 Mb/s In  20218.63 Mb/s Out -    692.5 p/s In  1831241.0 p/s Out
2019-01-25 16:06:09    eth9:     0.90 Mb/s In  20313.86 Mb/s Out -    678.8 p/s In  1839829.0 p/s Out

perf top信息

采集cpu44和cpu0的内核热点情况

数据分析:

    每个网口的出向流量基本一致,但是从CPU系统消耗来看,同一个物理cpu上cpu44-cpu65软中断

比cpu0-cpu21要高50%左右,cpu22-cpu43软中断比cpu66-cpu87也要高50%左右。

  从perf top 内核热点数据看,qlogic网卡驱动的qede_free_tx_pkt占用有很大的差别。对比cpu44

和cpu0的热点数据可以看出,qede_free_tx_pkt相差在1倍。

  qlogic驱动中qede_free_tx_pkt函数用于清理发送队列descriptor。这个函数是由驱动的qede_tx_int

函数调用,而qede_tx_int又由qede_poll函数调用。qede_poll用于NAPI接口做tx/rx完成清理descriptor

工作,该函数由软中断处理函数调用。

问题分析

  从上面分析看出,问题集中在不同cpu核上qede_free_tx_pkt函数的调用热度,也就是qede_tx_int函数

的热度。为了得到更精确的数据,笔者修改了qlogic qede网卡驱动,统计所有cpu核上调用qede_tx_int的

次数和耗时。代码片段如下。

统计每个cpu上调用qede_tx_int函数的次数:

DEFINE_PER_CPU(atomic_t, qede_free_tx_cnt);

统计每个cpu上调用qede_tx_int函数消耗的时间:

DEFINE_PER_CPU(atomic64_t, qede_tx_time_use);

qede_poll函数
 int qede_poll(struct napi_struct *napi, int budget)
{
struct qede_fastpath *fp = container_of(napi, struct qede_fastpath,
napi);
struct qede_dev *edev = fp->edev;
int rx_work_done = ; atomic_t *free_cnt = NULL;
atomic64_t *time_use = NULL;
unsigned long long pre_time = ;
#ifdef TIME_FP_DEBUG /* ! QEDE_UPSTREAM */
qede_log_time(edev, fp, QEDE_FP_TIME_START);
#endif if (likely(fp->type & QEDE_FASTPATH_TX)) {
int cos; for_each_cos_in_txq(fp->edev, cos) {
if (qede_txq_has_work(&fp->txq[cos])){
free_cnt = &per_cpu(qede_free_tx_cnt, smp_processor_id());
time_use = &per_cpu(qede_tx_time_use, smp_processor_id());
atomic_inc(free_cnt); //增加调用次数
pre_time = qede_get_ms();
qede_tx_int(edev, &fp->txq[cos]);
atomic64_add(qede_get_ms()-pre_time, time_use); //统计函数调用消耗时间
}
}
} if ((fp->type & QEDE_FASTPATH_XDP) &&
qede_txq_has_work(fp->xdp_tx))
qede_xdp_tx_int(edev, fp); rx_work_done = (likely(fp->type & QEDE_FASTPATH_RX) &&
qede_has_rx_work(fp->rxq)) ?
qede_rx_int(fp, budget) : ;
if (rx_work_done < budget) {
if (!qede_poll_is_more_work(fp)) {
napi_complete_done(napi, rx_work_done);
qede_log_napi(fp, ); /* Update and reenable interrupts */
qede_log_intr(fp, IGU_INT_ENABLE);
qed_sb_ack(fp->sb_info, IGU_INT_ENABLE, );
} else {
rx_work_done = budget;
}
} /* TODO - if NAPI is to be rescheduled, do we still want this now? */
if (fp->xdp_xmit) {
u16 xdp_prod = qed_chain_get_prod_idx(&fp->xdp_tx->tx_pbl); fp->xdp_xmit = ;
fp->xdp_tx->tx_db.data.bd_prod = cpu_to_le16(xdp_prod);
qede_update_tx_producer(fp->xdp_tx);
} #ifdef TIME_FP_DEBUG /* ! QEDE_UPSTREAM */
qede_log_time(edev, fp,
(budget == rx_work_done) ?
QEDE_FP_TIME_END_RESCHEDULE :
QEDE_FP_TIME_END);
#endif
qede_log_napi(fp, rx_work_done);
return rx_work_done;
}

  为了简化测试,只保留一张网卡,共4个25G网口参与发包测试,其中测试网卡中断绑核在cpu0-cpu21和

cpu44-cpu65上。进行两组独立测试,其中一组发包线程绑定在cpu0-cpu21和cpu44-cpu65上,即物理cpu0,

另一组发包线程绑定在cpu22-cpu43和cpu66-cpu87上,也就是物理cpu1上。

(1)测试发包线程都绑核在cpu0-cpu21和cpu44-cpu65上

qede_tx_int函数调用次数和消耗时间统计

qede_txint_count:
            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11      CPU12      CPU13      CPU14      CPU15      CPU16      CPU17      CPU18      CPU19      CPU20      CPU21      
            CPU22      CPU23      CPU24      CPU25      CPU26      CPU27      CPU28      CPU29      CPU30      CPU31      CPU32      CPU33      CPU34      CPU35      CPU36      CPU37      CPU38      CPU39      CPU40      CPU41      CPU42      CPU43      
            CPU44      CPU45      CPU46      CPU47      CPU48      CPU49      CPU50      CPU51      CPU52      CPU53      CPU54      CPU55      CPU56      CPU57      CPU58      CPU59      CPU60      CPU61      CPU62      CPU63      CPU64      CPU65      
            CPU66      CPU67      CPU68      CPU69      CPU70      CPU71      CPU72      CPU73      CPU74      CPU75      CPU76      CPU77      CPU78      CPU79      CPU80      CPU81      CPU82      CPU83      CPU84      CPU85      CPU86      CPU87      
     1280243     1269738     1311879     1311250     1335467     1263842     1254232     1267668     1305027     1305619     1260312     1308969     1320315     1308007     1280278     1309876     1313781     1301604     1266910     1277516     1304452     1310784           
     0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0          
     18          10           4           0           3         105           0           9           0           0           0           0           3           0           0           0           0           0           0           0           0           0           
     0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0

qede_txint_time:
   736         753         754         745         767         749         699         723         758         738         746         715         782         749         723         722         772         765         705         708         715         747           
      0       0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           
      0       0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           
      0       0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0

(2)测试发包线程绑核在cpu22-cpu43和cpu66-cpu87上

qede_tx_int函数调用次数和消耗时间统计

qede_txint_count:
    CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11      CPU12      CPU13      CPU14      CPU15      CPU16      CPU17      CPU18      CPU19      CPU20      CPU21     
    CPU22      CPU23      CPU24      CPU25      CPU26      CPU27      CPU28      CPU29      CPU30      CPU31      CPU32      CPU33      CPU34      CPU35      CPU36      CPU37      CPU38      CPU39      CPU40      CPU41      CPU42      CPU43      
    CPU44      CPU45      CPU46      CPU47      CPU48      CPU49      CPU50      CPU51      CPU52      CPU53      CPU54      CPU55      CPU56      CPU57      CPU58      CPU59      CPU60      CPU61      CPU62      CPU63      CPU64      CPU65      
    CPU66      CPU67      CPU68      CPU69      CPU70      CPU71      CPU72      CPU73      CPU74      CPU75      CPU76      CPU77      CPU78      CPU79      CPU80      CPU81      CPU82      CPU83      CPU84      CPU85      CPU86      CPU87      
     24          22         137          12          20          41          24         129           3           2           0          22           4          14           2           1           2           8           0          51         114           3          
      0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0      
  886594      849267      854321      868577      858135      880255      850917      826788      832024      839281      886634      826803      838126      856868      845269      840800      838523      860735      837077      850221      866948      851408           
      0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0
qede_txint_time:
    1           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0    
    0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0               
 1429        1465        1405        1486        1473        1503        1477        1371        1400        1470        1486        1444        1414        1444        1400        1479        1427        1454        1404        1441        1479        1473           
    0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0           0          0

  从两次测试数据看,当发包线程在物理cpu0时,网卡主要在cpu0-cpu21上发包,同时观察到网卡发包

在queue0到queue21上;当发包线程在物理cpu1时,网卡主要在cpu44-cpu65上发包,同时观察到网卡发包

在queue22-queue43上。

  对比前后两次调用qede_tx_int函数次数和消耗时间看,在物理cpu1上发包时,qede_tx_int函数消耗更大。

  由此可以看出,这个qlogic网卡选择队列算法有关,当发包线程与中断不在同一cpu核上时,qede_tx_int

函数消耗差距比较大。笔者将在分析网卡发包队列选择规则后进行说明。

Qlogic网卡队列选择规则

  TX队列选择通过宏QEDE_NDEV_TXQ_ID_TO_TXQ决定,先通过QEDE_NDEV_TXQ_ID_TO_FP_ID选择FP队列,再通过

QEDE_NDEV_TXQ_ID_TO_TXQ_COS选择COS。

 #define QEDE_NDEV_TXQ_ID_TO_FP_ID(edev, idx)    \
((edev)->fp_num_rx + \
((idx) % (QEDE_BASE_TSS_COUNT(edev) + \
(edev)->fwd_dev_queues))) #define QEDE_NDEV_TXQ_ID_TO_TXQ_COS(edev, idx) \
((idx) / (QEDE_BASE_TSS_COUNT(edev) + \
(edev)->fwd_dev_queues)) #define QEDE_NDEV_TXQ_ID_TO_TXQ(edev, idx) \
(&((edev)->fp_array[QEDE_NDEV_TXQ_ID_TO_FP_ID(edev, idx)].txq \
[QEDE_NDEV_TXQ_ID_TO_TXQ_COS(edev, idx)]))
 netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev)
{
struct qede_dev *edev = netdev_priv(ndev);
struct netdev_queue *netdev_txq;
struct qede_tx_queue *txq;
......
txq = QEDE_NDEV_TXQ_ID_TO_TXQ(edev, txq_index);
netdev_txq = netdev_get_tx_queue(txq->fp->ndev, txq->ndev_txq_id);
.....
}

  qlogic网卡队列比较特殊,除了ethtool -l看到的FP队列之外,每个FP队列还有4个cos队列,

可以通过观察网卡队列发包统计看出。

# ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX:        64
TX:        64
Other:        0
Combined:    64
Current hardware settings:
RX:        0
TX:        0
Other:        0
Combined:    44

# ethtool -S eth0 |grep xmit_pkts  ##其中一个FP队列包含4个cos
     0_0: xmit_pkts: 29
     0_1: xmit_pkts: 20
     0_2: xmit_pkts: 26
     0_3: xmit_pkts: 4

  当前网卡队列配置为combined,没有入向队列,并且没有转发队列,所以QEDE_NDEV_TXQ_ID_TO_TXQ可以简化:

 fp_array[idx%queue_numx].txq[idx/queue_nums]

  其中queue_nums也就是基本队列数,本例中为44。

Qlogic队列选择表:

APP_bind

fp index

cos index

0-21

0-21

0

22-43

22-43

0

44-65

0-21

1

66-87

22-43

1

  由上表可以看到,发包线程绑核在cpu0-cpu21和cpu44-cpu65时,通过FP队列0-21发送数据;

发包线程绑核在cpu22-cpu43和cpu66-cpu87时,通过FP队列22-43发送数据。而网卡中断绑定在

cpu0-cpu21和cpu44-cpu65,这样通过FP队列0-21发送的数据包,在cpu0-cpu21上通过qede_tx_int

函数清除,而通过FP队列22-43发送的数据包,在cpu44-cpu65上通过qede_tx_int函数清除。

  这样就出现了跨核清除发送描述符的情况,也就会有qede_tx_int函数调用消耗差别。因此

出现各个cpu核软中断不均衡的问题。

网卡中断绑卡修正

  在测试之初,网卡中断按照网卡所在numa节点进行绑核,是为了防止napi_poll跨核访问内存

来清除TX描述符,但是实际测试数据与预期不相符,按numa绑核反而会出现跨核访问问题,导致

qede_tx_int函数在有些核上消耗比较大。

  根据qlogic选择队列方式修改网卡中断绑核,网卡中断按cpu顺序依次绑核,网卡0中断绑定

到cpu0-cpu43,网卡1中断绑定到cpu44-cpu87,以此类推。也就是每个网卡中断绑核各占两个物

理cpu的一半核。

根据Qlogic队列选择表,我们可以推出,不同cpu核上发包时,qede_tx_int函数会在对应的

cpu核上清理TX描述符,不会出现跨核清理TX descriptor的情况。

 PS:各位读者如果有什么想法或者疑问,欢迎交流!

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

【原创】qlogic网卡软中断不均衡问题分析的更多相关文章

  1. Linux 服务器下多网卡的负载均衡

    Linux 服务器下多网卡负载均衡的实现   一.引言    现今几乎各行各业内部都建立了自己的服务器,由于服务器的特殊地位,它的可靠性.可用性及其 I/O 速度就显得非常的重要, 保持服务器的高可用 ...

  2. nginx 健康检查和负载均衡机制分析

    nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖 于具体实现,各个实现定义不一样),不再往这 ...

  3. 【原创】一文掌握 Linux 性能分析之 I/O 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 一文掌握 Li ...

  4. 【驱动】DM9000A网卡驱动框架源码分析

    Linux网络设备结构 首先看一下Linux网络设备的结构,如下图: 网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发 ...

  5. 网络软中断与NAPI函数分析

    网卡只有rx硬中断,外设通过中断控制器向CPU发出有数据包来临的通知, 而没有tx硬中断,因为发送数据包是cpu向外设发出的命令. ixgbe驱动的rx软中断和tx软中断在同一个CPU上处理. htt ...

  6. netback的tasklet调度问题及网卡丢包的简单分析

    近期在万兆网卡上測试,出现了之前千兆网卡没有出现的一个现象,tasklet版本号的netback下,vm进行发包測试,发现vif的interrupt默认绑定在cpu0上,可是vm发包执行时发现host ...

  7. 二十、网卡框架分析、虚拟网卡驱动和DM9621驱动分析

    一.网络设备驱动的结构 网卡设备不同于字符设备和块设备, 网络设备并不对应于/dev目录下的文件,它存放在/sys/class/net目录下. Linux系统对网络设备驱动定义了四个层次: 1. 网络 ...

  8. [原创]ubuntu14.04部署ELK+redis日志分析系统

    ubuntu14.04部署ELK+redis日志分析系统 [环境] host1:172.17.0.4 搭建ELK+redis服务 host2:172.17.0.3 搭建logstash+nginx服务 ...

  9. [原创-性能调优]借助AWR报告分析解决oracleCPU过高的问题

    简介:在oracle数据库中,有两个非常实用的自带监控工具EM(Enterprise Manager)和AWR(Automatic Workload Repository).其中,通过AWR报告可以生 ...

随机推荐

  1. Logback动态修改日志级别

    https://blog.csdn.net/totally123/article/details/78931287

  2. 【申嵌视频】5-1 ubuntu下安装VMWare Tools工具

    [申嵌视频]5-1 ubuntu下安装VMWare Tools工具 适合搭建mini2440, Tiny6410, smart210,Tiny4412, NanoPC-T2, NanoPC-T3, N ...

  3. Delphi编译选项

    编译选项的设置,称为“开关指令”,其中大部分值为布尔类型 一.代码生成(Code generation)1.Optimization  优化代码,默认true2.Stack frames  生成过程/ ...

  4. vmware 中配置centos 7 静态IP

    虚拟机配置成静态IP可以保证每次宿主机器重启后,虚拟机的IP保持不变,这对于学习集群环境下的软件(如hadoop集群,mysql等数据库集群)很有用. vmware workstation 中装好li ...

  5. 使用uiautomator2进行webview页面的测试

    1.开发开启webview debug模式 2.使用VirtualXposed框架进行webview测试,详细见https://testerhome.com/topics/16156 下载,安装Vir ...

  6. MySQL 之 MHA + ProxySQL + keepalived 实现读写分离,高可用(三)

    设置Keepalived VIP切换邮件告警 修改keepalived.conf配置: [root@server01 keepalived]# cat keepalived.conf ! Config ...

  7. linux下怎么清理缓存

    free -m 命令可以查看内存使用情况 sysctl 命令可以临时改变某个系统参数  如:sysctl -w net.ipv4.ip_forward=1 是将forware参数临时改为1 当 ser ...

  8. ionic2 调用 cordova非本地化native 插件方法

    1,在项目中添加你的插件     cordova plugin add puginId|puginName|puginUrl|puginPath 2,查看插件clobbers标记 打开项目目录plug ...

  9. oracle查询查询出某字段为空后前台不显示的小测试1

    1.nvl(,''),后台会打印null,前台不显示 2不处理,后台显示null,前台不显示 3.nvl(,' '),后台显示" ",前台显示“ ”

  10. C语言,链表操作

    #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string ...