单服务器高性能模式

 

单服务器高性能模式
    PPC与TPC
        高性能架构设计主要集中在两方面
            尽量提升单服务器的性能,将单服务器的性能发挥到极致
            如果单服务器无法支撑性能,设计服务器集群方案
        单服务器高性能的关键之一是服务器采取的并发模型;并发模型两个关键设计点为1、服务器如何管理连接2、服务器如何处理请求。两个设计点最终都和操作系统的IO模型及进程模型相关:1、IO模型:阻塞、非阻塞、同步、异步;2、进程模型:单进程、多进程、多线程
        PPC
            是Process Per Connection的缩写,其含义是指每次有新的连接就新建一个进程去专门处理,这是传统的UNIX网络服务器所采用的模型
            特点:实现简单,比较适合服务器的连接数没那么多的情况,例如数据库服务器
            不足
                fork代价高,站在操作系统的角度,创建一个进程的代价是很高的,需要分配很多内核资源,需要将内存映象从父进程复制到子进程,创建进程的代价大
                父子进程通信复杂,fork完成后,父子通信需要采用IPC(Interprocess Communication)之类的进程通信方案
                支持的并发连接数量有限。如果每个连接存活时间较长,新的连接不断进来,则进程数量会越来越多,操作系统进程调度和切换频率也越来越高,系统压力也会越来越大
        prefork
            PPC模型当连接进来时才fork新进程来处理连接请求,由于fork代价高,用户感觉比较慢。prefork就是提前创建进程,当有新的连接进来的时候,可以省去fork进程的操作
            实现关键是多个子进程都accept同一个socket,当有新的连接进入是,操作系统只有一个进程最后accept成功,但所有阻塞在accept上的子进程都会被唤醒,会导致不必要的进程调度和上下文切换,Linux2.6之后版本后内核以及解决了accept惊群现象
            同样存在父子进程通信复杂、支持的并发连接数有限的问题,实际应用也不多
        TPC
            是Thread Per Connection的缩写,其含义是每次有新的连接就新建一个专门处理这个连接的请求。与进程相比,线程更轻量级、创建线程的消耗比进程要少很多;同时多线程是恭喜进程内存空间的,线程通信相比进程通信更简单
            不足
                创建线程虽然比创建进程代价低,但高并发时(如每秒上万连接)还是有性能问题
                无须进程间通信,但线程间的互斥和共享有引入了复杂度,可能导致整个死锁问题
                多线程会出现互相影响的情况,某个线程出现异常时,可能导致整个进程退出
            TPC还是存在cpu线程调度和切换代价问题,在并发几百连接情况下更多采用PPC的方案,因为PPC方案不会有思索风险,也不会多进程互相影响,稳定性更高
        prethread
            预先创建线程,然后才开始接收用户请求
            由于多线程数据共享和通信比较方便,因此实际上prethread相比prefork要灵活一些
    Reactor与Proactor
        IO多路复用两个关键实现点
            当多条连接共用一个阻塞对象后,进程只需要在一个阻塞对象上等待,而无须再轮询所有连接,常见的实现方式有select、epoll、kqueue等
            当某条连接有新的数据可以处理时,操作系统会通知进程,进程从阻塞状态返回,开始进行业务处理
        IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题,select, poll,epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程,单个进程可以处理多个socket。
        Reactor反应堆(事件反应),是非阻塞同步网络模式,是IO多用复用结合线程池,可以理解为“来来一个事件我就有相应的反应”,具体的反应是我们写的代码,reactor会根据事件类型来调用相应的代码进行处理
        Reactor模式的核心组成包括Reactor和处理资源池(进程池或线程池),其中Reactor负责监听和分配事件,处理资源池负责处理事件
        Reactor模式的具体实现方案灵活多变,主要体现在
            1、Reactor的数量可以变化:可以是一个Reactor也可以是多个Reactor
            2、资源池的数量可以变化:以进程为例,可以是单进程,也可以是多进程(线程类似)
        具体选择进程还是线程更多地和编程语言和平台相关,例如:Java语言一般使用线程(如netty),c语言进程和线程都可以。nginx使用进程,memcache使用线程
        单Reactor单进程的模式优点是简单,没有进程间通信,没有进程竞争,全部在同一个进程内完成。缺点:只有一个进程,无法发挥多核CPU性能;Handler在处理某个连接上的业务时,整个进程无法处理其他连接的事件,很容易导致性能瓶颈;只适用于业务处理非常快速的情况,如 redis
        单Reactor多线程能充分利用多核多CPU的处理能力。问题:1、多线程数据共享和访问比较复杂,需要做好同步措施;2、Reactor承担所有事件的监听和响应,只在住线程中运行,瞬间高并发时会成为性能瓶颈
        单Reactor多进程问题:子进程完成业务处理后,将结果返回给父进程发送给哪个client比较麻烦,因为父进程只是通过只是通过Reactor监听各个连接上的事件进行分配,子进程与父进程通信时并不是一个连接
        多Reactor多进程/线程。优点:1、父进程和子进程的职责非常明确,父进程只负责接收新连接,子进程负责完成后续的业务处理。2、父进程和子进程的交互很简单,父进程只需要把新连接传给子进程,子进程无须返回数据。3、子进程之间是互相独立的,无须同步共享之类的处理。开源系统 nginx采用多Reactor多进程,memcache和netty采用多线程
        Proactor主动器,可以理解为“来来事件我来处理,处理完来我通知你”。这里的“我”就是操作系统内核,“事件”就是有新连接、有数据可读、有数据可写的这些IO事件,“你”就是我们的程序代码
        理论上Proactor比Reactor效率更高一些,一步IO能够充分利用DMA特性,让IO操作计算重叠。目前widows下通过IOCP实现来真正的异步IO,而在Linux系统下的AIO并不完善,因此在Linux下实现都是以Reactor模式为主

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值