zoukankan      html  css  js  c++  java
  • 分布式之高性能IO组件

    因为毕业设计(实时分析大型数据流),开始对分布式并行计算做研究,第一个问题就是通讯。高性能的通讯是整个系统性能的基本保障。

    方案

    就目前的经验来讲,最好的通信选择是:异步非阻塞IO + 资源池。

    • 异步非阻塞是为了避免因IO而阻塞进程(或是线程)而造成计算资源的浪费
    • 使用资源池(连接池)是为了应对高并发

    方案是这样,要说理由的话就得说一大堆,牵扯很多东西

    程序运行背景

    以往常规的代码都是单线程同步的代码,指令的执行顺序和书写时一致,当遇到IO(文件操作或是网络操作),通常都会阻塞线程,那么OS会让其他线程获得CPU资源,这使得你的程序停滞了,当有其他请求进来时得不到处理,自然系统性能也就降低了。传统的方法是用多个线程处理多个请求,就像运行php的apache服务器一样,然而线程是昂贵的,自然也不是较好的选择。

    IO 操作是基于OS,windows系统提供俩类IO,一种是同步IO(如上面描述的一样),一种是异步IO(其他OS也提供这样的操作,但并不是所有的OS都支持的很好)。异步IO与同步IO的区别在于谁去真正执行IO操作。在同步IO中是由用户进程执行IO;在异步IO中,则有OS分派另外的内核线程来执行,待数据准备好之后再将数据交由用户进程处理,在内核线程执行IO的时候,用户进程可以处理其他事情,并未被阻塞,这是异步IO高效的原因。

    ACE && netty

    ACE

    ACE是Douglas Schmidt开发的一个C++网络编程库,实现了Reactor 和 Proactor俩种模式。其中Reactor模式以类似异步的方式编写代码,但IO实际上是同步的;Proactor则是利用OS的异步IO而编写,是真正意义上的异步IO。可以看这里链接,有对俩种方式的简要介绍,作者还自己写了一个TProactor,非常有意思!因为真正意义上的IO与OS密切相关,不同OS提供的API都不一样,跨平台是一个非常繁琐的问题,需要你了解不同OS的差异,使用别人经过严格测试的框架是一个非常明智的选择。

    netty

    netty是java世界的非阻塞IO库,netty是按Reactor模式设计,使用一个单独的线程作为event demultiplexor ,java鄙人不熟,也不清楚其线程创建的开销是否大。不过可以确定的是在java的世界netty是最好的选择。

    Golang blocking IO && node.js non-blocking IO

    关于这个,非常感谢国外一个同行做的测试链接,从测试结果看来node.js 的异步非阻塞IO的性能低于Golang的阻塞IO。为什么呢,主要原因有俩个:一 是语言的runtime,解释型语言肯定比不过编译型语言,但这不是主要因素;最主要的因素是在Golang里面虽然是以阻塞的方式编写代码,可实际运行的时候不同goroutine之间可以进行非常高效的切换,代价远低于传统的线程切换(Golang的调度器做了异步IO的操作,对使用者屏蔽了底层问题),工作原理类似协程。所以IO阻塞对于Golang编写的程序来讲不是一个问题,一个goroutine阻塞了,其他的goroutine可以继续运行,整个系统并没有放弃对CPU的占用。

    在stackoverflow 还有一个讨论链接,感性趣的可以看看

    另外还有Erlang的解决方案(之前公司小组的leader推荐了Elixir,准备看看),per connection per process, OTP ,所以有好多选择啊!

  • 相关阅读:
    Windows phone 应用开发[9]单元测试
    Git Tool Part 2
    Windows phone 应用开发[6]Managed Extensibility Framework应用程序扩展
    也谈存储过程分页
    上传图像到sqlserver
    这两段代码是不同的
    TextBox中的TextChanged和KeyDown事件的小区别
    发现发现返回一条记录的datareader的新用法
    最近好多疑问啊!高手给点意见吧!
    csdn论坛去不了,只有在这里问了
  • 原文地址:https://www.cnblogs.com/yyrdl/p/5289510.html
Copyright © 2011-2022 走看看