• linux 硬件中断调节


    什么是中断

    中断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,有多少核心。

    比如下面的命令输出。

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

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

    cat /proc/interrupts | grep eth
     18:   19237552          0          0          0          0          0          0          0          0           IO-APIC-fasteoi   eth0
     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 可以像下面这样做。

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

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

    0000 0001    cpu0
    0000 0010    cpu1
    
    

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

    cat /proc/interrupts | grep eth
     18:   19237980          0          0          0          0          0          0          0          0          0         IO-APIC-fasteoi   eth0
     19:       1792         19          0          0          0          0          0          0          0          0         IO-APIC-fasteoi   eth1
    
    cat /proc/interrupts | grep eth
     18:   19237880          0          0          0          0          0          0          0          0          0         IO-APIC-fasteoi   eth0
     19:       1792         28          0          0          0          0          0          0          0          0         IO-APIC-fasteoi   eth1
    
    cat /proc/interrupts | grep eth
     18:   19238980          0          0          0          0          0          0          0          0          0         IO-APIC-fasteoi   eth0
     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. 读取TCP相关数据
    2. 放入高速缓存和内存
    

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

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

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

  • 相关阅读:
    Windows下对函数打桩,及Linux类似技术
    WIN10重启后,在任务栏下添加快捷工具栏消失问题修复
    VS2012下std::function的BUG解决办法
    【转载】inno setup 水波纹效果,检测安装vcredist_x86.exe等
    ArchLinux下XFCE的一个问题修复:thunar加载的环境变量不正确
    Daliy Algorithm (GPLT)-- day 94
    Daliy Algorithm (greedy , hash )-- day 93
    Daliy Algorithm (tarjan, greedy, bfs )-- day 92
    Daliy Algorithm (heap,greedy , IQ )-- day 91
    Daliy Algorithm (cf , GPLT )-- day 90
  • 原文地址:https://www.cnblogs.com/kramer/p/5012892.html
Copyright © 2020-2023  润新知