单服务器高性能架构模式

第72篇

极客时间《从0开始学架构》课程笔记。

单服务器高性能的关键之一就是服务器采取的并发模型,并发模型有如下两个关键设计点:

  1. 服务器如何管理连接。
  2. 服务器如何处理请求。

一、PPC

PPC : Process Per Connection ,其含义是指每次有新的连接就新建一个进程去专门处理这个连接的请求,这是传统的 UNIX 网络服务器所采用的模型。

基本的流程图:

11857-fcdd0ea420074c64.png
PPC
  • 父进程接受连接(图中 accept)。
  • 父进程“fork”子进程(图中 fork)。
  • 子进程处理连接的读写请求(图中子进程 read、业务处理、write)。
  • 子进程关闭连接(图中子进程中的 close)。

特点:实现简单,比较适合服务器的连接数没那么多的情况

缺点:
1、fork 代价高:需要分配很多内核资源,需要将内存映像从父进程复制到子进程。
2、父子进程通信复杂:“fork”完成后,父子进程通信需要采用 IPC(Interprocess Communication)之类的进程通信方案。
3、支持的并发连接数量有限:能处理的并发连接数量最大也就几百。

二、TPC

TPC : Thread Per Connection ,其含义是指每次有新的连接就新建一个线程去专门处理这个连接的请求。

TPC 的基本流程:

11857-79c7a6b24e3e2fb2.png
TPC
  • 父进程接受连接(图中 accept)。
  • 父进程创建子线程(图中 pthread)。
  • 子线程处理连接的读写请求(图中子线程 read、业务处理、write)。
  • 子线程关闭连接(图中子线程中的 close)。

特点:
与进程相比,线程更轻量级,创建线程的消耗比进程要少得多;同时多线程是共享进程内存空间的,线程通信相比进程通信更简单。

缺点:

  • 创建线程虽然比创建进程代价低,但高并发时(例如每秒上万连接)还是有性能问题。
  • 无须进程间通信,但是线程间的互斥和共享又引入了复杂度,可能一不小心就导致了死锁问题。
  • 多线程会出现互相影响的情况,某个线程出现异常时,可能导致整个进程退出(例如内存越界)。

三、Reactor

Reactor=资源池(进程/线程池)+I/O多路复用

资源池:为了资源复用,不再单独为每个连接创建进程/线程,而是创建一个进程/线程池,将连接分配给进程/线程,一个进程/线程可以处理多个连接的业务。
I/O 多路复用技术:只有当连接上有数据的时候进程/线程才去处理。

Reactor:“来了一个事件我就有相应的反应”,这里的“我”就是 Reactor,具体的反应就是我们写的代码,Reactor 会根据事件类型来调用相应的代码进行处理。

Reactor 模式的核心组成部分包括 Reactor 和处理资源池(进程池或线程池),其中 Reactor 负责监听和分配事件,处理资源池负责处理事件。

Reactor 模式有三种典型的实现方案:

  • 单 Reactor 单进程 / 线程
  • 单 Reactor 多线程
  • 多 Reactor 多进程 / 线程

以上方案具体选择进程还是线程,更多地是和编程语言及平台相关。例如,Java 语言一般使用线程(例如,Netty),C 语言使用进程和线程都可以。例如,Nginx 使用进程,Memcache 使用线程。

1、单 Reactor 单进程 / 线程模式

11857-c8a59c32cb1c3ef6.png
单 Reactor 单进程 / 线程

优点:简单,没有进程间通信,没有进程竞争,全部都在同一个进程内完成。
缺点:只有一个进程,无法发挥多核 CPU 的性能;Handler 在处理某个连接上的业务时,整个进程无法处理其他连接的事件,很容易导致性能瓶颈。
适用场景:只适用于业务处理非常快速的场景,目前比较著名的开源软件中使用单 Reactor 单进程的是 Redis。

2. 单 Reactor 多线程模式

11857-479b9ba4565ce87a.png
单 Reactor 多线程

优点:能够充分利用多核多 CPU 的处理能力。
缺点:多线程数据共享和访问比较复杂;Reactor 承担所有事件的监听和响应,只在主线程中运行,瞬间高并发时会成为性能瓶颈。

3. 多 Reactor 多进程 / 线程模式

11857-b23d7a542dc6486a.png
多 Reactor 多进程

优点:实现简单。因为父进程只负责接收新连接,子进程无需返回数据,且子进程之间互相独立。

适用场景:目前著名的开源系统 Nginx 采用的是多 Reactor 多进程,采用多 Reactor 多线程的实现有 Memcache 和 Netty。

四、Proactor

Proactor是异步非阻塞网络模型,可以理解为“来了事件我来处理,处理完了我通知你”。这里的“我”就是操作系统内核,“事件”就是有新连接、有数据可读、有数据可写的这些 I/O 事件,“你”就是我们的程序代码。

11857-3f7d0849d2dfafac.png
proactor

优点:理论上比Reactor效率更高,异步I/O能充分利用DMA特性,让I/O操作与计算重叠。
缺点:操作系统需要做大量工作,目前在Linux系统下AIO并不完善,Windows系统通过IOCP实现了真正的异步I/O。

总结

架构设计决定了系统性能的上限,实现细节决定了系统性能的下限。
PPC和TPC实现简单,但无法支撑高并发场景,在遇到海量用户业务时完全无能为力。
理解以上内容需要学习操作系统的 I/O 模型及进程模型。
I/O 模型:同步(synchronous),异步(asynchronous),阻塞(blocking)和非阻塞(non-blocking)。
进程模型:单进程、多进程、多线程。

猜你喜欢

转载自blog.csdn.net/weixin_33984032/article/details/86779999