学架构笔记4:高性能复杂

Published by 煎鱼 on

单机复杂度

计算机内部最关键的地方是操作系统,操作系统和性能最相关的就是进程和线程。

批处理程序的计算机一次只能执行一个任务,如果某任务需要从IO设备读取数据,CPU在此时则是空闲的。因此为了提升CPU利用率,引入了进程。为了达到多进程并行运行的目的,采取了分时的方式。

多进程每个进程数据不共享,如果两个进程需要通信,则需要依托中间存储介质,效率低且程序复杂。引入进程间通信,包括管道、消息队列、信号量、共享存储。

多进程的每个进程内部只能串行,也需要并行处理。引入线程,同时为了保证数据的正确性,引入互斥锁机制。从此,线程是操作系统调度的最小单位,进程是操作系统分配资源的最小单位。

多线程、多进程本质上还是分时系统,引入多个CPU实现真正意义上的多任务并行,有解决方案:对称多处理器结构SMP、非一致存储访问结构NUMA、海量并行处理结构MPP,其中SMP最常见。

集群复杂度

计算机硬件的发展速度远远比不上业务的发展速度。单机性能无法支撑业务,必须采用机器集群。

任务分配

不同的任务分配到不同的机器上执行,拆分业务的复杂度体现在:

  1. 需要增加任务分配器,可能是硬件网络设备(F5、交换机),可能是软件网络设备(LVS),可能是复杂均衡软件(Nginx、HAProxy),如果自研系统则还需要更多的维护成本。
  2. 任务分配器和业务服务器之间有连接交互
  3. 任务分配器需要新增分配算法。
  4. 任务分配器在大量请求下也需要多台,结构会更复杂

任务分解

通过以上任务分配可以突破单台机器性能的瓶颈,但是随着业务增长,单纯的任务分配和增加机器已经不能获得相应的收益,引入“任务分解”。

将一个业务的任务或者功能从逻辑的角度分解成不同的小功能,独立出来一个个业务子系统。

虽然代码量可能不减反增,但能提高性能的原因如下:

  1. 子系统简单而容易优化
  2. 易扩展

但是分解的粒度必须要把握好,而度量的关键在于网络的延迟不占主要延时 —— 如果粒度过细,则需要消耗太多的时间作连接和传输的工作。

总结

学习了软件中高性能带来的复杂度,一是体现在单机内部的复杂度,例如多线程多进程,另一个体现在集群的复杂度。

先这样吧

若有错误之处请指出,更多地关注煎鱼

Categories: Programming架构

发表评论

电子邮件地址不会被公开。 必填项已用*标注