浅谈linux性能调优之十七:进程绑定与中断绑定

1.使用taskset设置CPU亲和性
taskset搜索并设定运行进程的CPU亲和性(根据进程ID)。它还可用于启动给定CPU亲和性的进程,这样就可将指定的进程与指定的CPU或者一组CPU捆绑
CPU 亲和性使用位掩码表示。最低位对应第一个逻辑 CPU,且最高位对应最后一个逻辑 CPU。这些掩码一般是十六进制,所以 0x00000001 表明处理器 1,0x00000003 表明处理器 3 。 
要设定运行进程的 CPU 亲和性,请执行如下命令,使用处理器或者您要捆绑到的处理器掩码替换 mask,使用您要更改亲和性的进程的进程 ID 替换 pid。 
# taskset -p mask pid
要启动给定亲和性的进程,请运行如下命令,使用处理器或者您要捆绑的处理器的掩码替换 mask,使用程序、选项以及您要运行的程序参数替换 program。 
# taskset mask -- program
与其将处理器指定为位码,您还可使用 -c 选项提供逗号分开的独立处理器,或者一组处理器列表,相似以下: 
# taskset -c 0,5,7-9 -- myprogram

有关 taskset 的详情请参考 man page:man taskset。 

2.硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下若是有办法把大量硬件中断分配给不一样的 CPU (core) 处理显然能很好的平衡性能。如今的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,若是能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提升总体处理效率。
中断请求(IRQ)是用于服务的请求,在硬件层发出。可以使用专用硬件线路或者跨硬件总线的信息数据包(消息信号中断,MSI)发出中断。 
启用中断后,接收 IRQ 后会提示切换到中断上下文。内核中断调度代码会搜索 IRQ 号码机器关联的注册中断服务路由(ISR)列表,并按顺序调用 ISR。ISR 会确认中断并忽略来自同一 IRQ 的多余中断,而后在延迟的句柄中排队完成中断处理,并忽略之后的中断来结束 ISR。 /proc/interrupts 文件列出每一个 I/O 设备中每一个 CPU 的中断数,每一个 CPU 核处理的中断数,中断类型,以及用逗号分开的注册为接收中断的驱动程序列表。
IRQ 有一个关联的“相似”属性 smp_affinity,该参数能够定义容许为 IRQ 执行 ISR 的 CPU 核。这个属性还用来提升程序性能,方法是为一个或者多个具体 CPU 核分配中断相似性和程序线程相似性。这可以让缓存线可在指定的中断和程序线程之间共享。 
具体 IRQ 数的中断近似性值是保存的相关的 /proc/irq/IRQ_NUMBER/smp_affinity 文件中,您能够做为 root 用户查看并修改该值。保存在这个文件中的值是一个十六进制字节掩码,表明系统中全部 CPU 核。 
例如:要为四核服务器指定以太网驱动程序,首先要肯定与该以太网驱动程序关联的 IRQ 数: 
# grep eth0 /proc/interrupts
32:   0     140      45       850264      PCI-MSI-edge      eth0使用 IRQ 数定位正确的 smp_affinity 文件: 
# cat /proc/irq/32/smp_affinity 
fsmp_affinity 的默认值为 f,便可为系统中任意 CPU 提供 IRQ。将这个值设定为 1,以下,即表示只有 CPU 0 能够提供这个中断: 
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
在网络很是 heavy 的状况下,对于文件服务器、高流量 Web 服务器这样的应用来讲,把不一样的网卡 IRQ 均衡绑定到不一样的 CPU 上将会减轻某个 CPU 的负担,提升多个 CPU 总体处理中断的能力;对于数据库服务器这样的应用来讲,把磁盘控制器绑到一个 CPU、把网卡绑定到另外一个 CPU 将会提升数据库的响应时间、优化性能。合理的根据本身的生产环境和应用的特色来平衡 IRQ 中断有助于提升系统的总体吞吐能力和性能。
注意:在手动绑定 IRQ 到 CPU 以前须要先停掉 irqbalance 这个服务,irqbalance 是个服务进程、是用来自动绑定和平衡 IRQ 的:# /etc/init.d/irqbalance stop
相关文章
相关标签/搜索