Linux中断响应流程是怎样的?

嘿嘿,我们来说一下Linux的中断响应流程。
这件事确实很复杂。
我记得有一次,我在实验室里。
当时,我使用的是老式服务器。
设置相当高,但卡住了。
经进一步调查,确定是由于截止响应慢引起的。

首先,必须有造成中断的设备。
例如,你的网卡或键盘突然向CPU发送信号。
该信号是一个中断请求。
我记得当时我们使用了IOAPIC,它就像一个代理,收集所有外设的中断请求并将它们转发到CPU。

那么当CPU收到信号后,就会挂起当前任务,准备进入中断处理过程。
在这个过程中,CPU会检测到中断,然后根据中断源标识符找到对应的中断向量,即中断号。
当时我们用了一个IDT,它记录了所有中断处理程序的访问地址和权限级别。

接下来,CPU会保存当前的程序上下文,例如寄存器值和标志位,然后跳转到相应的中断处理程序。
该程序由内核开发人员编写,用于处理特定事件,例如设备 I/O 完成或错误检测。

处理完中断后,程序将退出,然后CPU将恢复之前保存的上下文并允许程序继续执行。
这个过程实际上非常关键,因为如果处理不当,可能会导致系统崩溃或数据丢失。

最后,我们需要谈谈性能优化。
我记得Linux为了提高性能,采用了中断和bottom half机制,比如软中断和任务组。
这些机制可以延迟耗时操作的处理并减少停机时间。

总之,Linux中断响应过程虽然复杂,但保证了系统的稳定性和实时性。
通过当时对这个流程的优化,我们的服务器性能得到了很大的提升,不再出现卡顿的情况。

如何查看Linux网络接口中断分配 /proc/interrupts分析

大家好,我们来谈谈Linux。
您询问了 /proc/interpts。
这非常重要,尤其是在进行网络工作时。

上周,一位客户向我询问服务器 CPU 速度和网络延迟的问题。
我的第一反应是检查 /proc/interpts。
这个文件直接告诉你哪个中断使哪个CPU最高兴。

例如,你看到这样的一行:
1 6 : 1 00000 1 00000 1 002 00 1 5 0 PCI-MSI-edge eth0
好吧,看看这个中断号1 6 ,CPU0执行了1 00000次,CPU1 执行了1 00000次,CPU2 执行了1 002 00次。
是的,CPU3 已经做到了 1 5 0 次。
很明显CPU2 压力极大,其他CPU都闲置。
此时,您可能想知道堵塞是否分布不均匀。

为什么会发生这种情况? 有时网卡驱动默认只提供单CPU,或者系统默认没有启用多队列(RSS)。
可以使用 ethtool -l eth0 查看网卡有多少个队列。
如果大于1 ,则存在被利用的可能性。

如何解决? 1 、首先确认你的网卡支持多队列。
使用ethtool -L eth0查看是否支持RSS,通常有多个队列。
2 . 启用网卡的多队列功能,或者配置RSS哈希规则,使数据包可以分配到不同的队列。
例如,尝试 ethtool -N eth0 rxhash 策略 mru。
3 .如果这还不行,或者你想要更精确的控制,你可以玩一下中断亲和力。
这需要更改 /proc/irq//smp_affinity。
现在来查看如何设置:cat /proc/irq//smp_affinity 无论你想改变什么,echo |使用 sudo t /proc/irq//smp_affinity。
例如,如果您希望 CPU0 和 CPU1 执行此任务,您可以 echo 0x3 |您可以尝试 sudo t /proc/irq/1 6 /smp_affinity。
这个 0x3 二进制文件是 0000001 1 注意:请小心这一点,因为错误的更正可能会导致更奇怪的问题。
如果您不确定,请先不要移动,或者先检查该人的不平衡情况,或者查找互联网上是否有现成的脚本来帮助您计算掩码。

顺便说一句,有几个了解这个文件的好帮手: mpstat -P ALL 1 :让您了解CPU软中断需要多长时间。
sar -n DEV 1 :检查发送和接收流量的网卡。
有时更多的堵塞与交通拥堵有关。
Perf Top:可以帮助您找到哪个函数占用最多的中断处理时间。

