当前位置:七道奇文章资讯系统安全Linux安全
日期:2012-05-06 00:02:00  来源:本站整理

Linux本领:多核下绑定硬件进程到差别CPU[Linux安全]

赞助商链接



  本文“Linux本领:多核下绑定硬件进程到差别CPU[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

  硬件中止发生频繁,是件很损耗 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[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • windows下的近似linux下的grep号令--findstr
  • linux下mysql链接被防火墙禁止的办理办法
  • Linux下mysql新建账号及权限设置办法
  • SUSE Linux下搭建Web服务器
  • Windows/Linux MySQL忘掉密码重置密码教程
  • Linux下Apache自动监测重启脚本(智能化程度较高)
  • linux备份 linux克隆 linux clone
  • <b>为什么 Linux不需求碎片整理</b>
  • CentOS6 yum搭建Linux+Nginx+PHP+MYSQL(LNMP)
  • Linux系统有效防备ARP攻击
  • Linux下 Memcache的安装和简单管理
  • 笔记本预装linux重装成windows系统
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .