极致性能设计——开篇

阅读本文前推荐看一下《我是一个CPU:这个世界慢!死!了!》 https://www.sohu.com/a/222322011_487482#:~:text=http%3A//blog.51cto.com/13188467/2065321 
 
市面上讲性能设计或者性能优化的文章比较多,但是大多数比较抽象,比如并发编程,使用缓存。
但是很少有从底层原理的角度结合已有开源方案的设计来讲述他们的极致性能设计。
在这里给自己留一个坑,从已有的开源设计和计算底层展开分析一下。
比如:
CPU,内存,SSD,HDD速度有差异。当各个角色配合使用时,速度快的等待速度慢的,就会造成性能下降。
CPU等主存,为了减少等待,采用预测技术和空间局部性原理,将数据提前加载到Cache里。从Cache再拿到寄存器里等待ALU执行。
磁盘的物理结构有悬臂和盘面,读取或者写入数据时,需要悬臂找到对应位置,然后转一圈,读/写一圈。
物理的转动毕竟不如纯电路的访问来的快,CPU说,你太慢,我不管了,让我小弟和你对接吧。从处理器DMAC就出来和磁盘打交道,磁盘数据读完了再通知大哥CPU。
那写数据的时候怎么办呢,有时候写数据就想打补丁,这里一块,那里一块。磁盘的盘面一直转,悬臂在到处找位置。问CPU大哥,你不能一次全给我吗,非要一点点的写,我也很累的。
CPU说,好,你等我攒一波。我去主存划个地方,叫“Buffer”,我攒好了数据叫你。
比如
任务多了,都要执行,于是操作系统大哥给CPU划了时间段——你隔一会换换任务。
于是换任务的时候,CPU就把任务从寄存器拿出来,沿着总线,过了北桥,把数据放在了主存。
我快神经病了,CPU说。于是CPU精神分裂了,分裂出了好几个脑子,我们叫他多核心。还别说,精分之后每个脑子都能执行任务,时间片还是要划分,可以多了几个人,处理的任务加倍了。
比如:
有时候任务不固定,CPU们怕任务来,就一直等着。大家都被耗住了。这时候一个核出来说,我在这等着,有任务了叫你们。我们这个模式叫Reactor。
 
紧接着,
我们会看一些常见软件提升性能的手段。
比如上文我们提过的reactor模型。
为什么有的软件选择PPC(Process Per Connection)模式,有的软件选择TPC(Thread Per Connection)。为什么会有携程的出现?以及Java 的 OpenJDK Loom 项目。
 

缓存与缓冲/Cache & Buffer 的设计与IO设计的关联。SocketBuffer?Kafka的批处理与MySQL的redolog?
 
CPU高速缓冲带来了性能的提升,也引发了数据一致性问题
 
磁盘PageCache 为什么要为磁盘在内存里划分预留区
 
零拷贝技术与DMAC 等等。。。
 
为什么不同的数据结构会产生不一样的效果?
 
算法和硬件如何让代码变的更快。。。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2021-07-13 20:49  Dougest  阅读(107)  评论(0编辑  收藏  举报