---
title: '学架构笔记4：高性能复杂'
pubDate: 1995-07-31
tags:
  - '笔记'
description: '学架构笔记4：高性能复杂'
---

## 单机复杂度

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

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

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

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

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

## 集群复杂度

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

### 任务分配

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

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

### 任务分解

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

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

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

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

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

## 总结

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

_先这样吧_

若有错误之处请指出，更多地关注[煎鱼](http://www.jianyujianyu.com)。
