knl 上numactl -m 绑定的内存分配在哪

knl 上numactl -m 绑定的内存分配在哪,第1张

一、CPU

首先从CPU说起。

你仔细检查的话,有些服务器上会有的一个有趣的现象:你cat /proc/cpuinfo时,会发现CPU的频率竟然跟它标称的频率不一样:

#cat /proc/cpuinfo

processor : 5

model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz

cpu MHz : 1200.000

这个是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我们发现第5颗CPU的频率为1.2G。

这是什么原因呢?

这些其实都源于CPU最新的技术:节能模式。操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。这对环保人士和抵制地球变暖来说是一个福音,但是对MySQL来说,可能是一个灾难。

为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好,更彻底。由于各种BIOS类型的区别,设置为CPU为最大性能模式千差万别,我们这里就不具体展示怎么设置了。

然后我们看看内存方面,我们有哪些可以优化的。

i) 我们先看看numa

非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 也是最新的内存管理技术。它和对称多处理器结构 (SMP : Symmetric Multi-Processor) 是对应的。简单的队别如下:

如图所示,详细的NUMA信息我们这里不介绍了。但是我们可以直观的看到:SMP访问内存的都是代价都是一样的但是在NUMA架构下,本地内存的访问和非 本地内存的访问代价是不一样的。对应的根据这个特性,操作系统上,我们可以设置进程的内存分配方式。目前支持的方式包括:

--interleave=nodes

--membind=nodes

--cpunodebind=nodes

--physcpubind=cpus

--localalloc

--preferred=node

简而言之,就是说,你可以指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非 是设置为--interleave=nodes轮询分配方式,即内存可以在任意NUMA节点上分配这种方式以外。其他的方式就算其他NUMA节点上还有内 存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来获得内存。有经验的系统管理员或者DBA都知道SWAP导致的数据库性能 下降有多么坑爹。

所以最简单的方法,还是关闭掉这个特性。

关闭特性的方法,分别有:可以从BIOS,操作系统,启动进程时临时关闭这个特性。

a) 由于各种BIOS类型的区别,如何关闭NUMA千差万别,我们这里就不具体展示怎么设置了。

b) 在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:

kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM numa=off

另外可以设置 vm.zone_reclaim_mode=0尽量回收内存。

c) 启动MySQL的时候,关闭NUMA特性:

numactl --interleave=all mysqld

当然,最好的方式是在BIOS中关闭。

ii) 我们再看看vm.swappiness。

vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。

具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive 内存交换出去,还是释放数据的cache。cache中缓存着从磁盘读出来的数据,根据程序的局部性原理,这些数据有可能在接下来又要被读 取inactive 内存顾名思义,就是那些被应用程序映射着,但是 长时间 不用的内存。

我们可以利用vmstat看到inactive的内存的数量:

#vmstat -an 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r b swpd free inact active si so bi bo in cs us sy id wa st

1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0

0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0

0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0

0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0

通过/proc/meminfo 你可以看到更详细的信息:

#cat /proc/meminfo | grep -i inact

Inactive: 326972 kB

Inactive(anon): 248 kB

Inactive(file): 326724 kB

这里我们对不活跃inactive内存进一步深入讨论。 Linux中,内存可能处于三种状态:free,active和inactive。众所周知,Linux Kernel在内部维护了很多LRU列表用来管理内存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用来管理匿名页,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用来管理page caches页缓存。系统内核会根据内存页的访问情况,不定时的将活跃active内存被移到inactive列表中,这些inactive的内存可以被 交换到swap中去。

一般来说,MySQL,特别是InnoDB管理内存缓存,它占用的内存比较多,不经常访问的内存也会不少,这些内存如果被Linux错误的交换出去了,将 浪费很多CPU和IO资源。 InnoDB自己管理缓存,cache的文件数据来说占用了内存,对InnoDB几乎没有任何好处。

所以,我们在MySQL的服务器上最好设置vm.swappiness=0。

我们可以通过在sysctl.conf中添加一行:

echo vm.swappiness = 0 /etc/sysctl.conf

并使用sysctl -p来使得该参数生效。

三、文件系统

最后,我们看一下文件系统的优化

i) 我们建议在文件系统的mount参数上加上noatime,nobarrier两个选项。

用noatime mount的话,文件系统在程序访问对应的文件或者文件夹时,不会更新对应的access time。一般来说,Linux会给文件记录了三个时间,change time, modify time和access time。

