引子

  使用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. ThinkPad T460进不去系统的解决方法

    系统卡在系统lenovo界面的尝试解决方案:开机点击F1进入到bios界面进入Security-Secure Boot选Disabled进入Startup-UEFI选BOTH 然后点击F10 选yes ...

  2. PCIE读书笔记

    PCIE读书笔记 什么是TLP:

  3. JetBrains GoLand 注册码

    选择license server 输入 http://idea.youbbs.org 完成 要求联网

  4. php验证地图坐标在某片坐标区域内

    mysql空间查询并不太适合地图坐标,如果使用:http://www.cnblogs.com/tyjsjl/p/8760002.html的方式进行地图点坐标的查询就不好用了,于是直接使用php来进行地 ...

  5. .NET版本与CLR版本及兼容性

    WIN7原生的.net是2.0和3.5,打开和关闭windows功能里面可以看到.另外C:\Windows\Microsoft.NET\Framework下面也能看到..net framework1. ...

  6. Python 之 __new__() 方法与实例化

    原文链接:https://www.cnblogs.com/ifantastic/p/3175735.html __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解, ...

  7. 给Linux系统新增加一块硬盘

    今天公司测试Linux服务器硬盘不够用了,主要是mysql数据文件太大了,买了个500G的硬盘回来,这里记录下新加硬盘的方法PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来, ...

  8. How to compile tensorflow on CentOS

    Tensorflow is a very effective machine learning library implemented by C++, we can use tensorflow wi ...

  9. C#中替换特殊字符串

    private string change字符(string str) { if (!string.IsNullOrEmpty(str)) { //将特殊字符全部替换为下划线 string patte ...

  10. java程序中的乱码方案

    1. 万能方式,既能够解决POST请求乱码,又能够解决GET请求乱码 操作方法:先将服务器中接收到的数据采用ISO-8859-1的方式解码,回归原始状态, 再给定一种支持简体中文的编码方式重新编码组装 ...