NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断

目录:一、NUMA、SMP、MPP介绍

     二、NUMA、SMP下CPU工作方式

      三、CPU Affinity(姻亲关系)

1、硬件级别实现总体资源调度

2、软件级别实现单个进程绑定

3、中断请求的绑定

      四、在调度资源时,CPU的哪些参数需要关注


一、NUMA、SMP、MPP介绍

在优化CPU资源的时候,先明白CPU有哪些架构,不同架构下的优化策略和方法是不一样的。目前商用服务器大体可分为三类,即对称对处理器结构(SMP),非一致存储访问结构(NUMA)、海量并行处理结构(MPP)。
SMP:服务器中多个cpu对称工作,无主次或从属关系。各cpu 共享相同的物理内存,每个cpu访问内存中的任何地址所需时间是相同的。也称为一致存储访问结构。它的 主要特征是共享,cpu、内存、IO都共享。主要问题是扩展能力有限。内存访问冲突,因为内存控制器只有一个。一般2-4个cpu达到最佳性能。
NUMA具有多个cpu模块,每个cpu模块由多个cpu组成, 具有本地内存、IO槽口等。节点之间可互通,每个cpu可以访问整个系统的内存。 开发程序是尽量减少不同cpu模块之间的信息交互(但并不是绝对的,有些应用程序过大,不得不借用其它cpu模块的内存,比如mySQL)。一个物理服务器内可支持上百个cpu。缺点:访问远地内存的延时远大于本地内存,因此性能无法随cpu线性增加。8倍cpu差不多换3倍性能。
MPP,由多个SMP服务器通过一定的节点互联网络进行连接。 完全无共享结构,每个节点只访问自己的本地资源,扩展性最好,目前已实现了512个节点互联,数千个cpu。节点之间的信息交互通过互联网络实现,这个过程称为数据重分配。节点信息交互与节点本身处理是并行的。

二、NUMA、SMP下CPU工作方式

明白架构之后,我们还要明白为什么要优化CPU?这根CPU的工作方式有关: cpu有三级缓存,一级缓存有两个,数据缓存和指令缓存,一级、二级独有,三级缓存共享。
在SMP对称多处理器中,内存是共享的。一个cpu完成一次内存访问要三个时钟周期。1.发出指令给内存控制器; 2.内存控制器寻址并返回给cpu;3.cpu访问内存。 而 内存控制器只有一个,只能处理一个cpu的请求。cpu多了就会产生资源有竞争。因此当请求很多的时候有必要做资源分配。
再说NUMA架构,由于是非一致内存访问:多模块cpu有独享内存,内核会重新平衡队列。平衡时cpu会跨模块访问内存, 访问对方的内存至少需要6个时钟周期。1.先到自己的内存控制器;2.再到对方的内存控制器(这一小步需要三个时钟周期);3.对方的控制器再去寻址并返回;4.cpu拿到地址后去访问。
NUMA服务器应尽可能地保证cpu模块只访问自己的内存(当然这不是绝对的,还要看跑什么应用了)。那么为什么会出现模块间的交叉访问?因为内核会经常平衡进程,导致进程在两个cpu间频繁切换。 而频繁切换cpu是很花时间的,对于有些占内存大的应用来说当cpu切换过去的时候又要重新加载内存,这样效率很低。所以对于某些特繁忙的进程,我们可禁止切换cpu,或着采取将进程绑定到固定cpu上。

三、CPU Affinity

cpu affinity:cpu的姻亲关系。将某些进程启动后绑定到固定cpu(或cpu组或cpu的某个核心)上。从而不会被调用到其他cpu上。但其实有时候平衡进程是有必要的。关键是要找到个平衡点。一般情况,在numa结构,当cpu cache的命中率比较低时可考虑将进程与cpu绑定。(而在SMP架构下这个对性能的提升可能就比较小)

1、硬件级别实现总体资源调度

numa相关的方法:numactl(资源调度) numad(守护进程) numademo(演示) numastat(状态)
numastat -p 查看某个进程的内存分配,如果内存分配是跨节点的,可以考虑绑定进程到固定节点
NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第1张图片

numastat -s (不加就显示所有node情况)
NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第2张图片

参数解释:numa_hit 内存命中次数
numa_miss 内存未命中次数。未命中太多就要考虑绑定了。 一般看看这两个就好
numa_foregin 内存被非本地cpu使用

numactl,cpu策略控制。主要参数:
--cpunodebind=nodes: 把执行的command全部绑到节点上,节点有可能包括多个cpu
--physcpubind=cpus:把执行的进程全部绑定到对应cpu上,cpu号根据/proc.cpuinfo里显示
--membind=nodes:只在对应的节点上分配内存
这是一个全局策略,并不能绑定一个具体的进程,并且开机重启后又没有啦。
http://blog.csdn.net/jollyjumper/article/details/17168175 这篇文章做了性能测试,可参考。

