解决方法
处理hw中断是最重要的,因为如果不快速处理它们,则会引入太高的延迟并且用户体验受损,或者硬件缓冲区将在中断服务设备之前填充,并且数据丢失.不要足够快地维护网络适配器?它将覆盖fifo中的数据,你将丢失数据包.不要快速维修硬盘?硬盘驱动器停止排队的读取请求,因为它无处可放置结果.
SoftIrqs允许维护硬件中断的关键部分尽可能短;而不是必须在现场处理整个hw中断,将重要数据从设备读入RAM或其他方式,然后启动SoftIrq以完成工作.这样可以在最短的时间内禁用硬件中断,同时仍然以高优先级完成工作.
这篇文章是关于此事的一个不错的参考:
https://lwn.net/Articles/520076/
编辑问题:
SoftIrqs是可重入的 – 它们可以在任何cpu上处理.从我链接的文章:
There are two places where software interrupts can “fire” and preempt
the current thread. One of them is at the end of the processing for a
hardware interrupt; it is common for interrupt handlers to raise
softirqs,so it makes sense (for latency and optimal cache use) to
process them as soon as hardware interrupts can be re-enabled
强调补充说.它们可以内联处理 – 我相信这意味着它们可以在不引起上下文切换的情况下进行处理,这意味着一旦启用硬件中断,我们就可以直接跳转到SoftIrq,尽可能减少cpu缓存滥用.所有这些都有助于SoftIrqs轻巧而灵活,这使它们成为高频处理的理想选择.
>如果需要,可以将它们推送到另一个cpu,从而提高吞吐量.>可以在当前上下文中启用hwints后立即处理它们,尽可能保留处理器状态,从而改善延迟>它们允许硬件中断继续处理,因为这些是我们最重要的目标>如果负载过高,我们可以重新安排到ksoftirqd进程,我们需要从正常的用户进程中抽出时间.