CPU软中断&案例分析ing

教程侠
• 阅读 4977

1 案例

1.1 环境部署

环境1:WEB服务器

docker run -itd --name=nginx -p 80:80 nginx

环境2:SYN攻击

curl http://xxx.xxx.xxx.xxx/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

# -S 参数表示设置 TCP 协议的 SYN(同步序列号),-p 表示目的端口为 80
# -i u100 表示每隔 100 微秒发送一个网络帧
# 注:如果你在实践过程中现象不明显,可以尝试把 100 调小,比如调成 10 甚至 1
$ hping3 -S -p 80 -i u1 xxx.xxx.xxx.xxx

1.2 分析过程

1、CPU使用率不高但是软中断已经到了10%,从非idle状态的全部用在了软中断上面。

CPU软中断&案例分析ing

2、确认是哪个软中断导致的问题

watch -d cat /proc/softirqs

TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU 锁)中,网络接收变化最快。

CPU软中断&案例分析ing

3、确认了网络问题,继续观察下网络收发包的情况

# -n DEV 表示显示网络收发的报告,间隔 1 秒输出一组数据
sar -n DEV 1

报告时间 | 网卡 | rxpck/s txpck/s收发帧数 | exkB/s txkB/s收发千字节数
CPU软中断&案例分析ing

  • 对网卡et0来说,收帧很大112924.00,但是数据量很小5955.00。
  • 计算一下5955.00*1024Byte/112924.00=54Byte平均每个包只有54字节即小包问题。

4、抓包确认问题

tcpdump -i eth0 -n tcp port 80

21:59:25.549573 IP 源端.40615 > 目标端.http: Flags [S], seq 270293337, win 512, length 0
21:59:25.549592 IP 源端.40616 > 目标端.http: Flags [S], seq 830767629, win 512, length 0

Flags [S]表示syn包,PPS超过1.2W确认syn flood攻击。

2 概念

2.1 软中断概念

linux的中断会打断CPU当前的工作,中断一般都设计的短小精悍。但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux的中断分为两个阶段:

  • 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作
  • 下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行

网卡收数据包的例子:

网卡收到数据包后会通过硬件中断的方式,通知内核有新的数据到了:对上半部来说,既然是快速处理,其实就是要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号,通知下半部做进一步的处理。而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。

  • 上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行
  • 而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行

实际上,上半部会打断 CPU 正在执行的任务,然后立即执行中断处理程序。而下半部以内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一)等。

2.2 查看软中断和内核线程

  • cat /proc/interrupts软中断
  • cat /proc/softirqs硬中断
点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
菜鸟阿都 菜鸟阿都
4年前
liunx服务器web环境搭建从0到1
前几天阿里云推出了新人优惠活动,许多小伙伴都参加了。阿都整理了搭建部署环境的这篇文章帮助同学们去高效的使用服务器。文章中的搭建步骤都是阿都这几年使用并整理的。希望可以帮助到大家。 前言   本文主要讲述搭建web部署环境【nginx、mysql、java】,一般搭建环境有两种方式,一种是从官网上下载文件安装包并上传到服务器【通过xftp】进行安装,另
Easter79 Easter79
4年前
svg自适应写法
svg自适应写法<pre<!DOCTYPEhtml<htmllang"en"<head<metacharset"UTF8"<titleDocument</title</head<body<divstyle"width:30%;height:3.6rem;"<svg
Stella981 Stella981
4年前
Keepalived高可用、Keepalived+LVS高可用调度器
Keepalived高可用环境准备:准备三台RHEL7虚拟机,2台做Web服务器(部署Keepalived实现Web服务器的高可用),Web服务器的浮动VIP地址为192.168.4.80,1台作为客户端(proxy)。配置主机名、IP和yum源:1.proxy (eth0:192.
Stella981 Stella981
4年前
InsightFace源码以及pre
一下摘自:https://blog.csdn.net/Fire\_Light\_/article/details/79602705(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2FFire_Light_%2Farticle%2Fdetails%2F7960
Stella981 Stella981
4年前
Python获取 当前目录、上一级目录
<pre<spanstyle"color:0000ff"import</span<spanstyle"color:000000"os</span<spanstyle"color:0000ff"print</span<spanstyle"color:800000"'</span<spanstyle"c
Easter79 Easter79
4年前
TiDB Pre
8月30日,TiDB发布PreGA版。该版本对MySQL兼容性、SQL优化器、系统稳定性、性能做了大量的工作。TiDB:SQL查询优化器调整代价模型优化索引选择,支持不同类型字段比较的索引选择支持基于贪心算法的JoinReorder
Stella981 Stella981
4年前
Jenkins配置下拉菜单联动效果
  在使用Jenkins集成时,经常需要配置一些环境信息,由于测试、线上、预发布需要切换环境和域名,需要在Jenkins中配置下拉菜单联动效果。  首先选择参数化构建过程,然后首先配置环境,环境分为:测试环境、预发布环境、正式环境,选择的组件为ChoiceParameter,Name定义为environment,选项为test、pre、onli
Stella981 Stella981
4年前
Pre
PAT甲级1119,我先在CSDN上面发布的这篇文章:https://blog.csdn.net/weixin\_44385565/article/details/89737224(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fweixin_443855
Wesley13 Wesley13
4年前
Unity 获取场景中所有目标对象(包括不激活的对象)
usingUnityEngine;usingUnityEditor;usingSystem.Collections.Generic;publicclassExampleScript:MonoBehaviour{//获取场景中所有目标对象(包括不激活的对象)不包括Pre