为了这个技术,操作系统把 CPU 害惨了!

来源 | 编程技术宇宙

责编 | Carol

封图 | CSDN 下载自视觉中国

内存访问瓶颈

我是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的工厂”

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

推荐阅读
  • 浅谈分布式存储中的网络通信

  • 138 张图带你 MySQL 入门!

  • 如何在 Kubernetes 上配置 Jenkins?

  • 突发!印度封禁抖音、微信、快手等 59 款中国 App

  • 厉害!国内大学生计算机编程第一人,一人挑战一个队,百度最年轻 T10,现创业自动驾驶

  • Balancer因通缩代币STA遭遇闪电贷攻击,价值50万美元资产被黑

  • 浅谈分布式存储中的网络通信

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个周内上线50个增长策略,竟然能这么高效!

导读:年初的一个晨会上,用户增长负责人湘翁问我说:一个周内上线50个增长策略,技术兄弟们能做到么? 在闲鱼用户增长业务上的实验 闲鱼的用户增长业务具有如下现状: 闲鱼的卖家都是普通小卖家,而…

cannot convert value of type ‘org.codehaus.xfire.spring.editors.ServiceFactoryEditor

文章目录一、分析定位1.异常现象2. 分析定位二、解决方案2.1.找坐标2.3. 找jar包2.3. 打开jar包2.4. 找目录2.5. 编辑customEditors.xml一、分析定位 1.异常现象 cannot convert value of type ‘org.codehaus.xfire.spring.editors.ServiceFactoryEditor 2. 分析定位 原因…

网商银行首席架构师余锋:网商银行的每一笔贷款都是AI贷款

11月28日,在2019年度观察家金融峰会上,网商银行首席架构师余锋表示,网商银行在人工智能领域一直在探索新的应用方向,目前网商银行的每一笔贷款都是AI贷款。 网商银行是国内首家运行在云上的银行,没有线下网点&#xf…

解密 云HBase时序引擎OpenTSDB 优化技术

逝者如斯夫,不舍昼夜。 —— 孔子 时间如流水,一去不复返。自古不乏对时间流逝的感慨,而现代已经有很多技术记录流逝的过去。我们可以拍照,可以录像,当然还可…

官宣!CSDN 重磅发布「AI开源贡献奖Top5」「AI新锐公司奖Top10」「AI优秀案例奖Top30」三大榜单...

2020 年无疑是特殊的一年,AI 在开年的这场“战疫”中表现出惊人的力量。站在“新十年”的起点上,CSDN发起【百万人学AI】评选活动。我们继续聚焦AI的技术落地,关注开源和新生的力量。作为CSDN第三届AI评选活动,本次活动受到数百家…

SpringBoot2 整合 XFIRE 服务端和客户端

文章目录一、集成XFIRE1. 版本选型2. 导入依赖3. 注入XFireSpringServlet4. 创建一个xml文件5. 使用ImportResource注入xml6. 创建WebService接口6. 创建实现类7. 添加配置类8. 工具类二、XFIRE 发布服务2.1. 运行项目2.2. 异常解决2.3. 测试验证三、XFIRE客户端开源源码.一、集…

css3动画过渡按钮

