1案例1.1环境部署环境1:WEB服务器dockerrun-itd--name=nginx-p80:80nginx环境2:SYN攻击curlhttp://xxx.xxx.xxx.xxx/
Welcometonginx!...#-S参数表示设置TCP协议的SYN(同步序列号),-p表示目的端口为80#-iu100表示??每100微秒发送一个网络帧#注意:如果实际中现象不明显,可以尝试减小100,比如10甚至1$hping3-S-p80-iu1xxx.xxx.xxx.xxx1.2分析过程1.CPU占用率不高但是软中断已经达到10%,非空闲状态的软中断全部用在软打断。2.确认是哪个软中断引起的问题watch-dcat/proc/softirqsTIMER(定时器中断),NET_RX(网络接收),SCHED(内核调度),RCU(RCU锁),网络接收变化最快。3、确认网络问题后,继续观察网络收发包情况#-nDEV表示显示网络收发报告,每隔1秒输出一组数据sar-nDEV1报道时间|网卡|rxpck/stxpck/s发送和接收帧数|exkB/stxkB/s发送和接收的千字节数。对于网卡et0,接收帧数为112924.00,但是数据量很小,5955.00。平均计算5955.00*1024Byte/112924.00=54Byte,每个包只有54字节,就是小包的问题。4.抓包确认问题tcpdump-ieth0-ntcpport8021:59:25.549573IPsource.40615>target.http:Flags[S],seq270293337,win512,length021:59:25.549592IPsource.40616>Target.http:Flags[S],seq830767629,win512,length0Flags[S]表示syn包,PPS超过1.2W确认synflood攻击。2概念2.1软中断的概念linux中的中断会打断CPU当前的工作,中断一般都设计得短而尖锐。但是为了解决中断处理程序执行时间过长导致中断丢失的问题,Linux的中断分为两个阶段:上半部分用于快速处理中断,运行在interruptdisabled模式,主要处理硬件相关和时间敏感的下半部分工作,用于延迟处理上半部分未完成的工作。通常,网卡作为内核线程运行。接收数据包示例:网卡接收到数据包后,会通过硬件中断通知内核有新数据。到达:前半部分,由于是快速处理,其实就是把网卡的数据读到内存中,然后更新硬件寄存器的状态(表示数据已经读完),最后发送一个软中断信号,通知下层做进一步处理。下层被软中断信号唤醒后,需要从内存中查找网络数据,然后根据网络协议栈对数据进行逐层分析处理,直至发送给应用程序。上半部分直接处理硬件请求,也就是我们常说的硬中断,特点是执行速度快,而下半部分由内核触发,也就是我们常说的软中断,特点是延迟执行。实际上,上半部分会中断CPU正在执行的任务,并立即执行中断处理程序。下半部分作为内核线程执行,每个CPU对应一个名为“ksoftirqd/CPU号”的softirq内核线程。例如0号CPU对应的softirq内核线程的名字是ksoftirqd/0。但是需要注意的是,软中断不仅仅包括刚才提到的硬件设备中断处理程序的下半部分,一些内核定义的事件也属于软中断,比如内核调度和RCU锁(Read-CopyUpdate的缩写,RCU是Linux内核中最常用的锁之一)等2.2查看软中断和内核线程cat/proc/interruptssoftinterruptscat/proc/softirqshardinterrupts