挑战个体极限 - 如何提高一台服务器的性能?

要提高服务器的性能,正常的思路是

  • 单机堆硬件 - 加内存,换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

Proactor