网卡软中断过高问题优化总结

原文连接:http://www.simlinux.com/archives/1798.html

问题背景

Contents [show]
游戏网关高峰期时出网络丢包,CPU0软中断%sys高达90%

预备知识

什么是中断?

由于接收来自外围硬件(相对于CPU和内存)的异步信号或者来自软件的同步信号,而进行相应的硬件、软件处理;发出这样的信号称为进行中断请求(interrupt request, IRQ)

硬中断与软中断?

硬中断:

外围硬件发给CPU或者内存的异步信号就称之为硬中断

软中断:

由软件系统本身发给操作系统内核的中断信号,称之为软中断。通常是由硬中断处理程序或进程调度程序对操作系统内核的中断,也就是我们常说的系统调用(System Call)

硬中断与软中断之区别与联系?

1、硬中断是有外设硬件发出的,需要有中断控制器之参与。其过程是外设侦测到变化,告知中断控制器,中断控制器通过CPU或内存的中断脚通知CPU,然后硬件进行程序计数器及堆栈寄存器之现场保存工作(引发上下文切换),并根据中断向量调用硬中断处理程序进行中断处理
2、软中断则通常是由硬中断处理程序或者进程调度程序等软件程序发出的中断信号,无需中断控制器之参与,直接以一个CPU指令之形式指示CPU进行程序计数器及堆栈寄存器之现场保存工作(亦会引发上下文切换),并调用相应的软中断处理程序进行中断处理(即我们通常所言之系统调用)
3、硬中断直接以硬件的方式引发,处理速度快。软中断以软件指令之方式适合于对响应速度要求不是特别严格的场景
4、硬中断通过设置CPU的屏蔽位可进行屏蔽,软中断则由于是指令之方式给出,不能屏蔽
5、硬中断发生后,通常会在硬中断处理程序中调用一个软中断来进行后续工作的处理
6、硬中断和软中断均会引起上下文切换(进程/线程之切换),进程切换的过程是差不多的

查看中断情况

查看中断分布情况即CPU都在哪些设备上干活,干了多少(也可以使用itop工具实时查看)?

root@geekwolf:~# cat /proc/interrupts

           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      
  0:        620          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  IR-IO-APIC-edge      timer
  8:          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  IR-IO-APIC-edge      rtc0
  9:      20774          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  IR-IO-APIC-fasteoi   acpi
 16:         28          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  IR-IO-APIC-fasteoi   ehci_hcd:usb1
 23:        243          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  IR-IO-APIC-fasteoi   ehci_hcd:usb2
 88:          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  DMAR_MSI-edge      dmar0
 89:          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  DMAR_MSI-edge      dmar1
 90:          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  IR-PCI-MSI-edge      PCIe PME
 91:          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  IR-PCI-MSI-edge      PCIe PME
 92:          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  IR-PCI-MSI-edge      PCIe PME
 93:          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  IR-PCI-MSI-edge      PCIe PME
 94:          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  IR-PCI-MSI-edge      PCIe PME
 95:          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  IR-PCI-MSI-edge      PCIe PME
 96:          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  IR-PCI-MSI-edge      PCIe PME
 97:          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  IR-PCI-MSI-edge      PCIe PME
 98:          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  IR-PCI-MSI-edge      PCIe PME
 99:          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  IR-PCI-MSI-edge      PCIe PME
