linux 性能自我学习 ———— 软中断 [五]
前言
linux 性能的自我学习。
正文
什么是软中断呢?
举一个网络的例子。
linux 将中断处理过程分为两个阶段:
上半部用来快速处理中断,他在中断禁止模式下运行,注意是处理跟硬件紧密相关或时间敏感的工作。
下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。
比如网卡接收到数据包后,会通过硬件中断的方式通知内核有新的数据到了。这时候,内核就应该调用中断处理程序来响应它。
对于上半部分来说,就是快速处理,把网卡的数据读取到内存中,然后更新硬件寄存器的状态,最后发一个软中断信号,通知下半部分进一步处理。
下半部分被软中断唤醒后,需要从内存中找到网络数据,再按照协议栈,对数据进行逐层解析和处理,直到把它送到了应用程序。
实际上,上半部分会打断cpu正在执行的任务,然后立即执行中断处理程序。下半部分以内核线程的方式执行,并且每个cpu都对应一个软中断内核线程,名字为: ksoftirqd/cpu 编号
软中断不仅仅是硬中断的下部分,一些内核自定义时间也是软中断,比如内核调度和rcu锁。
怎么查看软中断呢?
这里有10个不同的中断类型。
下面开始实验。
实验
需要用到的工具是:
docker sysstat sar hping3 tcpdump 等工具。
-
sar 是一个系统活动报告工具,既可以实时查看系统当前的活动,又可以配置保存和报告历史数据。
-
hping3 是一个可以构造tcp/ip 协议数据包的工具,可以对系统进行安全审计、防火墙测试等。
-
tcpdump 是一个常用的网络抓包工具,常用来分析各种网络问题。
hping3 在centos 安装方式:
创建本地安装目录
mkdir -p /usr/local/hping && cd /usr/local/hping
下载并解压
wget https://github.com/antirez/hping/archive/master.zip && unzip master.zip && cd hping-master
安装依赖包
yum install -y libpcap-devel yum install -y gcc gcc-c++ yum install -y tcl tcl-devel
设置软连接
ln -sf /usr/include/pcap-bpf.h /usr/include/net/bpf.h
进行安装
./configure && make strip && make install
测试查询版本
hping3 -v
然后执行:
hping3 -S -p 80 -i u100 192.168.62.136
这个时候你就发现变慢了:
curl http://192.168.62.136:5555
变慢一般查看cpu:
看起来似乎正常。
查看软中断:
watch -d cat /proc/softirqs
分析网卡情况:
sar -n DEV 1
第一列:表示报告时间
第二列: iface 表示网卡
第三四列: rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是pps
第五、六列: rxkb/s 和 txkb/s 表示每秒接收、发送的字节数,也就是bps。
这里就看到一个问题:
比如说接收了12690.54 包,但是txkB/s 只有669.21k。
还有一个是接收了6550.00,发送是12690.54,如果是tcp的话,那么应该是收发个数差不多,因为tcp的确认机制。
然后可以说,接收的都是小包。
然后就可以通过tcpdump 来确定是什么问题,可以抓取到很多s包,确定是syn flood 攻击。
结
下一节快速定位问题的手段
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2021-06-03 重新整理 .net core 实践篇—————配置系统之强类型配置[十]
2020-06-03 linux 连接wifi
2020-06-03 linux ssh连接
2020-06-03 c# checked 和 unchecked
2020-06-03 c# mvc action 跳转方式
2020-06-03 IIS 动态与静态压缩
2020-06-03 js 是单线程吗?