挑战个体极限 - 如何提高一台服务器的性能?
要提高服务器的性能,正常的思路是
- 单机堆硬件 - 加内存,换CPU
- 多个单机组成集群
以上两种思路都是从硬件层面出发的。 我们这里讨论的当有大量请求过来的时候,不从硬件出发,而是从方法论出发,看看有哪些策略可以提升服务器的性能。
- 两种维度
- PPC
- TPC
- Reactor
- Proactor
两种维度组合的场景
- 连接数量多,请求数量多
- 秒杀,双十一之类的业务,这类业务一定走分布式这条路
- 连接数量多,请求数量少
- 企业的官网
- 连接数量少,请求数量多
- 一些中间件,比如数据库连接池,一个数据库连接,是执行SQL的请求可能有几百个
- 连接数量少,请求数量少
- 企业的内部系统,比如我司创建学生账号的工具,查看学生学习情况的报表系统.
PPC
PPC(Process Per Connection) 顾名思义就是一个连接一个进程。这种模式适合连接数不是特别的情况,比如数据库连接数.
缺点是
- Fork进程是有代价的
- 父子进程通信比较复杂
TPC
TPC (Thread Per Connection) 就是一个连接一个线程. 这种模式可以说是PPC的加强版. 它不需要fork进程,也没有父子进程通信复杂的情况. 但它来来额外的副作用. 这也属于BIO
- 线程切换是需要代价的
- 线程之间协作不当就有可能出现死锁
所以这是典型的发明了一个方案,然后制造了一个问题啊.
Reactor
Reactor在前面的博文有隐约提到过,它主要干了两件事
- 将线程分为两类,一类主线程专门用来接受socket的请求,一类工作线程专门用来处理socket请求
- 主线程通过某种方式(事件驱动)将请求传给工作线程 - 好莱坞原则
Reactor本质上是同步阻塞I/O