100:          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  IR-PCI-MSI-edge      PCIe PME
101:     169988          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  IR-PCI-MSI-edge      mpt2sas0-msix0
134:    1900138          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  IR-PCI-MSI-edge      eth2-q0
150:    4262209          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  IR-PCI-MSI-edge      eth3-q0
166:          4          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  IR-PCI-MSI-edge      ioat-msix
167:          4          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  IR-PCI-MSI-edge      ioat-msix
168:          2          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  IR-PCI-MSI-edge      ioat-msix
169:          2          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  IR-PCI-MSI-edge      ioat-msix
170:          2          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  IR-PCI-MSI-edge      ioat-msix
171:          2          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  IR-PCI-MSI-edge      ioat-msix
172:          2          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  IR-PCI-MSI-edge      ioat-msix
173:          2          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  IR-PCI-MSI-edge      ioat-msix
174:          4          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  IR-PCI-MSI-edge      ioat-msix
175:          4          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  IR-PCI-MSI-edge      ioat-msix
176:          2          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  IR-PCI-MSI-edge      ioat-msix
177:          2          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  IR-PCI-MSI-edge      ioat-msix
178:          2          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  IR-PCI-MSI-edge      ioat-msix
179:          2          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  IR-PCI-MSI-edge      ioat-msix
180:          2          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  IR-PCI-MSI-edge      ioat-msix
181:          2          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  IR-PCI-MSI-edge      ioat-msix
NMI:        710        280        658        235        114         91         76         74        208        123        176        128        106         93        102         95         30        360        790         46         28         17         10          8         10        129       1166         22         18         16         11          7   Non-maskable interrupts
LOC:    4230314    2640664    2427443    1337890    1091372     892129     819153     816781    2695809    1563153    1368637    1608410    1241692    1166692    1205270    1124865     120831    1966946     328048     816162     163492     222276     129805     121126     111906     599782    1247371     194215     162828     145678     118762     114295   Local timer interrupts
SPU:          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   Spurious interrupts
PMI:        710        280        658        235        114         91         76         74        208        123        176        128        106         93        102         95         30        360        790         46         28         17         10          8         10        129       1166         22         18         16         11          7   Performance monitoring interrupts
IWI:          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   IRQ work interrupts
RES:     679921    1369165    1013002     573776     543083     540027     593345     588120     842115     846190     874862     890102     873810     860080     867322     848916       3879      63916      10863      12850       7463       6350      10889      16041       2065      13207       6870       6817       4030       4700       5190       7430   Rescheduling interrupts
CAL:      46507      67439      67569      67567      67565      67566      67566      67568     154689      67553      67511      67538      67568      67557      67534      67519      67520      26471      67470      67470      67476      67525      67518      67525      67545      64065      67210      67506      67485      67492      67526      67521   Function call interrupts
TLB:       6547       3416       1798       1015        361        637        271        447        822        113       1079        222        259        198        265        844        157       1470       3468        767        499        262        338        230         41       1457       4023        290        105         93         46        177   TLB shootdowns
TRM:          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   Thermal event interrupts
THR:          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   Threshold APIC interrupts
MCE:          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   Machine check exceptions
MCP:        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569        569   Machine check polls
ERR:          0
MIS:          0

从上面的数据可以看出网卡eth2、eth3软中断都落在CPU0可以通过cat /proc/softirqs查看具体的软中断情况,总的中断次数可以通过vmstat或者dstat查看,其中vmstat中的in表示每秒的中断次数;
通过mpstat -P ALL 2,每隔两秒查看下所有核状态信息,其中%irq为硬中断,%soft为软中断

