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