中断基础
- 中断的定义:中断是系统用来响应硬件设备请求的一种机制,他会打断进程的正常调度和执行,然后调用内核中的终端处理程序来响应设备的请求
- 中断生活示例: 就像你定外卖,如果一直在楼下等外卖小哥,那你就其他啥事做不了。但是如果你和小哥说好了,等他到了你打电话给你。那在他来之前你就可以做其他时间了
- 中断特性:
- 中断时间要短,避免影响正常进程运行调度的影响
- 外卖为例:如果点了两个外卖,第一个外卖打电话给你打了十分钟,那第二个外卖就只能在那一直等了
软中断
- linux将中断分为上半部分和下半部分
- 上半部分用来快速处理中断
- 下半部分用来延迟处理上半部分未完成的工作,通常以内核线程的方式运行
- 外卖为例:你和外卖小哥打电话是上半部分,你下去取外卖是下半部分
- 网卡举例:
- 上半部分:将网卡来的数据读到内存
- 下半部分:软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析,直到送给应用程序
- 简单理解:
- 上半部分:上半部分直接处理硬件请求,硬中断,特点是立即执行
- 下半部分:由内核触发,软中断,特点是延迟执行
- linux软中断举例
软中断案例分析
- 1, 首先用top看看cup使用率都在哪里,假设使用率很多在si(软中断)上
- 2, 运行 watch -d cat /proc/softirqs 查看文件内容的定时变化
- net_rx 变化大,可能是网络收发引起过多软中断
$ 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
- 3,sar 查看网络运行状态
- 第一列:表示报告的时间。
- 第二列:IFACE 表示网卡。
- 第三、四列:rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是 PPS。
- 第五、六列:rxkB/s 和 txkB/s 分别表示每秒接收、发送的千字节数,也就是 BPS。
# -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
- 4, 通过tcpdump定位活跃应用程序端口的数据
# -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,解决办法:
- SYN FLOOD 原理:基于tcp三次握手
- SYN FLOOD 问题最简单的解决方法,就是从交换机或者硬件防火墙中封掉来源 IP,这样 SYN FLOOD 网络帧就不会发送到服务器中。