root@geekwolf:~# mpstat -P ALL 2
08:42:04 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
08:42:05 AM  all    4.31    0.00    0.70    0.00    0.00    0.06    0.00    0.00   94.93
08:42:05 AM    0    5.26    0.00    1.05    0.00    0.00    60.05    0.00    0.00   92.63
08:42:05 AM    1    7.07    0.00    1.01    0.00    0.00    0.00    0.00    0.00   91.92
08:42:05 AM    2    8.91    0.00    0.99    0.00    0.00    0.00    0.00    0.00   90.10
08:42:05 AM    3    8.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   91.00
08:42:05 AM    4    8.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   91.00
08:42:05 AM    5    7.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   91.00
08:42:05 AM    6    7.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   92.00
08:42:05 AM    7    4.12    0.00    1.03    0.00    0.00    0.00    0.00    0.00   94.85
08:42:05 AM    8    4.17    0.00    1.04    0.00    0.00    0.00    0.00    0.00   94.79
08:42:05 AM    9    8.91    0.00    0.99    0.00    0.00    0.00    0.00    0.00   90.10
08:42:05 AM   10    4.17    0.00    2.08    0.00    0.00    0.00    0.00    0.00   93.75
08:42:05 AM   11    6.12    0.00    1.02    0.00    0.00    0.00    0.00    0.00   92.86
08:42:05 AM   12    6.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   92.00
08:42:05 AM   13    3.16    0.00    1.05    0.00    0.00    0.00    0.00    0.00   95.79
08:42:05 AM   14    8.16    0.00    1.02    0.00    0.00    0.00    0.00    0.00   90.82
08:42:05 AM   15    6.06    0.00    1.01    0.00    0.00    1.01    0.00    0.00   91.92
08:42:05 AM   16    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
08:42:05 AM   17    2.02    0.00    1.01    0.00    0.00    0.00    0.00    0.00   96.97
08:42:05 AM   18    2.04    0.00    1.02    0.00    0.00    0.00    0.00    0.00   96.94
08:42:05 AM   19    2.97    0.00    0.99    0.00    0.00    0.00    0.00    0.00   96.04
08:42:05 AM   20    2.04    0.00    0.00    0.00    0.00    0.00    0.00    0.00   97.96
08:42:05 AM   21    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
08:42:05 AM   22    3.03    0.00    0.00    0.00    0.00    0.00    0.00    0.00   96.97
08:42:05 AM   23    2.04    0.00    0.00    0.00    0.00    0.00    0.00    0.00   97.96
08:42:05 AM   24    4.95    0.00    0.00    0.00    0.00    0.00    0.00    0.00   95.05
08:42:05 AM   25    2.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00   97.98
08:42:05 AM   26    3.03    0.00    0.00    0.00    0.00    0.00    0.00    0.00   96.97
08:42:05 AM   27    2.04    0.00    0.00    0.00    0.00    0.00    0.00    0.00   97.96
08:42:05 AM   28    1.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00   97.98
08:42:05 AM   29    1.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.98
08:42:05 AM   30    1.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.99
08:42:05 AM   31    1.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.98

如何优化软中断CPU0过高问题

RSS(Receive Side Scaling,需网卡支持多队列)

查看网卡是否支持队列

root@geekwolf:~# lscpi -vvv
06:00.0 Ethernet controller: Broadcom Corporation BCM57840 NetXtreme II 10/20-Gigabit Ethernet (rev 11)
 Subsystem: Hewlett-Packard Company Device 22fa
 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx+
 Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <tabort - <MAbort- >SERR- <perr - INTx-
 Latency: 0, Cache Line Size: 64 bytes
 Interrupt: pin A routed to IRQ 32
 Region 0: Memory at 93800000 (64-bit, prefetchable) [size=8M]
 Region 2: Memory at 93000000 (64-bit, prefetchable) [size=8M]
 Region 4: Memory at 95000000 (64-bit, prefetchable) [size=64K]
 [virtual] Expansion ROM at 95080000 [disabled] [size=512K]
 Capabilities: [48] Power Management version 3
   Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
   Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=1 PME-
 Capabilities: [50] Vital Product Data
   Product Name: HP FlexFabric 10Gb 2-port 536FLB Adapter
   Read-only fields:
     [PN] Part number: 766488-001
     [EC] Engineering changes: A-5444
     [MN] Manufacture ID: 31 30 33 43
     [V0] Vendor specific: 12W PCIeGen3
     [V1] Vendor specific: 7.10.55
     [V3] Vendor specific: 7.10.72
     [V5] Vendor specific: 0A
     [V6] Vendor specific: 7.10.72
     [V7] Vendor specific: 536FLB
     [SN] Serial number: 7C444703LG
     [V2] Vendor specific: 5447
     [V4] Vendor specific: 8CDCD419D870
     [RV] Reserved: checksum good, 186 byte(s) reserved
   End
 Capabilities: [a0] MSI-X: Enable+ Count=32 Masked-

