从性能优化到架构演化
从性能优化到架构演化
如何写出高效的程序,这个是始终存在的命题,但是他的意义却在不断演化。
一开始,我们专注于设计更好的数据结构和算法。每有一个新的领域和问题,我们就会去探索“最优”的解决方式(这里指的是数学上的最优)。但是我们知道,算法上的提升是有数学上的理论上限,对于每个特定的问题,很快我们就达到了理论上的极限。
这时我们发现,对于不同类型的应用和不同的运行环境,我们需要的是不同的资源(性能热点不同)。这是我们可以巧妙的利用一些相对富余、便宜的资源去换取一些相对短缺、昂贵的资源(一般是CPU),这也就是我们经常说的时间换空间或者空间换时间。这时候,程序员开始从数学家变成管理学家,优化从解题变成了权衡的艺术,需要你对业务的理解、对硬件资源的理解,最终做出一个符合当下(最好能够一定程度符合未来)需求和场景的“最优”方案。
最常见的就是各种缓存技术
但是,这时硬件开始吊链子了,说好的摩尔定律逐渐开始失效,cpu的主频不再提升、cpu制成工艺越来越接近物理极限…而业务膨胀的速度比摩尔定律还摩尔定律。这时聪明的工程师门开始用数量解决问题,一块cpu不行就两块,一个核不行就双核。但这对我们传统的程序架构提出了新的挑战,我们的问题从怎么有效的利用cpu变为了如何有效的利用和协调多块cpu。从此,协程、多线程、超线程、SIMD各种并行计算开始走上历史舞台(多线程早就有,当时是为了支持单cpu上的多任务并行和解决IO阻塞,而现在还需要拆分计算任务分到多核之上,以提高性能)。
类似的,硬盘也有硬盘阵列技术RAID。
但是业务发展的还是太快了,单个机器的性能也很快达到瓶颈,这时互联网和互联网基础设施的发展又把人们带入了新的世纪(刚好是新的世纪,2000年互联网泡沫)。聪明的工程师发现,那为什么我们不通过累加机器的数量,通过网络把机器连接、协调在一起共同提供算力?(著名的google的三篇分布式计算论文)。终于各种分布式计算、分布式存储、微服务架构开始登上历史的舞台。一个“机器”不再是一个物理的结构,而是一个网络拓扑结构。
cpu 变成了MapReduce
、Spark
,内存 变成了redis
,硬盘 变成了mysql
,总线 变成了kaffa
、MQ
,操作系统 变成了zookeeper
、k8s
…
遵循这个足迹,我们把越来越多的多的机器连接在了一起,IDC机房、数据中心开始蓬勃发展。然而我们的初衷是通过连接更多数量的机器来拓展我们的算力和容量,但是这个世界上绝大多数的算力和容量都躺在我们的家中(大部分时间都是极低的使用率),虽然他们都是联网的,但是我们并没有很好的利用他们,可真是浪费啊。
如果我们能够统筹管理这个世界上所有的机器,按需分时分配到不同的使用者手中,那对于每个使用者来说,都不再需要投入大量的成本去购买超出自己需求(为了满足之后可能的需求)并且可能因为很多时间闲置而没有充分利用的机器。于是,云主机、云服务出现了。用户按需弹性的去租借算力,节省成本。
其实早年的p2p(电驴)、现在的区块链也是这样的应用,只不过资源管理的方式不同,一种是中心化的,一种是去中心化的。
然而,目前这种方式还没有完全替代个人pc电脑,原因是如果我们真的想管理数量庞大的机器,那管理成、协调的成本会大大超过它所能带来的收益,至少目前的网络带宽是还没法承载的。而5G
技术的到来,可能能够大大降低这样的成本,实现所谓的万物互联。
这也是为什么西方世界都在玩命的打压华为的原因
最终落地到我们的工作日常中,其实大部分时间,我们都是在做第二种方式的性能优化,像做买卖一样,用便宜的东西换取昂贵的东西。但是我们发现好像不太对啊,程序员的时间也是很贵的,如果本来能用换一块cpu解决的问题,而让一个程序员花大量时间去优化,岂不是在用便宜的东西换贵的东西?当然情怀还是要有的,我们都会设想我们的程序是要在几万台机器上跑好几年的,那带来的累加的效益还是很大的。
玩笑归玩笑,其实这说明了,在做性能优化之前要评估优化所带来的的收益,而不要盲目的、过早的优化,尤其是牺牲了可读性、可维护性、开发效率而换来的性能的提升,往往是得不偿失的。
以上发展的时间线并不是严格的先后顺序,而是相互之间有交叉。
图片均来自于网络