硬件中断发生频繁,是件很消耗 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

21/212>

cpu核心分配给不同进程linux,Linux技巧:多核下绑定硬件/进程到不同CPU相关推荐

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

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

  2. Linux技巧:多核下绑定硬件/进程到不同CPU

    http://www.51testing.com/html/07/n-222407.html 硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同 ...

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

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

  4. linux小技巧--vim下多行注释和取消多行注释

    多行注释: normal模式下,输入ctl+v:visual block模式,按住上下键选中要注释的行,输入大写I:在insert模式下,输入//,最后按esc键. 取消多行注释 normal模式下, ...

  5. linux的进程命令,Linux基础进程命令详解

    进程有关基础命令 一.进程定义 1.进程就是CPU未完成的工作,而且它是其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源. 二.Linux系统进程和一些有关进程的命令 1.ps命令ps   ...

  6. linux删除位于后台的进程组,linux命令(12)-进程与作业管理

    (1)at 在指定时间完成任务 root可以使用这个命令,对于其他用户来说,能否可以使用就取决于两个文件:/etc/at.allow和/etc/at.deny,可以使用是将"用户名" ...

  7. windows下 解决PHP-CGI 进程崩溃502

    PHP是世界上最好的语言,但需要PHP解析器:Apache+php,需要通过mod_php.so和php相连:nginx+php 需要转发给 cgi程序 关于FastCGI: 全称 FastCGI P ...

  8. linux内核如何支持多核cpu,现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)?...

    现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)? 关注:106  答案:2  mip版 解决时间 2021-02-02 01:11 提问者你說.你愛我 ...

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

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

  10. linux多核单进程,Linux的在多核处理器3个处理(每个进程在不同的核心上运行)之间共享存储器/ SMP...

    我想同步三种不同的过程,所以我想使用在进程之间共享内存.所以我从一个进程中分出了两个孩子,并在创建孩子之前创建了共享内存段. 我的意图是在不同的内核中运行子进程和父进程以使其并行执行.所以我使用亲和力 ...

最新文章

  1. 韵乐x5最佳参数手动_诺基亚X5、vivoZ1青春版、海信彩墨屏阅读手机A5C对比
  2. java替换特殊字符串
  3. android 外文期刊_AndroSimilar: Robust signature for detecting variants of Android malware
  4. listview里怎么加按钮_一张照片出现好多分身,这怎么做的?
  5. TiDB 源码阅读系列文章(十六)INSERT 语句详解
  6. 谈谈设计模式的几个原则
  7. 搜索时展示的是名字,传给后端的是id
  8. android手势监听功能吗,Android手势监听 OnGestureListener (短按,长按,慢滑动,快滑动)...
  9. 不会部署并调试SpringBoot源码?一看必会IDEA操作
  10. cmd炫酷代码_基本操作!在VS 代码中如何使用Jupyter Notebook
  11. 数据库 MySQL 之 表操作、存储引擎
  12. monkey命令总结
  13. ArchiSteamFarm(ASF优秀的Steam挂卡工具) V4.0.3.3绿色版
  14. python pytz_python pytz是什么
  15. 必应 Bing 新特性之最新文章, Wolfram|Alpha 整合, 天气搜索等已推出
  16. 利用Vue制作一个简单的走马灯
  17. python 实现多线程下载m3u8格式视频,使用FFmpeg合并(升级修订自s_kangkang_A)
  18. 置信区间、显著性检验和统计学意义
  19. 韩国区块链步入快车道:SM、Kakao、三星、LG等巨头ALL IN
  20. RHEL下编译wireshark源码

热门文章

  1. 老翟书摘:《丰田生产方式》
  2. 2015年8月27日--培训作业是几个练习题
  3. Apache配置访问控制、禁用php解析、rewrite伪静态、限定user_agent
  4. 利用动态图层实现数据的实时显示
  5. Mac Brew Uninstall MySql
  6. EF 4.3 Code-Based Migrations
  7. Mercurial:Hg检出的时候:The system cannot find the path specified
  8. 既然Java反射可以访问和修改私有成员变量,那封装成private还有什么意义
  9. libsvm 参数以及计算测试点相似度
  10. Python 爬虫实例(10)—— 四行代码实现刷 博客园 阅读数量