找到Ethernet controller项,如果有MSI-X,Enable+ 并且Count>1,表示该网卡支持多队列

查看网卡支持多少个队列

root@geekwolf:~# grep eth0 /proc/interrupts |awk '{print $NF}'
eth0
eth0-fp-0
eth0-fp-1
eth0-fp-2
eth0-fp-3
eth0-fp-4
eth0-fp-5
eth0-fp-6
eth0-fp-7

配置SMP IRQ affinity

(即绑定队列到不同CPU,Kernel>2.4)

方法1:开启系统irqbalance服务

apt-get -y install irqbalance
service irqbalance start

方法2: 手动绑定

/proc/irq/:该目录下存放的是以IRQ号命名的目录,如/proc/irq/40/,表示中断号为40的相关信息
/proc/irq/[irq_num]/smp_affinity:该文件存放的是CPU位掩码(十六进制)。修改该文件中的值可以改变CPU和某中断的亲和性
/proc/irq/[irq_num]/smp_affinity_list:该文件存放的是CPU列表(十进制)。注意,CPU核心个数用表示编号从0开始,如cpu0,cpu1等,

smp_affinity和smp_affinity_list修改其一即可,下面修改smp_affinity:

echo $bitmask > /proc/irq/IRQ#/smp_affinity
示例(把140号中断绑定到前4个CPU[cpu0-3]上面):
echo  f >/proc/irq/140/smp_affinity

CPU位掩码计算

一个十六进制f转换成二进制为1111,每一位表示一个CPU核,最靠右值是最低位即CPU0


           Binary       Hex
   CPU 0    0001         1
   CPU 1    0010         2
   CPU 2    0100         4
   CPU 3    1000         8
   其中十六进制2就表示CPU1,十六进制8就表示CPU3


           Binary       Hex
   CPU 0    0001         1
 + CPU 2    0100         4
   -----------------------
   both     0101         5
   其中得出的十六进制和5表示CPU0 和CPU2


           Binary       Hex
   CPU 0    0001         1
   CPU 1    0010         2
   CPU 2    0100         4
 + CPU 3    1000         8
   -----------------------
   both     1111         f
   4个CPU参与中断,即可设置为f,8个CPU参与中断可设置为ff,以此类推

配置RSS

过滤eth0中断号,绑定到0-7号CPU核上(eth0-fp命名可能有所不同):

root@geekwolf:~# grep eth0-fp /proc/interrupts |awk '{print $1, $NF}'
147: eth0-fp-0
148: eth0-fp-1
149: eth0-fp-2
150: eth0-fp-3
151: eth0-fp-4
152: eth0-fp-5
153: eth0-fp-6
154: eth0-fp-7

echo 1  >/proc/irq/147/smp_affinity
echo 2  >/proc/irq/148/smp_affinity
echo 4  >/proc/irq/149/smp_affinity
echo 8  >/proc/irq/150/smp_affinity
echo 10 >/proc/irq/151/smp_affinity
echo 20 >/proc/irq/152/smp_affinity
echo 40 >/proc/irq/153/smp_affinity
echo 80 >/proc/irq/154/smp_affinity

可以通过top命令查看%si是否均衡分摊到0-7核CPU

注意事项

1、启动irqbalance后,手动绑定将失效
2、当CPU工作在最高性能模式时,irqbalance会均匀分配中断到其他CPU,节能模式时中断会集中分配到CPU0
3、以上设置均以网卡支持多队列为前提,建议手动绑定SMP IRQ affinity
网卡多队列需tg3,bnx2,bnx2x,b44等驱动的支持,Broadcom的网卡驱动已经内置在内核中向后兼容大部分的2.6内核及大于2.4.24的2.4内核
4、笔者实际测试过程中遇到BladeCenter HS23刀片服务器Emulex Corporation OneConnect 10Gb NIC (be3)本身支持多队列,在连接到千兆网5、环境下无法使用多队列问题,万兆网络下可以使用,只好通过下面RPS/RFS方式实现

