http://www.51testing.com/html/07/n-222407.html

硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。我前天收到一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题。以下操作在 SUN FIre X2100 M2 服务器+ 64位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上执行。

  什么是中断

  中文教材上对 “中断” 的定义太生硬了,简单的说就是,每个硬件设备(如:硬盘、网卡等)都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情,这样 CPU 可能就会放下手中的事情去处理应急事件,硬件设备主动打扰 CPU 的现象就可称为硬件中断,就像你正在工作的时候受到 QQ 干扰一样,一次 QQ 摇头就可以被称为中断。

  中断是一种比较好的 CPU 和硬件沟通的方式,还有一种方式叫做轮询(polling),就是让 CPU 定时对硬件状态进行查询然后做相应处理,就好像你每隔5分钟去检查一下 QQ 看看有没有人找你一样,这种方式是不是很浪费你(CPU)的时间?所以中断是硬件主动的方式,比轮询(CPU 主动)更有效一些。

  好了,这里又有了一个问题,每个硬件设备都中断,那么如何区分不同硬件呢?不同设备同时中断如何知道哪个中断是来自硬盘、哪个来自网卡呢?这个很容易,不是每个 QQ 号码都不相同吗?同样的,系统上的每个硬件设备都会被分配一个 IRQ 号,通过这个唯一的 IRQ 号就能区别张三和李四了。

  在计算机里,中断是一种电信号,由硬件产生,并直接送到中断控制器(如 8259A)上,然后再由中断控制器向 CPU 发送信号,CPU 检测到该信号后,就中断当前的工作转而去处理中断。然后,处理器会通知操作系统已经产生中断,这样操作系统就会对这个中断进行适当的处理。现在来看一下中断控制器,常见的中断控制器有两种:可编程中断控制器 8259A 和高级可编程中断控制器(APIC),中断控制器应该在大学的硬件接口和计算机体系结构的相关课程中都学过。传统的 8259A 只适合单 CPU 的情况,现在都是多 CPU 多核的 SMP 体系,所以为了充分利用 SMP 体系结构、把中断传递给系统上的每个 CPU 以便更好实现并行和提高性能,Intel 引入了高级可编程中断控制器(APIC)。

  光有高级可编程中断控制器的硬件支持还不够,Linux 内核还必须能利用到这些硬件特质,所以只有 kernel 2.4 以后的版本才支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这个绑定技术被称为 SMP IRQ Affinity. 更多介绍请参看 Linux 内核源代码自带的文档:linux-2.6.31.8/Documentation/IRQ-affinity.txt

  如何使用

  先看看系统上的中断是怎么分配在 CPU 上的,很显然 CPU0 上处理的中断多一些:

# cat /proc/interrupts
           CPU0       CPU1
  0:  918926335          0    IO-APIC-edge  timer
  1:          2          0    IO-APIC-edge  i8042
  8:          0          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
12:          4          0    IO-APIC-edge  i8042
14:    8248017          0    IO-APIC-edge  ide0
50:        194          0   IO-APIC-level  ohci_hcd:usb2
58:      31673          0   IO-APIC-level  sata_nv
90:    1070374          0         PCI-MSI  eth0
233:         10          0   IO-APIC-level  ehci_hcd:usb1
NMI:       5077       2032
LOC:  918809969  918809894
ERR:          0
MIS:          0

  为了不让 CPU0 很累怎么把部分中断转移到 CPU1 上呢?或者说如何把 eth0 网卡的中断转到 CPU1 上呢?先查看一下 IRQ 90 中断的 smp affinity,看看当前中断是怎么分配在不同 CPU 上的(ffffffff 意味着分配在所有可用 CPU 上):

# cat /proc/irq/90/smp_affinity
7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff

  在进一步动手之前我们需要先停掉 IRQ 自动调节的服务进程,这样才能手动绑定 IRQ 到不同 CPU,否则自己手动绑定做的更改将会被自动调节进程给覆盖掉。如果想修改 IRQ 90 的中断处理,绑定到第2个 CPU(CPU1):

# /etc/init.d/irqbalance stop
# echo "2" > /proc/irq/90/smp_affinity

过段时间在看 /proc/interrupts,是不是 90:eth0 在 CPU1 上的中断增加了(145)、在 CPU0 上的中断没变?不断打印 /proc/interrupts 就会发现 eth0 在 CPU0 上的中断数始终保持不变,而在 CPU1 上的中断数是持续增加的,这正是我们想要的结果:

# cat /proc/interrupts
           CPU0       CPU1
  0:  922506515          0    IO-APIC-edge  timer
  1:          2          0    IO-APIC-edge  i8042
  8:          0          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
12:          4          0    IO-APIC-edge  i8042
14:    8280147          0    IO-APIC-edge  ide0
50:        194          0   IO-APIC-level  ohci_hcd:usb2
58:      31907          0   IO-APIC-level  sata_nv
90:    1073399        145         PCI-MSI  eth0
233:         10          0   IO-APIC-level  ehci_hcd:usb1
NMI:       5093       2043
LOC:  922389696  922389621
ERR:          0
MIS:          0

  有什么用

  在网络非常 heavy 的情况下,对于文件服务器、高流量 Web 服务器这样的应用来说,把不同的网卡 IRQ 均衡绑定到不同的 CPU 上将会减轻某个 CPU 的负担,提高多个 CPU 整体处理中断的能力;对于数据库服务器这样的应用来说,把磁盘控制器绑到一个 CPU、把网卡绑定到另一个 CPU 将会提高数据库的响应时间、优化性能。合理的根据自己的生产环境和应用的特点来平衡 IRQ 中断有助于提高系统的整体吞吐能力和性能。

  本人经常收到网友来信问到如何优化 Linux、优化 VPS、这个问题不太好回答,要记住的是性能优化是一个过程而不是结果,不是看了些文档改了改参数就叫优化了,后面还需要大量的测试、监测以及持续的观察和改进。

  绑定进程到不同CPU

  介绍了在 Linux 多核下如何绑定硬件中断到不同 CPU,其实也可以用类似的做法把进程手动分配到特定的 CPU 上,平时在 Linux 上运行的各种进程都是由 Linux 内核统一分配和管理的,由进程调度算法来决定哪个进程可以开始使用 CPU、哪个进程需要睡眠或等待、哪个进程运行在哪个 CPU 上等。如果你对操作系统的内核和进程调度程序感兴趣的话,不妨看看那本经典的 Operating Systems Design and Implementation(Linus Torvalds 就是看了这本书受到启发写出了 Linux),从简单的 Minix 入手,hack 内核是件很有意思的事情,本人以前修改过 Minix 内核的进程调度,学到了内核方面的很多东西。另外推荐一本课外读物:Just for Fun,Linus Torvalds 写的一本自传。

  Linux 给我们提供了方便的工具用来手动分配进程到不同的 CPU 上(CPU Affinity),这样我们可以按照服务器和应用的特性来安排特定的进程到特定的 CPU 上,比如 Oracle 要消耗大量 CPU 和 I/O 资源,如果我们能分配 Oracle 进程到某个或多个 CPU 上并由这些 CPU 专门处理 Oracle 的话会毫无疑问的提高应用程序的响应和性能。还有一些特殊情况是必须绑定应用程序到某个 CPU 上的,比如某个软件的授权是单 CPU 的,如果想运行在多 CPU 机器上的话就必须限制这个软件到某一个 CPU 上。

  安装 schedutils

  在 CentOS/Fedora 下安装 schedutils:

# yum install schedutils

  在 Debian/Ubuntu 下安装 schedutils:

# apt-get install schedutils

  如果正在使用 CentOS/Fedora/Debian/Ubuntu 的最新版本的话,schedutils/util-linux 这个软件包可能已经装上了。

  计算 CPU Affinity 和计算 SMP IRQ Affinity 差不多:

0x00000001    (CPU0)
0x00000002    (CPU1)
0x00000003    (CPU0+CPU1)
0x00000004    (CPU2)
...

  使用 schedutils

  如果想设置进程号(PID)为 12212 的进程到 CPU0 上的话:

# taskset 0x00000001 -p 12212