css(css代码是网上找的)和html代码: .mui-switch {width: 52px;height: 31px;position: relative;border: 1px solid #dfdfdf;background-color: #fdfdfd;box-shadow: #dfdfdf 0 0 0 0 inset;border-radius: 20px;border-top-left-radius: 20px;border-top-right-ra…

阿里云上万个 Kubernetes 集群大规模管理实践

内容简介: 阿里云容器服务从2015年上线后,一路伴随并支撑双十一发展。在2019年的双十一中,容器服务ACK除了支撑集团内部核心系统容器化上云和阿里云的云产品本身,也将阿里多年的大规模容器技术以产品化的能力输出给众多围绕双十一…

SpringBoot2 整合 AXIS 服务端和客户端

文章目录一、服务端1. 版本选型2.导入依赖3. SERVLET4. 接口5.实现类6. 配置工厂7.启动类8. WEB-INF目录18. WEB-INF目录29. /目录19. /目录210. wsdd11. 测试验证二、客户端开源源码.一、服务端 1. 版本选型 阿健/框架版本spring-boot2.5.4axis1.4axis-jaxrpc1.4commons-dis…

地理文本处理技术在高德的演进(下)

在【上篇】里,我们介绍了地理文本处理技术在高德的整体演进,选取了几个通用query分析的点进行了介绍。下篇中,我们会选取几个地图搜索文本处理中特有的文本分析技术做出分析,包括城市分析,wherewhat分析,路…

真正拿大厂offer的人,都赢在这一点

学好一门技术最有价值的体现就是“面试”,对于大部分人来说 “面试”是涨薪的主要途径之一,因此我们需要认真的准备面试,因为它直接决定着你今后几年内的薪资水平,所以在面试这件事上花费再多的时间和精力都是值得的。你会发现有…

今天的这个小成绩,需要向阿里云的朋友报告一下!

今天,想向大家报告一个最新的小成绩: 在数据库领域的权威评选——Gartner全球数据库魔力象限评比中,阿里云成功进入“挑战者”象限,连续两年作为唯一的中国企业入选。 最新评选表明,阿里云过去一年在产品技术领域进展迅…

90%的人会遇到性能问题,如何用1行代码快速定位?

阿里妹导读:在《如何回答性能优化的问题,才能打动阿里面试官?》中,主要是介绍了应用常见性能瓶颈点的分布,及如何初判若干指标是否出现了异常。 今天,齐光将会基于之前列举的众多指标,给出一些常…

SpringBoot2 整合 CXF 服务端和客户端

文章目录一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码.一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></propertie…

如果张东升是个程序员,你还有机会吗?

来源 | 编程技术宇宙责编 | Carol封图 | CSDN 下载自视觉中国张东升是一家互联网公司的程序员&#xff0c;一直以来都勤勤恳恳老实工作。可最近一段时间&#xff0c;老板接了几个项目回来&#xff0c;不但开启了996的工作模式&#xff0c;更要命的是频频更改需求&#xff0c;弄…

蚂蚁金服资深总监韩鸿源:企业级数据库平台的持续与创新

2019年11月19日&#xff0c;蚂蚁金服在北京举办“巅峰洞见聚焦金融新技术”发布会&#xff0c;介绍2019双11支付宝背后的技术&#xff0c;并重磅发布全新OceanBase 2.2版本。欢迎持续关注&#xff5e; 蚂蚁金服研究员韩鸿源在发布会分享了《企业级数据库平台的持续与创新》&…

jquery标题左右移动动画

标题会在红框范围内来回移动 html和css代码 <div class"menu-notice" click"check_cart"><div class"menu-notice-logo"></div><div class"menu-notice-title" ref"noticeTitle">{{storeinfo[0] ?…

解密 云HBase 冷热分离技术原理

前言 HBase是当下流行的一款海量数据存储的分布式数据库。往往海量数据存储会涉及到一个成本问题&#xff0c;如何降低成本。常见的方案就是通过冷热分离来治理数据。冷数据可以用更高的压缩比算法&#xff08;ZSTD&#xff09;&#xff0c;更低副本数算法&#xff08;Erasure…

再见,工资!2020年6月程序员工资统计,平均14404元,网友:又跌了!

见了鬼&#xff01;工资竟然又跌了2020 年 6 月全国招收程序员 313739 人。2020 年 6 月全国程序员平均工资 14404 元&#xff0c;工资中位数 12500 元&#xff0c;其中 95% 的人的工资介于 5250 元到 35000 元。怪不得小陈发现最近猎头的“骚扰”电话越来越少了&#xff0c;这…

mysql创建function 报错误1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in

解决方法&#xff1a; 执行这条sql就可以了&#xff1a; set global log_bin_trust_function_creators1;运行结果&#xff1a; 函数创建成功了