RPS/RFS

Receive Packet Steering/Receive Flow Streering,软件方式实现CPU均衡,接收包中断的优化
RPS: 网卡驱动对每一个数据库包根据四元组(SIP,SPORT,DIP,DPORT)生成HASH值,通过HASH值将每个连接和CPU 绑定
RFS: 由于RPS只是单纯的把数据包均衡到不同的CPU上,此时如果应用程序所在CPU和中断处理的CPU不在同一个核,将会对CPU Cache影响很大,RFS的作用就是将应用程序和软中断处理分配到同一个CPU
配置步骤:

根据上述说明一个十六进制f表示四个CPU核,那么均衡到32核即ffffffff

配置RPS

rps_cpus='ffffffffff'
for rxdir in /sys/class/net/eth0/queues/rx-*
do
    echo $rps_cpus >$rxdir/rps_cpus
done

配置RFS

RFS扩展了RPS的性能以增加CPU缓存命中率,减少网络延迟,默认是禁用的

/proc/sys/net/core/rps_sock_flow_entries
设置此文件至同时活跃连接数的最大预期值。对于中等服务器负载,推荐值为 32768 。所有输入的值四舍五入至最接近的2的幂
/sys/class/net/device/queues/rx-queue/rps_flow_cnt
将 device 改为想要配置的网络设备名称(例如,eth0),将 rx-queue 改为想要配置的接收队列名称(例如,rx-0)。
将此文件的值设为 rps_sock_flow_entries 除以 N,其中 N 是设备中接收队列的数量。例如,如果 rps_flow_entries 设为 32768,并且有 16 个配置接收队列,那么 rps_flow_cnt 就应设为 2048。对于单一队列的设备,rps_flow_cnt 的值和 rps_sock_flow_entries 的值是一样的

ls /sys/class/net/eth0/queues/rx-*|grep queues|wc -l
8

rps_flow_cnt=32768/8=4096
echo 32768 >/proc/sys/net/core/rps_sock_flow_entries
for rxdir in /sys/class/net/eth0/queues/rx-*
do
    echo $rps_cpus >$rxdir/rps_cpus
    echo $rps_flow_cnt >$rxdir/rps_flow_cnt
done

echo 32768 >/proc/sys/net/core/rps_sock_flow_entries

优化脚本可参考: https://github.com/geekwolf/sa-scripts/blob/master/ops-scripts/performance_tuning/set_rps.sh

网卡常规优化方案
常规网卡优化方案
关于发包的优化XPS 还未做测试,有时间在做补充!

参考

原文连接:http://www.simlinux.com/archives/1798.html

