内存疯狂换页!CPU怒批操作系统
内存访问瓶颈
我是CPU一号车间的阿Q,前一阵子我们厂里发生了一件大喜事,老板拉到了一笔投资,准备扩大生产规模。
不过老板挺抠门的,拉到了投资也不给我们涨点工资,就知道让我们拼命干活,压榨我们的劳动力。
老板说了,投资的钱要用来添置设备,招聘新员工,咱们原来就有八个车间了,这一下直接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怒批操作系统的更多相关文章
- C和C++中的volatile、内存屏障和CPU缓存一致性协议MESI
目录 1. 前言2 2. 结论2 3. volatile应用场景3 4. 内存屏障(Memory Barrier)4 5. setjmp和longjmp4 1) 结果1(非优化编译:g++ -g -o ...
- Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)
一.重定位链接时重定位:目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码.当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整.同时,链接器需要对已经解 ...
- Linux Shell查看磁盘分区,内存使用,CPU使用率
Linux Shell查看磁盘分区,内存使用,CPU使用率 #!/bin/bash #disk_used_rate Location=/dev/xvdb Disk_Used_Rate=$(df -h ...
- linux top命令查看内存及多核CPU的使用讲述【转】
转载一下top使用后详细的参数,之前做的笔记找不见了,转载一下,作为以后的使用参考: 原文地址:http://blog.csdn.net/linghao00/article/details/80592 ...
- JVM 调优 内存调优 CPU 使用调优 锁竞争调优 I/O 调优
Twitter 工程师谈 JVM 调优 2016年03月24日 10:22:30 wenniuwuren https://blog.csdn.net/wenniuwuren/article/detai ...
- Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数
1.查看物理CPU的个数 [root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc ...
- Linux内存性能指标、CPU性能指标
内存性能指标 内存基础概念 先执行一下 top 命令,看结果中关于内存的相关部分 # top 其中的 VIRT.RES.SWAP 都是什么呢? 分别是下面的3个概念: 物理内存 Resident - ...
- SQL Server 内存和换页(Paging)
在进程开始执行时,进程首先申请虚拟地址空间VAS(Virtural Address Space),VAS是进程能够访问的地址空间,由于VAS不是真正的物理内存空间,操作系统必须将VAS隐射到物理内存空 ...
- top命令 Linux查看CPU和内存使用情况,cpu监控之一
一.top命令 top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要.但是,它的缺点是会消耗很多系统资源. 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分 ...
随机推荐
- java实现第九届蓝桥杯全排列
全排列 对于某个串,比如:"1234",求它的所有全排列. 并且要求这些全排列一定要按照字母的升序排列. 对于"1234",应该输出(一共4!=24行): 12 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 运行ABP(asp.net core 3.X+Vue)提示'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。
创建ASP.NET Boilerplate,还原数据库和启动客户端 这里就略过,具体参考 ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) ASP.NET Boilerpl ...
- vue之 :model和v-model的区别
v-model通常用于input的双向数据绑定 <input v-model="parentMsg">,也可以实现子组件到父组件数据的双向数据绑定 :model是v-b ...
- [TopCoder]Seatfriends
题目 点这里看题目. 分析 可以想到用 DP 解决. 由于把空位放到状态里面太麻烦了,因此我们单独将 " 组 " 提出来进行 DP . \(f(i,j)\):前\( ...
- Docker_01
目录 1.1 Docker简介 1.1.1 为什么会有Docker的出现? 1.1.2 Docker理念 1.1.3 Docker or 虚拟机? 2.1 Docker安装 3.1 Docker基本使 ...
- (六)logback.xml 配置详解
原文链接:https://www.cnblogs.com/taiyonghai/p/9290641.html,https://blog.csdn.net/A615883576/article/deta ...
- delete语句的基本用法
DELETE FROM tb_courses WHERE course_id=;
- java中HashMap原理?
参考:https://www.cnblogs.com/yuanblog/p/4441017.html(推荐) https://blog.csdn.net/a745233700/article/deta ...
- 《Java并发编程的艺术》 第9章 Java中的线程池
第9章 Java中的线程池 在开发过程中,合理地使用线程池能带来3个好处: 降低资源消耗.通过重复利用已创建的线程 降低线程创建和销毁造成的消耗. 提高响应速度.当任务到达时,任务可以不需要等到线程创 ...