内存疯狂换页!CPU怒批操做系统

内存访问瓶颈

我是CPU一号车间的阿Q,前一阵子咱们厂里发生了一件大喜事,老板拉到了一笔投资,准备扩大生产规模。mysql

不过老板挺抠门的,拉到了投资也不给咱们涨点工资,就知道让咱们拼命干活,压榨咱们的劳动力。sql

老板说了,投资的钱要用来添置设备,招聘新员工,我们原来就有八个车间了,这一下直接double,变成了十六个!咱们的工资要是也能double就行了···编程

如今咱们变成了一个16核的CPU啦!跨域

原觉得咱们生产效率也能double,没想到却遇到了新的问题。缓存

咱们CPU里面各个车间访问内存都要经过内存控制器和总线系统,有时候碰到几个车间都要访问内存,就得要竞争。架构

之前咱们八个车间的时候竞争状况还不是很激烈,你们互相谦让一下也就罢了。如今变成了十六个车间都要过独木桥,这竞争一下就激烈了,尤为是咱们这帮老员工基本不会让着新来的,为了此事常常发生不愉快。编程语言

内存访问出现了瓶颈,这性能天然是折损严重。性能

NUMA架构

老板把这一切都看在眼里,私下里找了我、二号车间的虎子还有总线主任开了个小会。优化

“大家几个都是厂里的核心员工,对厂里目前的问题大家怎么看?”,老板问咱们几个。操作系统

我和虎子互相瞅了瞅,都没说话。

这时总线主任开口了:“老板,如今的问题是访问内存的路只有一条,你们都要来挤,不免会发生摩擦,影响工做性能。要想从根本解决问题,最好再建一条路”

“再建一条路,什么意思?”

“我建议把新扩建的那8个车间独立出去,建一个分厂。而后再把内存分一下,让两个厂各管理一部分。一来能够减小新老员工之间的矛盾,二来能够减小你们访问内存拥挤形成的资源浪费。再说了,万一之后继续扩大规模还能够继续用这个办法”,总线主任继续说到。

领导正低头思索,我却是想到了一个问题:“主任,要是咱们一号核执行的线程要访问的内存页面不在咱们厂管理的内存上,在他们分厂怎么办呢?”

“嗯,这样的话,两个厂之间须要通讯,若是访问的内存不在本身管辖的范围,就要互相帮忙传递一下”

老板拍了下桌子:“好主意!就这么办!”

次日,老板召集16个车间的表明,总线主任,还有操做系统那边负责内存管理的负责人小李,一块儿开了一个大会,会上正式经过了新的技术方案。

还给这项技术取了一个名字:NUMA(Non Uniform Memory Access),非一致性内存访问。

现有的16个车间拆分红两个CPU工厂,叫作两个NUMA节点(Node),每一个节点直接链接一部份内存,两个节点之间有专门的的inter-connect通道。各节点直接访问本身管理的内存叫Local Access,经过inter-connect通道访问其余分厂管理的内存叫作Remote Access。很显然,前者的访问速度要比后者快得多,因此这也是这项技术名字的由来:非一致性内存访问。

新的组织架构调整事后,厂里的工做效率提高很多,矛盾摩擦也少了不少,又能够愉快的干活了。

操做系统支持

咱们的组织架构调整了,操做系统那边可忙坏了。为了支持咱们新的架构,操做系统不得不配合着作一些调整。

首先是缓存的问题,操做系统的进程&线程调度管理部门须要注意尽可能不要跨NUMA节点进行调度线程,不能让一个线程一下子在隔壁分厂运行,一下子又在咱们厂运行,这样创建的缓存就失效了。

还有就是内存亲和性的问题了,为了能获得更快的内存访问速度,操做系统的内存管理部门制定了一个内存分配策略,线程在哪一个NUMA节点内执行,那就把内存分配到那个节点直接链接的内存中,避免跨节点的内存访问。

还别说,操做系统这么一优化调整,工做效率真是提高了很多呢。

然而好景不长,就由于这个调整,新的问题又双叒叕出现了~~~

MySQL的问题

最近一段时间,发生了一件怪事,不知道怎么回事,咱们分厂管辖的内存很快耗光了,但隔壁分厂管理的内存还有不少空间。

操做系统不去分配那边的内存页面,却让咱们一个劲的把内存页面swap到硬盘上去,腾挪空间。咱们花了大量时间在这上边,搞得咱们业绩下滑,还比不上隔壁分厂那帮新人。

终于有一天,忍不了了,我伙同厂里几个老家伙,把操做系统内存管理部门的小李又叫来了。

“大家怎么回事,就不能分配隔壁二号节点分厂管辖的内存吗,明明还有那么多空间,却让咱们忙个不停”,我有点生气。

小李满脸无辜的说到:“不瞒大家各位,前几天有人来咱们Linux帝国开设了一家新公司,叫MySQL,这家伙是个吃内存大户啊,一上来就要吃掉几十G,大家厂管辖的内存大半都被它给吃掉了”

虎子问到:“这跟咱们有什么关系,你别推卸责任啊”

“上次我来开会,大家不是搞了个什么NUMA架构吗,访问本地链接的内存要比访问远程内存快一些嘛,因此咱们制定了内存亲和性策略嘛,线程在哪一个NUMA节点执行,就把内存分配到哪一个节点直接链接的内存,想着这样能提高性能嘛”,小李继续委屈的说到。

“那也不能死脑筋啊,访问远程内存虽然比不上访问本地内存快,那也比一个劲的把页面从内存和硬盘上换来换去的强啊,你真是好心办坏事!”

被咱们这样一说,小李也意识到了这样作的问题,“我回去反馈一下你们的意见,调整一下咱们的策略”

过了几天,操做系统那边上了新的内存分配策略,将内存均匀的分配到各个NUMA节点,咱们不再用坑次坑次的把数据从内存和硬盘之间搬来搬去了。

NUMA虽好,可要是用得很差,只会徒增烦恼啊~

彩蛋

Linux帝国最近又来了一家公司,发布了一项工程招标。

“据说了吗,咱们厂竟然没中标”

“怎么可能,除了咱们还有谁干这活”

“据说是一家叫GPU的工厂”

预知后事如何,请关注后续精彩······

往期TOP5文章

CPU明明8个核,网卡为啥拼命折腾一号核?

由于一个跨域请求,我差点丢了饭碗

完了!CPU一味求快出事儿了!

哈希表哪家强?几大编程语言吵起来了!

一个HTTP数据包的奇幻之旅

相关文章
相关标签/搜索