什么是中断

中断interrupts是指硬件主动的来告诉CPU去做某些事情。比如网卡收到数据后可能主动的告诉CPU来处理自己接受到的数据,键盘有了按键输入后会主动告知CPU来读取输入。 硬件主动的打扰CPU这种沟通方式就叫做中断。不同的设备会有一个中断号叫IRQ号 来唯一标识自己,这样CPU就知道发生中断的是哪些设备。

中断通常都是硬件产生的一些信号,该信号会先发送给中断控制器,现在叫做通常用的是高级可编程终端控制器APIC。 该控制器会把中断信息转发给CPU。

linux 2.4版本以后能够支持把不同硬件产生的中断分配给不同的CPU CORE处理。 这种技术叫做 SMP IRQ Affinity。更多介绍请参看Linux内核源代码自带的文档:linux-2.6.31.8/Documentation/IRQ-affinity.txt。

如何查看中断

我们首先来了解两个基本命令:

  • cat /proc/interrupts,查看系统上的中断情况,通常网卡的中断会被分配到CPU0上。
  • cat cat /proc/cpuinfo,查看CPU信息,有多少CPU,有多少核心。

比如下面的命令输出。

  1. cat /proc/interrupts | head
  2. CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8
  3. 0: 9906 0 0 0 0 0 0 0 0 IO-APIC-edge timer
  4. 1: 660 0 0 0 0 0 0 0 0 IO-APIC-edge i8042
  5. 7: 0 0 0 0 0 0 0 0 0 IO-APIC-edge parport0
  6. 8: 1 0 0 0 0 0 0 0 0 IO-APIC-edge rtc0

第一列是IRQ Number, 最后一列是硬件名称。 我们把head 命令换成grep eth 可以看见各网卡的中断情况如下

  1. cat /proc/interrupts | grep eth
  2. 18: 19237552 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth0
  3. 19: 1570 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth1

可知,网卡eth0 IRQ number 18. 中断分配给CPU0. 网卡eth1 IRQ number19 中断也分配给CPU0.

如何调整

上面我们看见了中断的分配情况。所有网卡的中断都分配给了CPU 0 。 这样如果我们的机器有多块网卡,那么在CPU 负荷过高的时候可能就不能有效的响应每一块网卡的中断请求。 我们希望把不同网卡的中断请求发送给不同的CPU 可以像下面这样做。

  1. echo "2" > /proc/irq/19/smp_affinity

这样把irq 19的硬件也就是eth1的中断请求发送给CPU1. 为什么这里是echo 2呢? 这是因为 cpu在系统中的表示是二进制表示如下

  1. 0000 0001 cpu0
  2. 0000 0010 cpu1

自然十进制的2就代表第二块cpu。 运行完上面的命令我们再看中断情况如下:

  1. cat /proc/interrupts | grep eth
  2. 18: 19237980 0 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth0
  3. 19: 1792 19 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth1
  4. cat /proc/interrupts | grep eth
  5. 18: 19237880 0 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth0
  6. 19: 1792 28 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth1
  7. cat /proc/interrupts | grep eth
  8. 18: 19238980 0 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth0
  9. 19: 1792 48 0 0 0 0 0 0 0 0 IO-APIC-fasteoi eth1

我们运行了不同次数的命令,可以看见对于irq 19. cpu 0 上的中断数不再增加而cpu1的中断数一直增加,所以cpu1现在负责相应eth1的中断请求。

意义

在网络非常 heavy 的情况下,对于文件服务器、高流量 Web 服务器这样的应用来说,把不同的网卡 IRQ 均衡绑定到不同的 CPU 上将会减轻某个 CPU 的负担,提高多个 CPU 整体处理中断的能力。 对于数据库服务器这样的应用来说,把磁盘控制器绑到一个 CPU、把网卡绑定到另一个 CPU 将会提高数据库的响应时间、优化性能

other

还有一些其它需要知道的事情如:

interrupt affinity with multiple cores

在上面的例子中我们 echo 2 指定网卡eth1的中断请求发送给CPU 1. 但有时候可以echo 3 把网卡eth1的请求平均发送给 cpu 0和1。因为1+2 = 3 代表这两块cpu。

我们说有时候是因为 I0-APIC的工作模式有两种logic和 physical。 只有在logical的情况下才可以做到这一点。 logical模式这种CPU 自动负载均衡的机制只能支持最多8个core。所以一旦CPU过多可能无法使用logical模式。 不过这样也不是什么坏事,因为这种模式其实对性能有一定影响, 考虑下面这种情况:

一个TCP connection发来请求给eth1. 中断被cpu 0 响应。 cpu0 做如下事情:

  1. 1. 读取TCP相关数据
  2. 2. 放入高速缓存和内存

同一个TCP connection 发来另一个请求,中断被cpu 1响应。 cpu1 做如下事情:

  1. 1. 读取 缓存中的数据, 发现自己的高速缓存中没有
  2. ...

可见不同的cpu 来handle同一个网卡有时会导致性能的下降。

linux 硬件中断调节的更多相关文章

  1. Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity) 转

    硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能.现在的服务器上动不动就是多 CPU 多核. ...

  2. Linux内核中断学习

    1.内核中断概述 (1)在OS环境下编写中断处理函数与之前在裸机中编写中断处理函数的方式是不一样的,在Linux内核中提供了一套用来管理硬件中断资源的软件体系架构. (2)在操作系统中,中断号与gpi ...

  3. Linux 内核中断内幕

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...

  4. Linux的中断 & 中断和异常的区别

    参考 http://www.yesky.com/20010813/192117.shtml 结构化程序设计思想认为:程序 = 数据结构 + 算法.数据结构体现了整个系统的构架,所以数据结构通常都是代码 ...

  5. Smart210学习记录-------linux驱动中断

    Linux中断 Linux 的中断处理分为两个半部,顶半部处理紧急的硬件操作,底半部处理不紧急的耗时操作.tasklet 和工作队列都是调度中断底半部的良好机制,tasklet 基于软中断实现.内核定 ...

  6. linux内核--中断处理程序

    一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...

  7. Linux内核中断和异常分析(中)

    在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...

  8. linux内核中断之看门狗

    一:内核中断 linux内核中的看门狗中断跟之前的裸板的中断差不多,在编写驱动之前,需要线把内核自带的watch dog模块裁剪掉,要不然会出现错误:在Device Drivers /Watchdog ...

  9. [转帖]Linux 硬件和系统配置查看命令小结

    https://blog.csdn.net/strongwangjiawei/article/details/8208825 转帖了不少 发现自己记住的还是不多.. Linux 硬件和系统配置查看命令 ...

随机推荐

  1. 在action中将字符串、对象、list集合保存到值栈中,在jsp页面中获取的方法

    转自:csdn 封装对象User,属性有id,username,email等1.1:在action中将字符串保存到值栈中   1.1.1 获取值栈对象         ValueStack stack ...

  2. iOS Programming Camera 1

     iOS Programming Camera  1 1 Displaying Images and UIImageView 1.1  put an instance of UIImageView o ...

  3. CSS中的趣事之float浮动

       浮动float一般跟left或是right: 特性: 1,包裹性:浮动文本类型时,需要指定宽度width,如果不指定,就会折叠到最小宽度: 2,浮动会影响别的元素: 3,子级浮动,会导致父级高度 ...

  4. (转)淘淘商城系列——SSM框架整合之Dao层整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ...

  5. python3爬取微博评论并存为xlsx

    python3爬取微博评论并存为xlsx**由于微博电脑端的网页版页面比较复杂,我们可以访问手机端的微博网站,网址为:https://m.weibo.cn/一.访问微博网站,找到热门推荐链接我们打开微 ...

  6. cce - 控制台中文环境

    语法 (SYNTAX) cce [-e program] 描述 (DESCRIPTION) 该程序是一个类似于 WZCE , yact 和 chdrv 的控制台中文平台.进入该环境后可以用“空格 + ...

  7. ALTER GROUP - 修改一个用户组

    SYNOPSIS ALTER GROUP groupname ADD USER username [, ... ] ALTER GROUP groupname DROP USER username [ ...

  8. 【git】搭建git服务器

    在 Linux 下搭建 Git 服务器 目录 ① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clon ...

  9. vsphere中的vcenter创建esxi模板虚拟机新建无法连接网络

    1.删除网卡配置文件下的uuid和hwaddr  这是因为虚拟机模板创建网卡mac没改变 2.删除规则文件 rm -f /etc/udev/rules.d/-prtsistent-net.rules ...

  10. java线程池 多线程搜索文件包含关键字所在的文件路径

    文件读取和操作类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; publi ...