https://www.jianshu.com/p/78f9dcd2a4b6
软中断:为了处理中断处理程序执行过长和中断丢失的问题,linux将中断处理过程分成两个阶段,也就是上半部和下半部:
当然软中断不只包括了硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU锁等
proc文件系统是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置,其中:
/proc/softirqs 提供了软中断的运行情况
/proc/interrupts 提供了硬中断的运行情况
watch -d cat /proc/softirqs
#watch命令可以定期查看输出,-d高亮显示变化部分
查看软中断信息
$ watch -d cat /proc/softirqs
CPU0 CPU1
HI: 0 0
TIMER: 1083906 2368646
NET_TX: 53 9
NET_RX: 1550643 1916776
BLOCK: 0 0
IRQ_POLL: 0 0
TASKLET: 333637 3930
SCHED: 963675 2293171
HRTIMER: 0 0
RCU: 1542111 1590625
ps aux |grep softirq
软中断实际上是以内核线程的方式运行的,每个cpu都对应一个软中断内核线程,就叫做ksoftirqd/1,
查看其运行状况:
#注意,这些线程的名字外面都有中括号,一般来说,ps的输出中,名字括在括号里的,一般都是内核线程
[root@localhost proc]# ps aux|grep softirq
root 3 0.0 0.0 0 0 ? S Feb12 0:09 [ksoftirqd/0]
root 80681 0.0 0.0 112648 956 pts/1 R+ 00:59 0:00 grep --color=auto softirq
top
定位软中断问题,如下图:
sar
使用watch -d cat /proc/softirqs看到变化速率最快的是NET_RX(网络接收),那么我们就可以使用sar来观察网络的接收情况,不仅可以观察网络收发的吞吐量(BPS,每秒收发的字节数),还可以观察网络收发的PPS,即每秒收发的网络帧数。
[root@localhost proc]# sar -n DEV 1
Linux 3.10.0-327.el7.x86_64 (localhost.localdomain) 02/14/23 _x86_64_ (1 CPU)
01:21:59 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
01:22:00 eno16777736 1.00 1.00 0.06 0.17 0.00 0.00 0.00 0.00
01:22:00 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
tcpdump
怀疑是网络接收中断的问题,若上面sar的结果eno16777736的接收网络帧和字节数异常,我们使用tcpdump来抓包查看
#-i eno16777736只抓取该网卡,-n不解析协议名和主机名
#tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
[root@localhost ~]# tcpdump -i eno16777736 -n tcp port 80