《从 0 开始学架构》学习归整(一)复杂度问题的来源 高性能篇

内容纲要

高性能

软件系统中高性能带来的复杂度主要体现在单台计算机内部为了高性能带来的复杂度多台计算机集群为了高性能带来的复杂度

单机复杂度

计算机内部复杂度最关键的地方就是操作系统;操作系统性能最相关的就是进程线程

操作系统进化

  1. 无操作系统
    • 运行过程:输入–>计算–>输出
    • 缺陷:大部分时间计算机都在等待用户输入,很低效
  2. 批处理操作系统
    • 运行过程:编写要执行的指令(写到纸带、磁盘等介质),形成指令清单(任务) –>计算–>输出
    • 进化:执行过程中无需等待用户人工操作,执行效率提升
    • 缺陷:一次只能执行一个指令清单(任务),在大量 I/O 操作(从磁盘读数据)的时候,CPU 处于空闲状态,没有完全利用 CPU 性能
  3. 分时系统
    • 运行过程:编写(多个)需要执行的任务–> CPU 按时间片段分配结果分别执行不同任务的指令–>输出
    • 进化:
      • 并行执行:采用分时方式,利用 CPU 超高的计算速度,让 CPU 以串行的方式执行不同任务的指令片段,达到用户眼中的并行处理
      • 进程间通信:设计出管道、消息队列、信号量、共享存储等通信方式;使任务设计变的更加灵活高效
      • 多线程:使进程内部的子任务可以并行的执行;线程共享进程数据,为了保证数据正确性,发明了线程锁
    • 缺陷:并不是真正的并行执行
  4. 多核架构
    • 运行过程:同分时系统
    • 进化:出现 SMP(对称多处理结构)、NUMA(非一致存储访问结构)、MPP (海量处理并行结构)方案;目前以 SMP 为主;让多个 CPU 同时执行任务,实现真正的并行

集群复杂度

单机的处理能力在每个阶段都有其极限,要获得更大的处理能力除了依赖硬件的发展,更多的需要通过架构设计使多台计算机组成集群,协同工作。

业务复杂度与集群

任务分配

任务分配是指每台机器都可以处理完整的任务;不同的任务分配到不同的机器上执行。

一台服务器变多台的复杂度
  1. 增加分配器(交换机、LVS、Nginx 等)
  2. 增加分配器与业务服务之间的交互(建立连接、保活、中断恢复等)
  3. 增加任务分配算法(轮询、权重等)等
  4. 用户分配(DNS 轮询、智能 DNS、CDN 等)
    一台服务器变多台1
    一台服务器变多台2

任务分解

任务分配解决了单台服务器的性能瓶颈,但如果业务的发展越来越复杂,再通过任务分配的方式进行服务设计,增加服务器带来的收益会越来越低。
为了解决这个问题,我们需要采用任务分解这种方式。

微信后台架构 ↓
微信

提升性能的因素
  1. 简单的系统更加容易做到高性能
    • 越简单,影响性能的点就越少,更加容易针对性的进行优化
  2. 可以针对单个任务进行扩展
    • 更加容易发现整个系统的瓶颈
任务分解误区

任务分解的过细,会增加子任务系统之间的交互(系统调用、网络通信)等消耗。

子任务交互代价

发表回复

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