对Linux 网卡软中断做负载均衡

        测试中发现服务器整体负载较低,但有cpu负载特别高,其中一个cpu几乎一半是软中断si,特别忙,而还有的cpu特别空闲。

top - 16:12:08 up 31 days,  3:52,  1 user,  load average: 0.11, 0.11, 0.06
Tasks: 242 total,   4 running, 238 sleeping,   0 stopped,   0 zombie
Cpu0  : 12.3%us, 14.6%sy,  0.0%ni, 70.2%id,  0.0%wa,  0.0%hi,  3.0%si,  0.0%st
Cpu1  : 21.6%us, 22.9%sy,  0.0%ni,  7.3%id,  0.0%wa,  0.0%hi, 48.2%si,  0.0%st
Cpu2  : 16.5%us, 19.1%sy,  0.0%ni, 43.9%id,  0.0%wa,  0.0%hi, 20.5%si,  0.0%st
Cpu3  :  2.3%us,  2.6%sy,  0.0%ni, 94.1%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu4  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

       先用mpstat -I SUM -P ALL 5 来看一下每个cpu的终端情况,发现cpu1和cpu2处理的中断确实很多,是什么dd在使用这两个cpu做中断呢?

# mpstat -I SUM -P ALL 5
Linux 2.6.32-220.13.1.el6.x86_64 (talus186) 	12/26/2013 	_x86_64_	(12 CPU)

04:15:18 PM  CPU    intr/s
04:15:23 PM  all  62422.60
04:15:23 PM    0      0.00
04:15:23 PM    1  21566.20
04:15:23 PM    2  12123.00
04:15:23 PM    3      0.00
04:15:23 PM    4      1.00

      使用 cat /proc/interrupts 查看中断情况,间隔几秒后再次cat /proc/interrupts,然后比较对应值的变化,发现eth0-1、eth0-2等使用cpu1、cpu2做中断,这两个对应的中断号分别是95,96...

 

 95:         33  325897741          0   30997484         72          0   93968731          0          0          0        426        864  IR-PCI-MSI-edge      eth0-1
  96:         50        206   66609822        117          0          0          0          0          0          0          0   24437509  IR-PCI-MSI-edge      eth0-2
     注:网卡(包括磁盘 等外设)需要cpu服务时,都会抛出一个中断,中断告诉cpu发生了什么事情,cpu就要停止目前的工作来处理这个中断。比如当网卡收到包时,假如cpu正在执行某个应用进程处理程序,此刻就会被网卡中断所打断执行中断处理程序。每个外设对应的中断处理程序自然是不同的,因此为了进行区分,防止多个设备发出相同的中断请求,系统中的每个设备都被分配了一个独一无二的IRQ(Interupt Request),上面95、96就是所谓的IRQ,如果网卡有多队列,每个队列可以对应一个IRQ(参考net)。

      在使用 cat /proc/irq/95/smp_affinity cat /proc/irq/smp_affinity 等看出网卡的队列都在使用cpu1 和cpu2

cat /proc/irq/95/smp_affinity
00000002
cat /proc/irq/96/smp_affinity
00000004

      好了,把空闲的cpu用上来分摊网卡中断

echo 08 > /proc/irq/97/ smp_affinity
echo 10 > /proc/irq/98/ smp_affinity
...

      再进行测试,发现cpu消耗整体还不够均衡,TOP下使用f,然后再加j,发现应用进程使用的cpu与网卡中断使用的cpu重合,再把单线程应用进程绑定到其他CPU,终于均衡下来。

      最后,网卡软中断绑定cpu需要满足几个条件:1 linux内核版本必须在2.4+; 2 网卡对应的中断控制器必须是IO-APIC芯片,且需启用IO-APIC;3 部分CPU可能不支持。

