「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。
为了提高服务器的性能,我们需要提高系统每一个环节,如磁盘、操作系统、cpu、内存、缓存、网络、语言、架构等,每个环节都有可能影响到系统的性能。
架构设计决定了系统性能的上限,但实现细节决定了系统性能的下限。单个服务器提高性能的关键之一就是服务器采取的并发模型,并发模型的设计要点有两个:
- 如何管理连接
- 如何处理请求 以上两个设计点,都和系统的 io 模型和进程模型相关:
- io 模型:阻塞、非阻塞、同步、异步
- 进程模型:单进程、多进程、多线程 有两个常用的单机高性能模式:PPC 与 TPC
PPC
首先,我们介绍下 PPC,process per connection,即每有一个新的连接,都起一个新的进程去处理这个连接的请求,这也是传统 unix 网络服务器采取的模型。 PPC 的流程为:
- 父进程接受连接
- 父进程 fork 一个子进程
- 子进程处理连接读写请求
- 子进程处理完请求后关闭连接 这个方式有几个弊端:
- fork 进程开销较大,即使用了 copy on write
- 进程间通信较为复杂
- 同时支持的并发数低,通常为几百,因为 cpu 频繁在进程间切换 prefork 技术是提前把进程创建好,连接来了后分配一个进程处理连接,虽然提高了连接处理速度,但是没解决本质问题。
TPC
TPC,与 PPC 对应,就是 thread pre connection,即用线程代替进程处理连接的请求。线程间共享内存、通信简单、fork 成本低。
但是 TPC 也有缺点:
- 创建线程也是有代价的
- 无需进程通信,但是线程间的互斥和共享引入了新的复杂度,可能导致死锁问题
- 某个线程一场场,可能导致整个进程退出 因为 tpc 稳定性不如 tpc。
不同并发模式的选择,需要考虑三个指标:响应时间RT,并发数 Concurrency,吞吐量 TPS,吞吐量=并发数/响应时间。