https://www.yisu.com/news/id_412.html
从系统的体系架构来看,目前的商用服务器大体上可以分为3类:SMP(对称多处理器)结构、NUMA(非一致存储访问)结构和MPP(海量并行处理)结构。这3类系统体系架构的服务器,它们具体的特征描述如下:
一、 SMP(Symmetric Multi-Processor)
所谓“对称多处理器”结构,是指服务器中多个CPU对称工作,无主次或从属关系。各CPU共享相同的物理内存,每个CPU访问内存中的任何地址所需时间是相同的,因此SMP也被称为“一致存储器访问”结构(UMA:Uniform Memory Access)。对SMP服务器进行扩展的方式,包括增加内存、使用更快的CPU、增加CPU、扩充I/O(槽口数与总线数),以及添加更多的外部设备(通常是磁盘存储)。
SMP服务器的主要特征是“共享”,系统中所有资源(CPU、内存、I/O等)都是共享的。也正是由于这种特征,导致了SMP服务器的主要问题,那就是它的扩展能力非常有限。对于SMP服务器而言,每一个共享的环节都可能造成SMP服务器扩展时的瓶颈,而最受限制的则是内存。由于每个CPU必须通过相同的内存总线访问相同的内存资源,因此随着CPU数量的增加,内存访问冲突也将随之增加,最终会造成CPU资源的浪费,使得CPU性能的有效性大大降低。实验证明,SMP服务器CPU利用率最好的情况是2至4个CPU。
二、NUMA(Non-Uniform Memory Access)
由于SMP服务器在扩展能力上的限制,人们开始探究如何进行有效地扩展从而构建大型系统的技术,NUMA(非一致存储访问)就是这种努力下的结果之一。利用NUMA(非一致存储访问)技术,可以把几十个CPU,甚至上百个CPU组合在一个服务器内。它的CPU模块结构如下图所示:
NUMA服务器的基本特征是,具有多个CPU模块,每个CPU模块由多个CPU(例如4个)组成,并且具有独立的本地内存、I/O槽口等。由于其节点之间可以通过互联模块进行连接和信息交互,因此每个CPU都可以访问整个系统的内存。显然,访问本地内存的速度,将远远快于访问远地内存(系统内其它节点的内存)的速度,这也是“NUMA(非一致存储访问)”的由来。由于它的这个特点,为了更好地发挥系统性能,开发应用程序时需要尽量减少不同CPU模块之间的信息交互。利用NUMA(非一致存储访问)技术,可以较好地解决原来SMP系统的扩展问题,在一个物理服务器内可以支持上百个CPU。
但NUMA(非一致存储访问)技术同样具有一定的缺陷,由于访问远地内存的延时,远远超过本地内存,因此当CPU数量增加时,系统性能无法线性增加。例如惠普公司发布Superdome(超级穹顶)服务器时,曾公布了这款服务器与惠普其它UNIX服务器的“相对性能值”,结果发现,64路CPU的Superdome服务器 (NUMA结构)的相对性能值是20,而8路N4000服务器(SMP结构)的相对性能值是6.3。从这个结果可以看到,8倍数量的CPU换来的只是3倍性能的提升。
三、 MPP(Massive Parallel Processing)
和NUMA(非一致存储访问)不同,MPP(海量并行处理)提供了另外一种进行系统扩展的方式,MPP(海量并行处理)由多个SMP服务器通过一定的节点互联网络进行连接,协同工作,完成相同的任务,从用户的角度来看是一个服务器系统。
MPP服务器基本特征是,由多个SMP服务器(每个SMP服务器称为一个“节点”)通过节点互联网络连接而成,每个节点只访问自己的本地资源(内存、存储等),是一种“完全无共享/零共享”结构,因而扩展能力最好,理论上其扩展无限制,目前的技术可实现512个节点的互联,数千个CPU。
在MPP(海量并行处理)系统中,每个SMP(对称多处理器)节点也可以运行自己的操作系统、数据库等。但和NUMA(非一致存储访问)不同的是,MPP(海量并行处理)系统不存在“异地内存访问”的问题。换言之,每个节点内的CPU,都不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为“数据重分配”。
MPP服务器需要一种复杂的机制来调度和平衡各个节点的负载和并行处理过程。目前一些基于MPP(海量并行处理)技术的服务器,往往通过系统级软件(如:数据库)来屏蔽这种复杂性。举例来说,NCR的Teradata就是基于MPP(海量并行处理)技术的一个关系数据库软件,基于此数据库来开发应用时,不管后台服务器由多少个节点组成,开发人员所面对的都是同一个数据库系统,而不需要考虑如何调度其中某几个节点的负载。
四、 NUMA(非一致存储访问)与MPP(海量并行处理)的区别
从系统架构来看,NUMA(非一致存储)与MPP(海量并行处理)具有许多相似之处:它们都由多个节点组成,每个节点都具有自己的CPU、内存、I/O,节点之间都可以通过节点互联机制进行信息交互。那么它们的区别在哪里?通过下面分析NUMA(非一致存储访问)和MPP(海量并行处理)服务器的内部架构和工作原理不难发现两者的差异所在。
1、首先是节点互联机制不同,NUMA(非一致存储访问)的节点互联机制是在同一个物理服务器内部实现的,当某个CPU需要进行远地内存访问时,它必须等待,这也是NUMA服务器无法实现CPU增加时,性能线性扩展的主要原因。而MPP(海量并行处理)的节点互联机制,是在不同的SMP服务器外部通过I/O实现的,每个节点只访问本地内存和存储,节点之间的信息交互与节点本身的处理是并行进行的。因此MPP(海量并行处理)在增加节点时,性能基本上可以实现线性扩展。
2、其次是内存访问机制不同。在NUMA服务器内部,任何一个CPU都可以访问整个系统的内存,但远地内存访问的性能,远远低于本地内存访问,因此在开发应用程序时应该尽量避免远地内存访问。而在MPP服务器中,每个节点只访问本地内存,不存在远地内存访问的问题。
亿速云,作为一家拥有丰富行业积淀的专业云计算服务提供商、云安全服务提供商,致力于为广大用户提供的“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器”等云主机租用服务,具有安全稳定、简单易用、高可用性、高性价比的特点与优势,专为广大企业上云打造定制,能够满足企业用户丰富、多元化的应用场景需求。
目录:一、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 <PID>查看某个进程的内存分配,如果内存分配是跨节点的,可以考虑绑定进程到固定节点
numastat -s <node>(不加就显示所有node情况)
参数解释: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=<cpu_mask>,用的是掩码表示。
3.中断请求的绑定
中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU。由硬件或软件所发送称为IRQ(中断请求)的信号给CPU,一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。
相关的信息文件主要有/proc/interrupts 、/proc/stat 、/proc/irq/<irq_num>/
/proc/interrupts文件中可查看关于哪些中断正在使用和每个处理器各被中断了多少次的信息。一般查看中断信息都看这个。第一列是irq号,第二列以后是cpu及其对应的中断数(具体看你的服务器上有几个cpu),倒数第二列表示中断类型,最后一列表示中断名称。
/proc/stat包含了系统内核的统计信息和中断信息。
中断概念不再赘述,详细参考http://www.linuxidc.com/Linux/2014-03/98012.htm,本文也有部分引用来自次出处。
文件/proc/irq/<irq_num>/smp_affinity中的cpu以掩码表示,中断服务由哪个cpu处理的表示方法同上文是一样的,比如0000 0101表示cpu0、cpu2
处理该irq。所以,要指定中断请求由哪个cpu处理只需要修改这个文件就可以了。
比如:echo 00000101 > /proc/irq/<irq_number>/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:一分钟内负载
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等等,可以组合使用。
sar -w:每秒创建的进程数和上下文切换次数
ps -e -o psr,pid,cmd:显示进程、命令跑在哪个cpu上。ps本身也可以看某个进程所占cpu使用率和内存使用率。
针对进程的分析命令pidstat:
pidstat -u,查看进程、cpu之间的使用情况。
pidstat -p <pid> 查看某一进程的使用情况。
有错误的地方或者没说清楚的地方,欢迎雅正!
————————————————
版权声明:本文为CSDN博主「东风不枉」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_20415509/article/details/60581015
本文来自博客园,作者:{e_shannon},转载请注明原文链接:https://www.cnblogs.com/e-shannon/articles/12425434.html