<think>好的,用户现在问的是“软中断怎么分析”,我需要详细回答这个问题。首先,回忆一下之前用户问的是关于内核日志中的中断线程和看门狗任务的信息,现在用户可能是在进一步深入中断处理的问题,特别是软中断部分。 软中断(SoftIRQ)是Linux内核中处理延迟敏感任务的一种机制,通常在硬中断处理之后执行。分析软中断通常涉及性能问题和系统延迟的排查。用户可能是遇到了系统延迟、网络性能不佳或者某些内核任务占用过问题,想要了解如何分析软中断的情况。 首先,我需要解释软中断的基本概念,包括它与硬中断的区别,以及常见的软中断类型,比如网络接收(NET_RX)、定时器(TIMER)、块设备(BLOCK)等。然后,介绍分析工具,比如/proc/softirqs、top命令、perf、ftrace等。接着,需要分步骤说明如何查看软中断的统计信息,如何监控软中断的频率和时间,以及如何诊断负载的软中断。 用户可能想知道具体怎么操作,所以需要给出具体的命令示例,比如使用watch命令监控/proc/softirqs的变化,使用perf记录软中断的处理函数,或者使用ftrace跟踪软中断的执行情况。同时,还需要解释这些命令输出的含义,帮助用户理解数据。 另外,用户可能遇到性能瓶颈,比如网络软中断处理导致CPU使用率过,这时候需要指导如何定位问题,比如检查网络驱动、调整中断亲和性(IRQ affinity)或者进行内核参数优化。这部分需要给出实际的排查步骤和优化建议。 还要注意用户的技术水平,可能不是内核开发者,但有一定的系统管理经验。因此,解释需要清晰,避免过于深入的代码细节,而是侧重于工具使用和实际案例分析。同时,提醒用户在负载情况下如何正确诊断,避免误解数据。 最后,总结软中断分析的步骤,强调系统性排查,从监控到深入分析,再到优化调整。可能还需要提到常见问题及解决方法,比如软中断不平衡、单个CPU核心过载等,并给出相应的解决策略。</think>### **软中断(SoftIRQ)分析指南** 软中断(SoftIRQ)是 Linux 内核中处理 **延迟敏感任务** 的核心机制,常用于网络数据包处理(如 TCP/IP 协议栈)、块设备 I/O 完成、定时器等场景。其设计目标是在 **硬中断(HardIRQ)** 处理程序之外,以更灵活的调度方式完成耗时操作。以下是软中断的 **分析方法和工具**: --- #### **一、软中断基础概念** 1. **与硬中断的区别** - **硬中断**:由硬件触发(如网卡收到数据包),需要立即响应,执行时间极短(微秒级),且运行在 **中断上下文**(不可休眠)。 - **软中断**:由内核触发(如 `NET_RX` 网络接收),允许稍后处理,运行在 **内核线程上下文**(可休眠),通常由 `ksoftirqd/<CPU>` 线程执行。 2. **常见软中断类型** | 软中断名称 | 用途 | |----------------------|--------------------------------------| | `NET_RX` | 网络数据包接收处理(如 TCP/IP 协议栈)| | `NET_TX` | 网络数据包发送完成 | | `TIMER` | 定时器回调(如 `jiffies` 更新) | | `BLOCK` | 块设备 I/O 完成(如磁盘读写) | | `TASKLET` | 小任务调度(如 USB 驱动) | | `SCHED` | 进程调度相关(如负载均衡) | --- #### **二、软中断分析工具** ##### **1. 查看软中断统计** - **实时统计**: ```bash watch -n1 "cat /proc/softirqs" # 每秒刷新各 CPU 软中断计数 ``` **输出示例**: ``` CPU0 CPU1 CPU2 HI: 0 0 0 TIMER: 12345678 9876543 10456789 NET_TX: 5678 4321 6789 NET_RX: 98765432 87654321 76543210 BLOCK: 0 0 0 IRQ_POLL: 0 0 0 TASKLET: 123 456 789 SCHED: 456789 345678 234567 ``` - **关键字段**:`NET_RX`/`NET_TX` 数值可能指示网络负载过大。 - **历史统计**: ```bash sar -w -I SUM 1 # 使用 sysstat 监控软中断频率(需安装) ``` ##### **2. 定位软中断 CPU 开销** - **按 CPU 核心排序**: ```bash mpstat -P ALL 1 # 查看各 CPU 使用率,结合软中断分布 ``` - 若某个 CPU 核心的 `%soft`(软中断占比)过(如 >30%),需进一步分析。 - **跟踪软中断处理函数**: ```bash perf top -e irq:softirq_entry # 动态显示软中断热点函数 perf record -e irq:softirq_entry -ag -- sleep 5 # 记录 5 秒软中断调用栈 ``` ##### **3. 深入分析软中断延迟** - **使用 `trace-cmd` 或 `ftrace`**: ```bash echo 'softirq:*' > /sys/kernel/debug/tracing/set_event echo 1 > /sys/kernel/debug/tracing/tracing_on cat /sys/kernel/debug/tracing/trace_pipe # 实时跟踪软中断事件 ``` **输出关键字段**: - `softirq_raise`:软中断被触发的时间点。 - `softirq_entry`/`softirq_exit`:软中断处理的开始和结束时间。 - **计算延迟**:`exit_time - entry_time` 即为处理耗时。 --- #### **三、典型问题与排查方法** ##### **场景 1:网络性能瓶颈( `NET_RX` 计数)** - **现象**: - 网卡吞吐量下降,CPU `%soft` 占比,`/proc/softirqs` 中 `NET_RX` 计数飙升。 - **排查步骤**: 1. **确认网卡中断亲和性**: ```bash cat /proc/interrupts | grep eth0 # 查看网卡中断绑定的 CPU ``` - 若多队列网卡的中断集中到少数 CPU,会导致软中断负载不均。 - **优化方法**:调整中断亲和性(IRQ Affinity): ```bash echo 0-3 > /proc/irq/<IRQ_NUM>/smp_affinity_list # 将中断分散到 CPU0~3 ``` 2. **检查网络协议栈处理**: - **跟踪 `NET_RX` 处理函数**: ```bash perf record -e irq:softirq_entry -C <CPU> -g -- sleep 10 # 指定 CPU 抓取调用栈 perf report # 分析热点函数(如 `napi_gro_receive`、`__netif_receive_skb`) ``` - **优化建议**: - 启用 RSS(Receive Side Scaling)分散数据包到多队列。 - 调整内核参数(如 `net.core.netdev_budget` 增加单次软中断处理的数据包数)。 ##### **场景 2:软中断处理延迟过** - **现象**: - 系统响应延迟增加,`ftrace` 显示软中断处理时间过长(如 >1ms)。 - **排查步骤**: 1. **确认软中断类型**: - 若 `TIMER` 软中断延迟,检查定时器回调函数是否阻塞。 - 若 `TASKLET` 延迟,检查任务是否因锁竞争或 I/O 阻塞。 2. **分析内核锁竞争**: ```bash echo 1 > /proc/sys/kernel/lock_stat # 开启锁统计 cat /proc/lock_stat | grep spin_lock # 查看自旋锁争用情况 ``` 3. **优化方向**: - 减少软中断触发频率(如合并网络数据包)。 - 将任务迁移到线程化中断(Threaded IRQ)或工作队列(Workqueue)。 --- #### **四、级工具与内核调试** 1. **动态追踪(BPF/BCC)**: - **统计软中断耗时分布**: ```bash sudo trace -K 'r::softirq_entry(unsigned int vec) { @[vec] = nsecs; } r::softirq_exit(unsigned int vec) { @[vec] = hist(nsecs - @[vec]); delete(@[vec]); }' ``` - **输出示例**: ``` @[NET_RX]: [0, 1) 12 |@@@@@ [1, 2) 145 |@@@@@@@@@@@@@@@@@@ [2, 4) 89 |@@@@@@@@@@@@ ``` 显示 `NET_RX` 软中断的处理时间分布。 2. **内核源码调试**: - **关键代码路径**: - 软中断触发:`raise_softirq()` → `__raise_softirq_irqoff()` - 软中断处理:`do_softirq()` → `__do_softirq()` - **调试方法**: ```bash echo 'p:softirq_raise __raise_softirq_irqoff vec=%di' > /sys/kernel/debug/tracing/kprobe_events echo 1 > /sys/kernel/debug/tracing/events/kprobes/softirq_raise/enable ``` --- ### **总结与建议** 1. **分析流程总结**: - **Step 1**:通过 `/proc/softirqs` 和 `mpstat` 定位负载软中断类型和 CPU。 - **Step 2**:使用 `perf` 或 `ftrace` 追踪热点函数和延迟。 - **Step 3**:结合硬件中断分布(`/proc/interrupts`)优化负载均衡。 2. **常见优化手段**: - 调整中断亲和性(IRQ Affinity)。 - 启用多队列网卡(RSS/RPS)。 - 优化内核参数(如 `net.core.netdev_budget`)。 - 避免在软中断上下文中执行耗时操作(改用工作队列)。 如需深入分析特定场景,请提供 `/proc/softirqs` 输出和 `perf` 热点函数列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值