我们可以通过stat来查看文件的三个时间:

stat libnids-1.16.tar.gz

File: `libnids-1.16.tar.gz'

Size: 72309 Blocks: 152 IO Block: 4096 regular file

Device: 302h/770d Inode: 4113144 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access : 2008-05-27 15:13:03.000000000 +0800

Modify: 2004-03-10 12:25:09.000000000 +0800

Change: 2008-05-27 14:18:18.000000000 +0800

其中access time指文件最后一次被读取的时间,modify time指的是文件的文本内容最后发生变化的时间,change time指的是文件的inode最后发生变化(比如位置、用户属性、组属性等)的时间。一般来说,文件都是读多写少,而且我们也很少关心某一个文件最近什 么时间被访问了。

所以,我们建议采用noatime选项,这样文件系统不记录access time,避免浪费资源。

现在的很多文件系统会在数据提交时强制底层设备刷新cache,避免数据丢失,称之为write barriers。但是,其实我们数据库服务器底层存储设备要么采用RAID卡,RAID卡本身的电池可以掉电保护要么采用Flash卡,它也有自我保 护机制,保证数据不会丢失。所以我们可以安全的使用nobarrier挂载文件系统。设置方法如下:

对于ext3, ext4和 reiserfs文件系统可以在mount时指定barrier=0对于xfs可以指定nobarrier选项。

ii) 文件系统上还有一个提高IO的优化万能钥匙,那就是deadline。

在 Flash技术之前,我们都是使用机械磁盘存储数据的,机械磁盘的寻道时间是影响它速度的最重要因素,直接导致它的每秒可做的IO(IOPS)非常有限, 为了尽量排序和合并多个请求,以达到一次寻道能够满足多次IO请求的目的,Linux文件系统设计了多种IO调度策略,已适用各种场景和存储设备。

Linux的IO调度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP。每种调度策略的详细调度方式我们这里不详细描述,这里我们主要介绍CFQ和Deadline,CFQ是Linux内 核2.6.18之后的默认调度策略,它声称对每一个 IO 请求都是公平的,这种调度策略对大部分应用都是适用的。但是如果数据库有两个请求,一个请求3次IO,一个请求10000次IO,由于绝对公平,3次IO 的这个请求都需要跟其他10000个IO请求竞争,可能要等待上千个IO完成才能返回,导致它的响应时间非常慢。并且如果在处理的过程中,又有很多IO请 求陆续发送过来,部分IO请求甚至可能一直无法得到调度被 饿死 。而deadline兼顾到一个请求不会在队列中等待太久导致饿死,对数据库这种应用来 说更加适用。

实时设置,我们可以通过

echo deadline /sys/block/sda/queue/scheduler

来将sda的调度策略设置为deadline。

我们也可以直接在/etc/grub.conf的kernel行最后添加elevator=deadline来永久生效。

CPU方面:

关闭电源保护模式

内存:

vm.swappiness = 0

关闭numa

文件系统:

用noatime,nobarrier挂载系统

IO调度策略修改为deadline。

这东西是美国人发明的,1971年英特尔推出4004的时候,中国人还在以阶级斗争为纲呢。。。

等这个东西形成产业链了,你再想插进去就很难了,X86系列授权就那么几家公司有,没有X86专利授权你的CPU连微软操作系统都跑不了,虽说微软不是唯一,但微软是绝对主角,软件基本都基于这个系统来写,用别的操作系统你想用的软件很可能会不支持。

另外,CPU架构,工艺,这些东西都需要大量人才和巨额研发投入支持,英特尔一年就为此烧掉100亿还特么是美元,龙芯那?订单要是能过5亿那都得喜大普奔,这还是人民币订单。可想而知龙芯的处境有多艰难,一路走来非常不容易,处处艰难险阻,如履薄冰能活着本身就是个奇迹了。

而且,CPU背后的王——光刻机,欧美国家也是对华禁运,没有好的设备,你拿毛做好CPU,好比你让国家特级厨师去给你炒个鸡蛋西红柿,这菜对于这种级别的厨师来说是闭着眼用脚炒都能玩儿的很好吧。但你不给他鸡蛋也不给他西红柿,甚至连锅都不给,他能给你变出一盘菜来吗?中国浪费了太多的时间了,所以很多方面处处受人钳制,你现在想从别人的嘴里抢吃的,这谈何容易。

一直一来,缺芯少魂一直是中国信息产业的心病,中国的CPU市场也一直被Intel、ARM等国外厂商垄断,龙芯、申威、飞腾等国产CPU在社会上也往往遭到别有用心之徒诸如“打磨芯片”、“骗经费”、“政绩工程”等舆论抨击。不久前,采用申威26010的神威太湖之光在TOP500刷榜,飞腾也公布了采用ARM指令集的飞腾1500A和飞腾2000,龙芯的3A3000也顺利完成流片,那么这些国产CPU的性能到底如何呢?

如何评价CPU

如何评价CPU的性能呢?从体系结构的角度来看,有个指标叫MIPS,即每分钟执行多少条指令,执行指令数量越多,性能就越好,但这存在一个问题,当CPU指令集不同的时候,比较MIPS就意义不大了——比如A一条指令只算一个加法,B一条指令能做一个1024点的FFT。特别是在不同指令集的情况下,如何评价CPU的性能呢?

评价CPU性能必须考虑应用的多样性,比如科学运算重视双精浮点性能,但是如果数据供不上,运算能力再强也没用;比如PC日常使用更偏重于定点性能;再比如计算中心多任务环境关注的是吞吐率......因此单纯用某一个指标来衡量CPU性能是不科学的,必须综合考量。

业界也推出了很多基准测试程序,比如针对CPU的SPEC,针对嵌入式应用的EEMBC等。SPEC测试是比较权威的测试程序。和一些黑箱测试程序调整计分方式和计分权重后测试结果就发生变化不同,SPEC测试到底跑了什么程序,以及各项程序跑分和计分方式全部公开透明,而且覆盖范围广——SPEC2000有12个定点程序,14个浮点程序,而且有比较强的代表性,比如gzip、vpr、gcc、mef、eon等。而SPEC2006则把定点程序扩展到14个定点程序和16个浮点程序。

在计分方法上,SPEC在计分上采用归一化的几何平均方法来进行综合性能评估——将不同CPU的执行时间与参照对象相比较后得到一个相对值。SEPC2000的参照对象是Ultra SPARC 2工作站的主频为300Mhz的CPU。如果运行测试程序1的时间是参照对象的十分之一的话,测试就是1000分,测试程序2的耗时是参照对象的八分之一的话,则为800分.....最后再算几何平均——比如SEPC2000有12个定点测试,就将12个测试成绩相乘再开12次方,SPEC2006相对于SPEC2000而言仅仅是扩展了几项测试程序,使测试更加科学合理。这里,我们以三星猎户座7420和华为麒麟950为例计算SPEC测试成绩。

以上为两款芯片的跑分成绩,由于两款SOC均是购买ARM的IP授权做集成的产物,猎户座7420的成绩其实是ARM Crotex A57的成绩,华为麒麟950则是ARM Crotex A72的成绩,将12个子项相乘再开12次方后,得到ARM Crotex A57在2.1G主频时定点测试成绩为1376分,换算一下就是655/G,ARM Crotex A72的定点成绩则为749/G。

不过SPEC也非尽善尽美,测试存在容易受编译器影响的问题。举例来说,SUN曾经通过编译器优化提升SPEC跑分50%,龙芯的某一代产品也曾用自主研发的LCC编译器,比使用GCC定点跑分提升了60%。另外,即便同样是GCC编译器,不同版本的GCC编译器下,测试成绩也会有很大差异。笔者认为,出现这种现象的根源并非SPEC测试的缺陷,反而用事实说明了,最后的用户体验是软件+硬件的结果,充分说明了软硬件磨合的重要性。

可能有的读者对不明白什么是编译器,在此说明一下,程序员在编程的时候写的是编程语言,但是计算机运行的时候是机器语言,编译器就是将程序员的编程语言翻译成机器语言的工具。

龙芯、飞腾、申威和Intel的比较

现在,我们先就龙芯和飞腾的桌面芯片与Intel的CPU做比较。由于桌面芯片更加注重单线程性能——单核性能是基础,很多程序都依赖单进程的处理速度,如果单核性能上不去,核心数再多也没用,这也是AMD 六核、八核芯片打不赢Intel 四核芯片的原因。另外,对于桌面芯片来说,日常使用中更加倚重定点性能。因此,在这里我们以单线程实际测试的定点成绩做比较。

在编译器为GCC5.2的情况下,Intel I5 4460在3.2G主频下SPEC2006的定点成绩为32分;在编译器为GCC4.4.7的情况下,龙芯3A3000在1.5G主频下的定点成绩为11分;在编译器为GCC4.8的情况下,飞腾1500A在1.8G主频的定点成绩为10分。诚然Intel在编译器上占有一定优势,这里为了方便比较就忽略编译器带来的差异了,就定点性能而已,龙芯3A3000和飞腾1500A的单线程性能大约为Intel I5 4460的三分之一。

差距在哪里呢?主要是在主频上,其次在微结构。龙芯3A3000的主频只有1.5G,飞腾1500A的主频只有1.8G,而Intel I5 4460的主频达3.2G,而且如果需要的话,还能睿频到3.4G,很显然,在主频上龙芯3A3000只有Intel I5 4460的一半不到,而飞腾1500A也只有Intel I5 4460的一半多一点。

微结构也就是常说的CPU核,在主频相同的情况下,两款CPU的性能差异取决于微结构的差异,像龙芯GS464E、Intel的Haswell、ARM的Crotex A72都是微结构。龙芯3A3000在1G主频时,SPEC2006测试定点成绩为7.3,飞腾1500A主频为1G时,SPEC2006测试定点成绩为5.5,而I5 4460在1G主频时的定点成绩为10。可以说,龙芯的GS464E大约有Intel的Haswell性能的73%,而飞腾的FTC660大约是Intel的Haswell性能的55%。

那么如何提升主频和微结构呢?提升微结构需要在指令分支预测,寄存器重命名,多指令通路,乱序发射,功能部件,访存性能等方面做文章,目的是使整个的指令流水的效率尽可能高,因为如果有一个环节设计不好或不匹配的话,整个系统效率就发挥不出来,这是CPU的核心技术。提升主频很大程度上要依赖后端设计能力,也就是要指物理层电路的具体优化,包括单元布局、时序优化等放方面下苦功。

接下来就国产服务器CPU与Intel的服务器CPU做比较,以国产服务器CPU中多线程性能最强的飞腾2000为例。在编译器为GCC4.8的情况下,飞腾2000在2G主频的单线程SPEC2006测试成绩为定点12.4,浮点11.3,换算一下飞腾2000的CPU核FTC661的定点成绩为6.2/G,和Intel Haswell 10/G的成绩依旧有不小的差距,由于飞腾2000为64核芯片,在单线程性能相对有限的情况下,依靠核心数量的优势,FT2000的多线程SPEC2006测试成绩为定点570,浮点482,全芯片性能与Intel Xeon E5-2695v3相当,这是非常了不起的成绩。

由于科学计算倚重双精浮点性能,超算芯片的比较中就以双精浮点性能为指标进行,申威26010的双精浮点性能为3T,和Intel目前最好的超算芯片KNL相当,更难人可贵的是这是在制造工艺与Intel相差2代的情况下取得的成绩,这充分体现出申威26010在设计思想上的先进性。

结语

在桌面芯片上,龙芯和飞腾目前最好的桌面四核芯片的单线程定点测试成绩大约为Intel I5 4460的三分之一,虽然和Intel的差距依旧比较大,但目前龙芯和飞腾还没有大型游戏等对CPU性能要求较高的软件应用,现在的性能对于绝大多数应用来说都是够用的,特别是对党政军办公电脑和一体机,龙芯3A3000和飞腾1500A的性能已经属于性能过剩了,只要软件跟得上,在党政军领域能替换Intel的CPU。

在服务器CPU上,飞腾2000虽然在单线程性能上和Intel有一定差距,但其全芯片性能颇为不俗,能与Intel Xeon E5-2695v3相当,已经是全球全芯片性能最强的ARM服务器CPU,如果ARM等国外厂商能完善其服务器CPU的软件生态,飞腾则有可能借着ARM的生态一飞冲天。

在超算芯片上,申威26010完全可以和Intel最好的加速器KNL硬碰硬的较量。

出品:科普中国

制作:铁流

监制:中国科学院计算机网络信息中心

“科普中国”是中国科协携同社会各方利用信息化手段开展科学传播的科学权威品牌。

本文由科普中国融合创作出品,转载请注明出处。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/139595.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-18
下一篇2023-03-18

发表评论

登录后才能评论

评论列表(0条)

    保存