在我的前一篇文章Linux系统下CPU性能问题分析案例(上)中介绍了CPU使用率的重要指标,包括User、System、Idle、IOwait、Irq、Softirq、Steal、Guest等CPU时间的说明,通过具体案例分析了User、Iowait等CPU使用率过高的排查思路,感兴趣的可以回去翻看,今天我们来对看下中断对CPU影响的案例和分析过程。
基本概念
我们常说的中断是什么?
硬中断:
- 概念:硬中断是由硬件设备发送给CPU的一种中断信号。这可以是来自外部设备(如磁盘、网络接口卡、键盘)的信号,需要CPU的处理。
- 工作原理:当硬件设备需要CPU的处理时,它会发送一个硬中断信号,中断控制器接收到信号后将其传递给CPU。CPU会立即中断当前执行的任务,保存当前状态,然后执行与中断相关的中断处理程序。(硬件触发,快速执行)
软中断:
- 概念:软中断是由软件生成的中断信号,通常是由内核或操作系统的组件触发的,而不是外部硬件设备。
- 工作原理:软中断是通过在内存中设置一个特殊的中断标志位来触发的。当CPU执行到一个允许软中断的位置时,它会检查这个标志位,如果被设置,CPU将跳转到相应的软中断处理程序执行。(内核触发,延迟执行)
中断处理程序:
- 概念:中断处理程序是用于响应中断事件的一段代码,它负责处理中断并执行必要的操作。
- 工作原理:当中断被触发,CPU会跳转到相应的中断处理程序。中断处理程序执行与中断相关的任务,可能包括保存当前状态、处理中断源产生的事件、执行特定的操作,最后恢复先前的执行状态。
如何查看软中断和内核线程?
- /proc/interrupts 提供了硬中断的运行情况(系统硬件触发,不需要太关注)
- /proc/softirqs 提供了软中断的运行情况(下图中第一列是中断类型,后面案例分析会说到)
软中断CPU使用率升高,我该怎么办?
案例现象
- 软中断线程(ksoftirqd/1)使用率超高,处理中断的CPU占比也很高。
分析过程
1、使用watch动态观测,确认是什么类型的软中断?
watch -d "/bin/cat /proc/softirqs"
分析结果
- TIMER(定时中断)、 NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU 锁)等这几个软中断都在不停变化。
- 而NET_RX,就是网络数据包接收软中断的变化速率最快。
- 其他几种类型的软中断,是保证 Linux 调度、时钟、临界区保护这些正常工作所必需的,所以有变化时正常的。
2、使用sar查询网络收发情况
# 使用sar是因为不仅可以观察网络收发的吞吐量(BPS),还可以观察网络收发的网络帧数( PPS)
sar -n DEV 1
分析结果
- 网卡ens33:每秒接收的网络帧数比较大,几乎达到8w,而发送的网络帧数较小,只有接近4w;每秒接收的千字节数只有 4611 KB,发送的千字节数更小,只有2314 KB(接收的PPS达到8w,但接收的BPS只有5k不到,网络帧看起来是比较小的)。
- docker0和veth04076e3:数据跟 ens33 基本一致只是发送和接收相反,发送的数据较大而接收的数据较小,这是Linux 内部网桥转发导致的,属于正常情况。
3、使用tcpdump抓包一探究竟
tcpdump -i ens33 -n tcp port 80
分析结果
- Flags [S]:表示这是一个SYN包。而且是大量的SYN在发过来,很明显这就是SYN FLOOD攻击。
- SYN FLOOD解决方法。
- 如果有防护设备(F5等),通过硬件来防护。
- 利用iptables临时封掉攻击的IP或IP号段,也可以根据访问频次来限制。
- 优化系统内核相关参数,增加抵御能力。这个后期会在后期单独详细解决。