numad,用户空间级的守护进程,可限定监控某些进程,自动分配进程到cpu。
这些都是硬件级别。

2.软件级别实现单个进程绑定

命令taskset:绑定进程到cpu上。先讲一下以掩码的方式表示cpu,很多地方都会用到。
用制掩码mask表示绑定到哪颗cpu上:比如0x0000 0001 表示第0颗cpu, 0x0000 0003表示第0颗cpu和第1颗cpu(转换成二进制,1位表示绑定的cpu,0003转二进制是0011), 再例如,0x0000 0005表示0号和2号cpu(0005转二进制是0101)

#taskset -p mask pid:把某进程绑定到某些cpu上
比如 taskset -p 0x00000003 101 把101进程绑定到0号和1号cpu上。
#taskset -p -c 3 101 把101绑定在第三号cpu上。
这个命令有点不给力,重新开机后会失效,而且因为进程id每次都变,又不能写到脚本里。

cpu虽然绑定了进程,但是仍然会跑其他的进程(因为中断),于是有另一个话题:cpu隔离。
启动操作系统时,在 /etc/grub.conf里传递个参数:isolcpus=cpu number,...,cpu number 表示内核启动后,不会让进程使用这些cpu的。然后开机后再用taskset。

插一句,在nginx里面,可以在配置文件里设置将worker绑定到固定cpu:worker_cpu_affinity=,用的是掩码表示。

3.中断请求的绑定

中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU。 由硬件或软件所发送称为IRQ(中断请求)的信号给CPU, 一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。

相关的信息文件主要有/proc/interrupts 、/proc/stat 、/proc/irq//

/proc/interrupts文件中可查看关于哪些中断正在使用和每个处理器各被中断了多少次的信息。一般 查看中断信息 都看这个。第一列是irq号,第二列以后是cpu及其对应的中断数(具体看你的服务器上有几个cpu),倒数第二列表示中断类型,最后一列表示中断名称。
NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第3张图片

/proc/stat包含了系统内核的统计信息和中断信息。


中断概念不再赘述,详细参考 http://www.linuxidc.com/Linux/2014-03/98012.htm ,本文也有部分引用来自次出处。

文件/proc/irq//smp_affinity中的cpu以掩码表示,中断服务由哪个cpu处理的表示方法同上文是一样的,比如0000 0101表示cpu0、cpu2
处理该irq。所以,要指定中断请求由哪个cpu处理只需要修改这个文件就可以了。
比如:echo 00000101 > /proc/irq//smp_affinity
可在/proc/interrupts中查看中断分布。

四、在调度资源时,CPU的哪些参数需要关注

先关注两个概念:
上下文切换:当一个进程用完时间片或者被更高优先级的进程抢占后,它会备份到CPU的运行队列中,同时其他进程在CPU上运行。这个进程切换的过程被称作上下文切换。过多的上下文切换会造成系统很大的开销。
运行队列:每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。
可以理解为运行队列是并行操作(所以队列长度一般要小于3),上下文切换是并发操作。

查看cpu的命令有很多,常用sar、top、mpstat、iostat、vmstat、dstat、ps等等,很多文章也会单独去讲某个命令的用法,本文就不赘述命令用法了,只讲cpu要做绑定优化时需要注意的参数。
我们会比较关注的有:
sar -q: 采样过去的队列长度和负载平均值
参数:runq-sz:队列长度,每颗cpu最好不要长期超过3, 超过了cpu该升级了。
plist-sz:等待运行的tasks
ldavg-1:一分钟内负载
NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第4张图片

mpstat -P 0:第0号cpu使用率,这个命令看的比较全。irq是硬中断,soft是软中断,steal是虚拟机偷走的资源



cat /proc/stat:cpu中断信息,上文提过

dstat --top-cpu:哪个进程最耗cpu。这个命令很强大,--top参数可以看很多“最消耗”,比如--top-cputimes, --top-mem, --top-io, --top-latency等等,可以组合使用。

NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第5张图片
sar -w:每秒创建的进程数和上下文切换次数

NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第6张图片
ps -e -o psr,pid,cmd:显示进程、命令跑在哪个cpu上。ps本身也可以看某个进程所占cpu使用率和内存使用率。

NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第7张图片
针对进程的分析命令pidstat:
pidstat -u,查看进程、cpu之间的使用情况。
NUMA、SMP架构下的CPU性能调优:姻亲关系、进程绑定与中断_第8张图片

pidstat -p 查看某一进程的使用情况。


有错误的地方或者没说清楚的地方,欢迎雅正!




你可能感兴趣的:(性能优化)