目录
5.4 软中断 案例分析 —— sar/hping3/tcpdump
五、软中断
5.1 中断
中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。
5.1.1 中断的特性
linux的I/O模型介绍以及同步异步阻塞非阻塞的区别
同步:在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值了。
异步:在调用发出之后,这个调用就直接返回了,所以没有返回结果。当一个异步调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态,通知来通知调用者,或通过回调函数处理这个调用。
程序在等待调用结果(消息,返回值)时的状态
阻塞:在调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才能返回。
非阻塞:在不能立刻得到结果之前,该调用不会阻塞当前线程。
- 中断是一种异步的事件处理机制,可以提高系统的并发处理能力。
- 由于中断程序会打断其他进程的运行,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快的运行。
- 中断处理程序在响应中断时,会临时关闭中断。因而会导致上一次中断处理完成之前,其他中断都不能响应,即中断有可能会消失。【上一次中断没有完成,下一次中断已经开始,重试多次后,就会出现中断消失】
5.2 软中断
为了解决中断处理程序执行过长和中断丢失的问题,linux将中断处理过程分成了两个阶段:上半部和下半部:
- 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。
- 下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。
以常见网卡接收数据包为例:
- 上半部直接处理硬件要求,即硬中断,特点是快速执行;
- 下半部由内核触发,即软中断,特点是延迟执行。
5.3 查看软中断和内核线程 —— proc文件系统
proc文件系统:一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置。
- /proc/softirqs 提供了软中断的运行情况
- 要注意软中断的类型,也就是这个界面中第一列的内容。从第一列你可以看到,软中断包括了 10 个类别,分别对应不同的工作类型。比如 NET_RX 表示网络接收中断,而 NET_TX 表示网络发送中断。
- 要注意同一种软中断在不同 CPU 上的分布情况,也就是同一行的内容。正常情况下,同一种中断在不同 CPU 上的累积次数应该差不多。比如这个界面中,NET_RX 在 CPU0 和 CPU1 上的中断次数基本是同一个数量级,相差不大。
- /proc/interrupts 提供了硬中断的运行情况
- 软中断内核线程就叫做 ksoftirqd/CPU
- 一般来说,ps 的输出中,名字括在中括号里的,一般都是内核线程
5.4 软中断 案例分析 —— sar/hping3/tcpdump
- sar 是一个系统活动报告工具,既可以实时查看系统的当前活动,又可以配置保存和报告历史统计数据
- hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试等
- tcpdump 是一个常用的网络抓包工具,常用来分析各种网络问题
5.4.1 案例操作
一台Nginx的机器,一台运行 hping3 命令,来模拟 Nginx 的客户端请求,主要是模拟小包问题。
# -S参数表示设置TCP协议的SYN(同步序列号),-p表示目的端口为80
# -i u100表示每隔100微秒发送一个网络帧
# 注:如果你在实践过程中现象不明显,可以尝试把100调小,比如调成10甚至1
$ hping3 -S -p 80 -i u100 192.168.0.30
观察命令输出的变化情况 —— watch
$ 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
5.4.2 软中断类别说明
- TIMER(定时中断)
- NET_RX(网络接收):网络数据包接收软中断的变化速率最快
- SCHED(内核调度)
- RCU(RCU 锁)
5.4.3 观察系统网络接收情况 —— sar
sar 可以用来查看系统的网络收发情况,还有一个好处是,不仅可以观察网络收发的吞吐量(BPS,每秒收发的字节数),还可以观察网络收发的 PPS,即每秒收发的网络帧数。
# -n DEV 表示显示网络收发的报告,间隔1秒输出一组数据
$ sar -n DEV 1
15:03:46 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
15:03:47 eth0 12607.00 6304.00 664.86 358.11 0.00 0.00 0.00 0.01
15:03:47 docker0 6302.00 12604.00 270.79 664.66 0.00 0.00 0.00 0.00
15:03:47 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
15:03:47 veth9f6bbcd 6302.00 12604.00 356.95 664.66 0.00 0.00 0.00 0.05
- 第一列:表示报告的时间。
- 第二列:IFACE 表示网卡。
- 第三、四列:rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是 PPS。
- 第五、六列:rxkB/s 和 txkB/s 分别表示每秒接收、发送的千字节数,也就是 BPS。
- 后面的其他参数基本接近 0,显然跟今天的问题没有直接关系,你可以先忽略掉。
从第三列和第五列可以看出,每个包都是很小的网络帧,也就是说,是小包问题导致的软中断传输。
5.4.4 抓包 —— tcpdump
工作中常用抓包命令:
// -i 指定网卡
// host 指定主机
// -w 指定输出到某个文件
tcpdump -i bond1 host 192.168.41.110 -w /data/port2.cap
# -i eth0 只抓取eth0网卡,-n不解析协议名和主机名
# tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
$ tcpdump -i eth0 -n tcp port 80
15:11:32.678966 IP 192.168.0.2.18238 > 192.168.0.30.80: Flags [S], seq 458303614, win 512, length 0
...
5.5 软中断对系统的影响排查思路
- 当发现服务器或业务卡顿的时候,首先通过top命令来查看服务器负载,cpu使用率和各个cpu参数,然后排查cpu占用较高的进程;
- 如果发现cpu使用率并不高,但是si很高,而且ksoftirqd进程cpu占用率高,则说明服务器一直在发生软中断;
- 通过cat /proc/softirqs来分析是哪方面的软中断次数最多,可以通过watch 命令来查看变化最快的值;
- 一般情况下网络发生中断的情况会比较多,如果发现是网络收发包导致的软中断,则通过sar命令来查看此时的收发包速率和收发包数据量来验证是否真的是网络收发包过多导致,也可以计算每个包的大小,以此来计算服务器是否收到了flood攻击;
- 通过tcpdump来抓包分析数据包来源ip和数据包类型,通过抓包数据中的Flags来分析数据包类型;
- 通过防火墙封堵异常ip;
5.5.1 找网络相关的错误的有几种方式
- 找系统类的错误: dmesg | tail
- 直接的网络错误: sar -n ETCP 1 或者 sar -n EDEV 1
- 查看网络状态: netstat -s 或者 watch -d netstat -s
- 网络状态的统计: ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}'
5.6 总结
- 中断是一种异步的事件处理机制,用来提高系统的并发处理能力。中断事件发生,会触发执行中断处理程序。
- Linux 中的中断处理程序分为上半部与下半部:
- 上半部对应的硬件中断,用来快速处理中断
- 下半部对应软件中断,用来异步处理上半部未完成的工作
- Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。
- 在 Linux 中,每个 CPU 都对应一个软中断内核线程,名字是 ksoftirqd/CPU 编号。当软中断事件的频率过高时,内核线程也会因为 CPU 使用率过高而导致软中断处理不及时,进而引发网络收发延迟、调度缓慢等性能问题。
- 软中断 CPU 使用率(softirq)升高是一种很常见的性能问题。虽然软中断的类型很多,但实际生产中,我们遇到的性能瓶颈大多是网络收发类型的软中断,特别是网络接收的软中断。