架构设计决定了系统性能的上限,实现细节决定了系统性能的下限。
站在架构师角度,主要关注两方面:
- 单机性能,将单机性能发挥到极致
- 单机无法满足是,设计集群方案
单机性能
单机服务器性能关键之一就是网络编程模型,有两个关键设计点:
- 如何管理连接:阻塞、非阻塞、同步、异步
- 如何处理连接:单进程、多进程、多线程
传统模式
模式 | 说明 | 问题 |
PPC | Process per Connection,每次有新的请求就fork一个进程处理 |
|
Prefork | 启动时预先创建好子进程,有新的连接调一个子进程处理 |
|
TPC | Thread per connection,与PPC类似,用线程取代进程 | 同PPC,但资源消耗少 |
Prethread | 与Prefork类似,用线程取代进程 | 同Prefork,但资源消耗少 |
Reactor
来了事件kernel通知用户程序,用户程序read-> handle-> send
关键点:非阻塞同步,复用
技术方案:I/O多路复用+线程池
Reactor负责监听和分配事件,线程池负责处理事件。
Proactor
来了事件kernel先处理read,处理完了通知用户程序handle,最后kernel send
理论上Proactor的效率要比Reactor高,但目前只有windows iocp支持,linux最成熟的还是Reactor。
集群高性能
多台服务器组成一个集群,前置负载均衡
负载均衡分类和架构
DSN负载均衡:用于地理级别
硬件负载均衡:用于机房或者集群级别,F5、A10
软件负载均衡:用于服务级别,Nginx(7层)、LVS(4层)
负载均衡算法
轮询
加权轮询
负载最低优先(请求数、cpu负载等)
hash(ip、url、id)