内存访问瓶颈
我是CPU一车间的Q前阵子我们厂发生了一件喜事,老板拿到了一笔投资,扩大了生产规模
但是老板很小气,拿到投资也不给我们涨工资,就知道要我们拼命干,压榨我们的劳动力。
老板说投资的钱要用来购买设备和招聘新员工我们本来有八个车间,直接翻倍变成了十六个!要是我们的工资能翻倍就好了
现在我们变成了16核CPU!
我原以为我们的生产效率可以提高一倍,但是我们遇到了新的问题。
我们CPU中的每个车间都要通过内存控制器和总线系统访问内存有时,当几个车间必须访问内存时,它们必须竞争
以前我们在八车间的时候,竞争不是很激烈,所以也只是谦让的问题现在十六家作坊都要过独木桥,竞争很激烈尤其是我们的老员工基本不会让新人来,经常为这个事情闹得不愉快
内存访问存在瓶颈,这种性能自然严重受损。
NUMA建筑
老板把这一切都看在眼里,私下和我开了个短会,二车间没事和客车主任。
你们都是厂里的核心员工你怎么看待工厂目前存在的问题老板问了我们几个
你我对视,一言不发。
这时,总线主管说话了,老板,现在的问题是,访问内存只有一种方式,大家都要挤,难免会产生摩擦,影响工作性能要从根本上解决问题,最好再修一条路
再建一条路,什么意思。
我建议新扩建的八个车间独立出去,建一个分厂然后分内存,让两家工厂管理一部分一方面可以减少新老员工的矛盾,另一方面可以减少拥挤访问内存造成的资源浪费而且,如果以后继续扩大规模,还可以继续使用这种方式,公交局长继续说道
领导在低头的同时,我居然想到了一个问题:主任,如果我们一号核执行的线程要访问的内存页不在我们厂管理的内存里,那我们在他们分厂怎么办。
嗯,那样的话,两家工厂需要互相沟通如果被访问的内存不在他们的管辖范围内,他们应该互相帮助传递
老板拍桌子:好主意!做就是了!
第二天,老板召集了16个车间的代表,总线总监,还有操作系统那边负责内存管理的代表小李一起开会,会上正式通过了一个新的技术方案。
这项技术也被赋予了一个名字:NUMA,非均匀内存访问。
现有的16个车间分为两个CPU工厂,称为两个NUMA节点,每个节点直接连接到一部分内存,两个节点之间有专用的互连通道每个节点直接访问自己管理的内存称为本地访问,通过互连通道访问其他工厂管理的内存称为远程访问显然前者的访问速度要比后者快得多,所以这也是这项技术名字的由来:非均匀内存访问
新的组织架构调整后,工厂的工作效率提高了很多,冲突和摩擦减少了很多,又可以愉快地工作了。
操作系统支持
我们组织架构调整了,运营系统这么忙为了支持我们的新架构,操作系统必须做出一些调整
首先是缓存的问题,操作系统的进程amp线程调度管理部门要注意尽量不要跨NUMA节点调度线程,不要允许一个线程一会儿在下一个工厂运行,一会儿在我们工厂运行,这样建立的缓存就失效了。
还有就是记忆亲和力的问题为了获得更快的内存访问速度,操作系统的内存管理部门制定了内存分配策略线程在哪个NUMA节点执行,然后将内存分配给直接连接到该节点的内存,以避免跨节点的内存访问
更不用说,操作系统经过优化调整,工作效率真的提高了不少。
可是好景不长。就因为这个调整,新的问题又出现了~ ~ ~
MySQL的问题
最近,发生了一件奇怪的事我不知道发生了什么我们分支管辖的内存很快就用完了,但是下一个分支管理的内存还有很大的空间
操作系统不在那边分配内存页,而是让我们把内存页换到硬盘上腾出空间我们在这上面花了很多时间,导致业绩下滑,比不上隔壁分厂的新人
你怎么了就不能分配隔壁二号节点厂管辖的内存吗空间还是那么大,却让我们忙个不停我有点生气
小李一脸无辜的说:不瞒你说,前几天有人来我们Linux帝国开了一家新公司,叫MySQL这家伙是个吃内存的大户,一上来就要吃几十千兆你们厂管辖的内存大部分都被它吃了
老虎问:这跟我们有什么关系不要推卸责任
我上次来开会的时候,你们不是有一个NUMA建筑吗访问本地内存比访问远程内存更快,因此我们制定了内存亲和策略当线程在哪个NUMA节点执行时,内存就会分配给直接连接到哪个节点的内存,以为这样会提高性能小李继续抱怨
那不可能是死脑筋虽然访问远程内存没有访问本地内存快,但总比不断从内存和硬盘换页要好
经过我们这么一说,小李也意识到了这样做的问题我会回去给大家反馈,调整我们的策略
几天后,操作系统实现了新的内存分配策略,将内存平均分配给所有NUMA节点我们不再需要一次又一次地将数据从内存转移到硬盘
NUMA虽好,但用不好只会徒增烦恼~