最近终于抽空把内存篇更新完了,我分享出来的这些问题,其实都是我之前没有搞的特别明白的困惑。刚刚开始的时候,可能就是在我脑子里蹦出的一个疑问,比如内存随机IO会比顺序IO慢吗? 为了解开这个疑惑,我曾经在网上各种搜索,也去到过国家图书馆翻书,动手搞代码进行性能测试。最终总算是给了自己一个相对比较满意的答案,终于在今年我抽空给大家分享了出来。

在这个解惑过程中,我越来越深地感受到国内的技术圈的特点。那就是特别热衷于应用层的技术,特别喜欢谈一些新的概念,比如你去一个技术峰会看看,都是各种高大上的概念,不拽几个时髦的名词出来都生怕别人不知道自己技术实力。 这些本身倒没有错,我想说的是大家好像普遍对于底层的一些基础能力不太重视,当我真正想搜寻一些最基础的硬件、Linux内核相关的内容时,发现资料太少,不是很容易获取到。

我是觉得作为一个技术人应该先去扎扎实实的磨练自己底层的知识。这就好比一个武林新人想要成为盖世大侠的话,必须先修炼的是自己的内功,外功呢也重要,不过优先级应该在内功之后。 只有你具备极其深厚的内功,你学习各种新技术,理解各种新概念才能够得心应手。这也是我把我的这些分享命名成《开发者内功修炼》的原因。修建一栋大楼肯定也是从挖地基开始,没见过那栋百米高楼是直接平地开始建的。

按照惯例,再对内存篇所有相关的文章进行一下总结。

第一部分、物理篇

在这一部分里,分享的三篇文中主要集中在对内存的物理构成理解上。

1.《带你深入理解内存对齐最底层原理》

在这篇文章中,主要目的是借用内存对齐这个技术人耳熟能详的东东来帮助大家理解内存条内部的物理构成,以及内存是怎么配合总线来给CPU传输数据的。

2.《内存随机也比顺序访问慢,带你深入理解内存IO过程》

机械硬盘一般我们都知道的随机IO慢的很可怕,因为大家都或多或少有过复制文件特别慢的体验。但是对于内存,绝大部分人就一个印象,快!内存随机IO慢?没听说过。但实际上,内存条的随机IO也比顺序IO慢3-4倍。

3.《从DDR到DDR4,内存的核心频率其实就没太大进步》

这篇文章是为了让大伙明白你的新内存条之所以比较快的原因,内存数据频率是通过技术手段放大出来的。但其实这些放大手段都有一些局限性。比如你的内存数据存储并不连续,这时候DDR2、DDR3的数据预取对你帮助并不大。再比如你的进程数据都存在一个Bank Group里,你的进程内存IO就根本不会达到DDR4厂家宣传的速度。

第二部分、动手测试

在第一部分里搞清楚一些基本原理后,我又动手搞了一些实际测试。只有你实际操作亲身体会过的东西,才会真正理解。

1.《实际测试内存在顺序IO和随机IO时的访问延时差异》

在这篇文章里我们实验了在各种情况下内存访问延迟的表现。最快的情况下其实不是内存在IO,而是CPU的高速缓存在工作。穿透到内存的话,顺序IO延时大约在10ns左右,随机访问确实比顺序访问慢的多,大概是4倍的关系。

2.《揭穿内存厂家“谎言”,实测内存带宽真实表现》

我们在买到一台新服务器的时候,往往厂家会告诉你他家的内存带宽能达到8GB/s、25.6/GB/s。但是在实践中你的内存很难能够达到理想工作状态,考虑到你的访问可能不是顺序IO,内存条存在CL、tRCD、tRP延迟,再加上可能跨QPI总线的延迟。所以你的应用程序里内存的带宽也就达不到厂家的宣称值。我拿一条厂家宣称8.5GB/s的内存条进行测试后发现,最坏情况下其带宽表现只有474M。
不管啥行业的商家都喜欢用理想状态下的值来诱导你进行消费。我又联想到了目前火热的电动汽车的官方宣称续航测试条件,车上只坐一个人,路上没风,路上没坑,匀速运动,不刹车,不加速,汽车周围环境温度要舒适,不能太冷。。

3.《NUMA架构下的内存访问延迟区别》

现代的服务器里,CPU和内存条都有多个,它们之间目前主要采用的是复杂的NUMA架构进行互联,NUMA把服务器里的CPU和内存分组划分成了不同的node。属于同一个node里的CPU和内存之间访问速度会比较快。而如果跨node的话,则需要经过QPI总线,总体来说,速度会略慢一些

第三部分、实践应用

可能很多在应用层做开发的人都或多或少的觉得把内存原理理解到这么底层没有啥必要。因为大家手头的开发工作可能已经被封装过好几层了。首先操作系统就封装了第一层,对用户进程只暴露申请、释放等函数,把高速缓存IO、内存IO都封装成黑盒让你使用。其次现在的开发语言,如PHP、Java等连内存申请、垃圾回收都不用开发者做了,用的时候直接用。

我这里通过三个例子说明一下,如果你能深层次理解硬件、Linux内核工作的话,你对新技术认知的层次,你对手头项目的性能开销的理解都会有极大的帮助。

1.《PHP7内存性能优化的思想精髓》

这里我举了几个PHP7内核里的几个数据结构的优化,因为作者大牛深谙CPU与内存的工作原理,表面上看起来只是几个字节的节约,但是实际上爆发出了巨大的性能提升。

2.《一次内存性能提升的项目实践》

在这篇文章中,通过将内存的离散的随机IO变成顺序IO,让内存工作在最舒服的状态,进而达到了很多倍的读取性能的改进。