总的来说,/proc/interpts 是一个非常直观的工具。
看看是否某个CPU被过度使用,然后思考是否是驱动问题,网卡没有多队列,还是需要手动调整中断分配。
如果理解了这一点,往往可以解决很多性能问题。

您具体想看到哪个系统?或者说你遇到了什么事情吗?你可以详细解释一下,我给你分解一下。

查看硬件中断绑定

说白了,在Linux中检查硬件中断绑定情况有两个步骤:首先我们查看中断统计信息,然后查看CPU正在执行的位置。

首先,让我告诉你最重要的事情。
/proc/interrupts 文件是基础。
去年我们做百万级流量项目时,发现老网卡的宕机次数高达3 000s^-1 我手动定位了网卡独占中断的位置,并通过ip link命令进行了验证。
还有一点是需要转换hex文件/proc/irq//smp_affinity。
例如,F0F 代表 CPU0 和 CPU1 ,但 numastat -H 命令提供了更直观的方式来查看正在使用哪些内核。
还有另一个重要的细节。
在调整您的偏好之前,您必须停止服务。
去年我没有关掉irqbalance,所以改完重启后差点就糊涂了。
说实话,我很困惑。

一开始我以为修改会提高性能,但后来发现不对劲。
强制核心绑定到负载较重的服务器实际上破坏了 CPU 调度。
等等,还有一件事。
事实上,现在许多现代CPU都支持自动中断平衡,例如Intel的处理器间中断(IPI)。
强制手动绑定可以被系统自动覆盖。

要捕获中断分布,我们建议在测试系统上使用 perf 工具,并且不要接触任何您不信任的内容。

如何查看Linux网络中断 cat /proc/interrupts分析方法

哎呀,告诉你我当年遇到的陷阱真是头疼,而且在Linux网络上工作真是头疼。
不要听那些书上的理论。
我来说说我遇到的真实情况吧。

比方说,两年前,我在上海的一个服务器机房里,那个家伙,其中一台服务器,突然网络连接非常糟糕,客户端无法连接。
我想做的第一件事是查看 /proc/interrupts。
那东西确实是一个很好的帮助。

打开终端并输入 cat /proc/interrupts。
查看输出。
一行一行都是中断号,后面是每个CPU核的计数,最后是设备名称,比如eth0。
您需要先找到您的网卡。
如果信息不完整,可以使用 lspci -v 查找网卡的详细描述,看看其对应的 IRQ 是什么。

当年我发现的是eth0对应的中断计数在快速增加。
您知道,这个数字就是发生的中断次数。
我当时就在想,这是怎么回事?司机不工作?或者是硬件有问题?
然后我学会了变得聪明。
我第一次看cat /proc/interrupts>interrupts_1 .txt,等了一分钟,睡1 ,再看一遍,保存到interrupts_2 .txt。
然后使用awk计算差值,看看每秒中断次数是多少次。
哇,这个数字好吓人!一定有什么问题。

然后我用ethtool看了一下,输入ethtool -i eth0可以看到驱动信息;输入 ethtool -S eth0 可查看各种统计信息,例如收到了多少数据包、有多少数据包出错以及丢失了多少数据包。
那一年我发现丢包率特别高。

接下来我查看了 /proc/irq/<中断数量>/smp_affinity 以查看中断是否过于集中在特定 CPU 上。
有时如果你调整它并部署它,性能会好得多。
我记得那一年尝试过,调整了一下,嘿,它确实有效。

当然还有/proc/irq/<中断号>/smp_affinity。
您可以更改 CPU 关联性并将中断分配给不同的 CPU。
我当年用它是为了防止某个CPU做太多的工作。

看吧,分析Linux网络中断的关键是看/proc/interrupts,然后结合ethtool。
有时还需要检查dmesg,看看注册表是否有错误。
那年我终于发现驱动版本好像太老了,更新一下就好了。

所以在处理Linux网络问题时,不要只看理论,多做实践,多看真实文档,多尝试。
这些都是我这十年来犯过的陷阱,请大家参考一下。