Linux技巧:多核下绑定硬件/进程到不同CPU相关推荐

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

    转载 - Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity) 作者 digoal 日期 2016-11-20 标签 Linux , IRQ , 中断 , CPU亲和 , 绑定中断 ...

  2. linux系统查看电脑设备型号,Linux和Unix下查看硬件信息(CPU型号,内存型号,硬盘型号,主板型号)...

    Linux 下查看硬件信息: CPU型号:cat /proc/cpuinfo 内存大小:top 内存型号:dmidecode |grep -A16 "Memory Device$" ...

  3. usrp运行完整linux,Ubuntu系统下USRP硬件驱动(UHD)的编译与安装

    在Ubuntu系统下USRP硬件驱动(UHD)安装最简单的方式就是直接从Ettus Research官方提供的PPA源安装,不过本文介绍的是如何从源代码进行编译与安装. 1.从PPA源安装只需要下面三 ...

  4. java jni linux_java jni实现linux环境下绑定硬件的License

    由于系统运行在Linux环境中,该License绑定服务器的cpuid和mac等信息,而java实现起来不太方便所以就利用了JNI 问题及解决方法: 1.System.loadLibrary(&quo ...

  5. Linux下查看某个进程占用的CPU及内存

    目录 1.查看指定进程的PID 2.用top命令指定固定的PID 3.使用ps查询指定进程名或PID的占用情况 4.查看更详细的内存占比 1.查看指定进程的PID ps -ef | grep iquo ...

  6. Linux命令行下杀死一个进程

    在做项目的时候经常会出现程序死机.锁死.无响应等情况,这时候就需要找到程序相应的进程将其杀掉即可.步骤如下: 1.定位进程 top命令:可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系 ...

  7. c linux 获取cpuid_Linux下C编程 -- 得到系统的CPU信息(cpuid)

    在 linux下可以通过查看 cat /proc/cpuinfo查看CPU的相关信息,但是在linux下C编程需要使用汇编语言来实现,因为C语言中没有实现查看CPU信息的函数,一般实现如下: (C中运 ...

  8. Linux工作笔记032---Centos7.3 kill杀掉不用的进程_查看某个进程_某个进程占用的cpu,内存情况

    JAVA技术交流QQ群:170933152 $ kill -s 9 1827 其中-s 9 制定了传递给进程的信号是9,即强制.尽快终止进程. linux查看是否有某个运行的进程命令:例如,查询是否包 ...

  9. 【Linux进程、线程、任务调度】四多核下负载均衡 中断负载均衡,RPS软中断负载均衡 cgroups与CPU资源分群分配 Linux为什么不是硬实时 preempt-rt对Linux实时性的改造

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章(点击链接:点击链接阅读上一篇文章)讲了: CPU/IO消 ...

最新文章

  1. 小蠓虫如何灭_怎么杀蠓虫
  2. 转: 通过Servlet生成验证码图片
  3. tensorflow手册_谷歌TensorFlow开发者认证考试来了!哪些要点需要了解?
  4. 1339: 考试排名
  5. 单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?
  6. XML——流机制解析器
  7. 【面向对象】面向对象的分析与设计概述
  8. 爬虫-01-基础入门-字符串基础知识-节符串与字节转换
  9. Velocity教程 (zhuan)
  10. 计算机网络技术应用和发展,计算机网络技术的应用和发展研究
  11. CAD2016软件安装教程
  12. 希尔伯特空间、欧几里德空间
  13. 2018款联想Y7000 黑苹果外接显示器方案
  14. 大作手操作体系:突破后回调不下箱体可加仓,但是也有失误的时候!
  15. 网易云音乐 ios android 通用,网易云游戏苹果和安卓不通用吗 | 手游网游页游攻略大全...
  16. 字节Java高级岗:java测试开发工程师要求
  17. 三维点云论文——图片常用格式LaTeX排版
  18. DR5加强版2019全新 | PS磨皮插件高端人像后期修图工具
  19. Py2neo安装(未完待续)
  20. 数字验证识别python_Python机器学习!识别图中最难的数字!验证码?验证码是小儿科!-站长资讯中心...

热门文章

  1. Python之通过for循环比较Python与Ruby编程思想的差别
  2. iOS之深入探究CADisplayLink和NSTimer的对比和内存溢出问题
  3. 马斯克认为 AI 必超越并威胁人类,他宁愿搞脑机接口也不碰AI
  4. 拓展阅读 —— G6 坐标系深度解析
  5. 操作ROS松灵机器人步骤及遇到的问题
  6. 【Linux】一步一步学Linux——mtools命令(244)
  7. 【SDL】SDL学习笔记一 SDL的子系统的初始化和退出
  8. 【Linux系统编程】线程同步与互斥:互斥锁
  9. 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
  10. 数据结构-----Trie树