哦,等等。差点忘了一个,在NUMA时代的今天,单进程最大可以用到多少内存?传说中的NUMA陷阱长什么样子,《挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!》来告诉你。

好了,内存篇就给大家分享到这里,接下来我会逐步整理我在硬盘、网络方向的思考再给大伙分享出来,提前祝大家2020年新年快乐!

欢迎关注微信公众号:开发内功修炼

开发内功修炼内存篇汇总相关推荐

  1. 开发内功修炼网络篇电子书出炉!!!

    点击上方蓝字"开发内功修炼",关注并设为星标 了解你的每一比特,用好你的每一纳秒 飞哥的开发内功修炼技术号更新文章有一年多了,以前的文章都是单独介绍一个技术点,没给大家一个整体的视 ...

  2. 我是怎么样写出开发内功修炼的?秘密都在这里!

    经常收到后台读者发过来同样的问题,看完「开发内功修炼」以后觉得写的不错.问:"飞哥你平时是怎么样磨炼自己的技术能力,并写出这些文章的?另外可否帮推荐几本书更系统地学习一下".今天干 ...

  3. 【知识点总结】内功修炼-算法篇

    [知识点总结]内功修炼-算法篇 五大基本特征 设计要求 排序算法 1.选择排序 2.冒泡排序 3.插入排序 时间复杂度总汇 排序算法 概念 分治思想 递归 知识点 前缀表达式 中缀表达式 后缀表达式 ...

  4. 写给内功修炼读者的一封信!文末献上作者近照!

    大家好,我是张彦飞allen.我在2010年从西北大学计算机系硕士毕业,然后就来到帝都一直混迹到现在.这期间主要在腾讯.搜狗两家公司从事应用开发与技术管理工作. 为啥要写这么一个技术号呢?故事还要从2 ...

  5. linux 物理内存用完了_12张图解Linux内存管理,程序员内功修炼,看过都说懂了!...

    本文已收录Github:imcoderlemon/CodeClass从小白到架构师,关于编程所有你需要掌握的内容都在这里 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学,内存管 ...

  6. RTOS内功修炼记(七)—— 内存管理

    内容导读: 第一篇文章讲述了任务的三大元素:任务控制块.任务栈.任务入口函数,并讲述了编写RTOS任务入口函数时三个重要的注意点. RTOS内功修炼记(一)-- 任务到底应该怎么写? 第二篇文章从任务 ...

  7. 程序员的内功修炼——值得看的9本书

    前言 作为程序员,其能力可分为两种: 技术能力,对语言的理解,对所在技术栈中技术的理解,这类能力可称为外功. 思维的修炼,工作效率提升, 对代码的理解,对架构的理解,此类能力可成为内功. 内功和语言平 ...

  8. 《C语言点滴》一1.5 内功修炼

    本节书摘来自异步社区<C语言点滴>一书中的第1章,第1.5节,作者 赵岩,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.5 内功修炼 C语言点滴 1.5.1 ...

  9. 专访刘伟:软件开发人员的内功修炼之道

    摘要:数学修养对软件开发之路起着什么作用?码农如何修炼自己的内功并成长为优秀的软件开发员?带着相关思考,社区之星第10期采访了中南大学副教授--刘伟.他对数学修养.设计模式.软件架构和重构方面的独特见 ...

最新文章

  1. bat脚本如何自动输入y_Linux系统如何设置开机自动运行脚本?
  2. 为什么可以说Java语言是准动态语言?
  3. struts1.2上传多个文件
  4. java initcause_initCause()是什么意思
  5. java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...
  6. 通过开始关键字和结束关键字,查找所有的邮箱名称记录
  7. JasperMES.cn JasperMES.com.cn 我的MES网站
  8. java中关键字、标识符、常量、变量、数据类型
  9. OJ1050: 阶乘的累加和(C语言实现多重循环和递推方法)
  10. SpringMVC子父容器源码剖析
  11. python连接mysql_Python连接MYSQL数据库
  12. ARM开发7.3.3 基础实训( 3 ) 独立式键盘的输入系统设计--LPC21XX
  13. 手机基于蓝牙JDY-31蓝牙模块与52单片机串口通信
  14. 防御DDoS攻击的五种方法
  15. echarts饼图:实现多层图表同步自动轮播,鼠标悬浮时停止轮播,移出鼠标后重新开始轮播效果
  16. linux申请令牌错误,解决“请求中包含的安全令牌已过期”错误
  17. 每日打卡 22 11 16 CF 1694B Paranoid String
  18. TensorFlow Serving
  19. STM32填坑:时钟使能必须在外设初始化之前
  20. SpringBoot启动报错:Failed to introspect Class [XXX] from ClassLoader解决办法

热门文章

  1. C++ Primer Plus (第五版)中文版 勘误表
  2. 20121009 P85
  3. 27岁只会“功能测试“(点点点),面临公司的“淘汰”?沉淀一年我能继续做测试!
  4. ​1000+数字化精英汇聚,3大低代码解决方案发布,奥哲低代码数字化解决方案发布会圆满落幕
  5. 电脑上安装VMware及centos系统
  6. 杭州计算机学校餐费,「分享」杭州2021年哪所计算机学校最好就业_附收费明细...
  7. mos管结电容等效模型_MOSFET剖面与等效电路图
  8. 活体检测+3D人脸识别:为“刷脸”上道安全锁
  9. 使用高德(百度)地图API
  10. 分布式电源(风电、光伏)对配电网保护的影响分析与仿真-电流速断保护-PSCAD、matlab