<think>好的,我现在需要回答用户关于Linux下硬中断和软中断的问题。首先,我得回忆一下这两者的基本概念和区别。硬中断是由硬件设备触发的,比如键盘、鼠标或者网卡,当这些设备需要处理时,会发送信号给CPU,引发中断处理程序。而软中断则是由软件生成的,通常用于处理延迟敏感的任务,或者作为硬中断处理的一部分,将部分工作推迟到稍后执行。 接下来,我应该考虑如何组织这些信息,让用户能够清晰理解。可能需要分点说明它们的定义、特点、区别以及使用场景。同时,用户提到需要结构清晰,逐步解决问题,所以最好按照逻辑顺序展开。 硬中断的处理流程是怎样的呢?当硬件设备触发中断后,CPU会暂停当前任务,保存上下文,然后跳转到对应的中断处理程序(ISR)。这个过程需要快速完成,否则会影响系统响应。而软中断,比如在Linux中的softirq或tasklet,是在内核的上下文中执行的,通常由内核线程如ksoftirqd处理,可以在更合适的时间调度执行,减少对实时任务的影响。 需要注意两者的区别,比如触发源、处理时机、优先级等。硬中断优先级最高,会打断CPU当前工作,而软中断优先级较低,可以被打断。此外,硬中断处理程序要尽可能简短,把耗时操作放到软中断中,这样系统性能会更好。 可能还需要举一些例子,帮助用户理解。比如,网卡到数据时触发硬中断,然后内核快速处理,将数据放入队列,后续的协议处理(如TCP/IP)可能通过软中断来完成。这样避免硬中断处理时间过长。 另外,用户提到要使用LaTeX格式,所有行内数学表达式用$...$,独立公式用$$...$$。不过在这个问题中可能数学公式不多,但如果有相关概念需要公式,比如中断处理时间的计算,可以适当加入。 需要检查LaTeX语法是否正确,比如使用反斜杠转义,确保符号正确显示。同时,保持回答用中文,结构清晰,分点说明,符合用户的要求。 最后,确保回答真实可靠,可能需要参考Linux内核文档或权威资料,确认硬中断和软中断的处理机制、区别以及实际应用中的例子。避免错误的信息,比如混淆软中断和信号处理,或者误将系统调用视为软中断。 总结一下,回答的结构应该是:定义硬中断和软中断,各自的特点,处理流程,区别与联系,以及实际应用中的例子。这样用户能够逐步理解这两个概念,并知道它们在Linux系统中的作用和重要性。</think>在Linux系统中,**硬中断**和**软中断**是两种关键的中断处理机制,用于协调硬件与操作系统的交互。以下是逐步分析: --- ### 一、硬中断(Hard Interrupt) 1. **定义** 硬中断由硬件设备(如网卡、磁盘、键盘)触发,通过电信号直接通知CPU需要处理紧急事件。例如,网卡到数据时,会通过中断请求线(IRQ)发送硬中断。 2. **特点** - **高优先级**:CPU会立即暂停当前任务,转而执行对应的**中断处理程序(ISR)**。 - **短耗时**:ISR需快速完成,避免阻塞系统。通常仅记录状态并将耗时操作推迟到软中断。 - **异步触发**:由硬件随机产生,与CPU当前执行的任务无关。 3. **处理流程** ```plaintext 硬件触发中断 → CPU保存上下文 → 执行ISR → 触发软中断(可选) → 恢复上下文 ``` --- ### 二、软中断(Soft Interrupt) 1. **定义** 软中断由内核在软件层面触发,用于延迟处理非紧急任务或补充硬中断的未完成工作。例如,网络协议栈处理、定时器任务等。 2. **特点** - **低优先级**:由内核线程(如`ksoftirqd`)调度执行,不会抢占CPU,可被硬中断打断。 - **可批量处理**:支持将多个中断任务合并处理,减少上下文切换开销。 - **同步触发**:通过代码显式调用(如`raise_softirq()`)。 3. **常见类型** - `NET_RX_SOFTIRQ`(网络接) - `TASKLET_SOFTIRQ`(小任务处理) - `TIMER_SOFTIRQ`(定时器任务) --- ### 三、核心区别 | **特性** | 硬中断 | 软中断 | |----------------|-------------------------------|-------------------------------| | **触发源** | 硬件设备 | 内核代码 | | **优先级** | 最高(直接抢占CPU) | 较低(由内核调度) | | **处理速度** | 纳秒级响应 | 微秒级延迟 | | **实现方式** | 通过中断控制器(如APIC) | 内核的软中断子系统(如`softirq`) | --- ### 四、协作示例(以网络数据处理为例) 1. **硬中断阶段**: 网卡到数据 → 触发硬中断 → ISR将数据存入接队列 → **标记软中断**。 2. **软中断阶段**: 内核线程`ksoftirqd`检测到软中断 → 从队列取出数据 → 解析协议(如TCP/IP) → 传递给应用程序。 --- ### 五、性能优化 1. **硬中断合并**(如NAPI): 在高流量场景下,网卡触发一次硬中断后,后续数据直接由软中断处理,减少中断风暴。 2. **软中断负载均衡**: 多核系统中,软中断可分配到不同CPU核心,避免单核过载。 --- ### 六、监控工具 - **硬中断统计**: ```bash cat /proc/interrupts ``` - **软中断统计**: ```bash cat /proc/softirqs ``` --- 通过上述机制,Linux实现了高效的中断处理,平衡了实时性与系统吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值