非阻塞服务器需要注意的主要问题(译)

翻译 2011年01月19日 17:21:00

The main issue with non-blocking servers

 

非阻塞服务器有一个严重的问题,一些人甚至在没解决这个问题的背景下就开发自己的应用框架(比如Python的Tornado

当你使用非阻塞服务器的时候,你会获得出色的性能并且不需要担心可扩展性,然而同时你需要意识到一个问题:你的IO调用、网络系统调用也都是非阻塞的吗?很多人忽略了,他们使用的非阻塞服务器,其实是构建在阻塞库之上的。

在这篇文章里,我将深入对比多线程的服务器与非阻塞的服务器分别是如何工作的,以及你之所以需要在"使用的服务器"与"使用的库"在阻塞模式上保持一致的原因。

 

Non-blocking servers perform better

首先,我不会否认非阻塞服务器比阻塞服务器有更好的性能,尤其在那些有着数以万计的高并发用户的应用场景中。下面通过一些图片对说明这个问题,这些图片是WebFaction所测试的结果:

     A little holiday present: 10,000 reqs/sec with Nginx!

当他们从Apache向Nginx迁移时,发现:

Nginx每秒可以处理更多的请求:

nginx - req pr sec

Nginx比Apache使用更少的内存:

nginx - memory usage

真是令人吃惊的结果,那么为何不把非阻塞技术引入到你的 Python/Java/Ruby/PHP 框架里呢?

 

How blocking servers work

阻塞式服务器通常是基于多线程的,一个线程处理一个请求,它的工作方式可以现象化地表示为:

Threaded server

关于阻塞式服务器,有如下事实:

  • 处理高并发连接请求代价昂贵,服务器需要量产线程——线程并不便宜。
  • 库函数需要线程安全,这是多线程环境必需的。

 

How non-blocking servers work

非阻塞服务器不需要多线程,它通过一个IO循环及(异步)事件来处理请求,它的工作方式如下:

Non blocking server

关于非阻塞式服务器,有如下事实:

  • 处理高并发连接请求不是困难,这也是它被用于comet技术的重要原因
  • 在IO循环中的所有操作都必须是非阻塞,否则会因为你一个操作而阻断了整个循环
  • 不需要线程安全

 

Where Tornado (and others) go wrong

我以Tornado为例,但是其它的非阻塞式应用存在相同的问题:

Tornado使用了非阻塞式的服务器,但他们同时使用的库是阻塞式的,于是:

  • Tornado关于Mysql连接的库是阻塞的,这意味如果你的查询需要1s,那么你的loop循环就需要停下来1s等待查询的完成
  • 不要使用昂贵的系统调用,它会卡住整个循环
  • 同样,不要在循环中渲染模板,原因同上

就像我之前提过的,阻塞整个loop是致命的,因为此时你什么也做不了!

 

Conclusion

总之,非阻塞技术精巧且性能卓越,但要正确运用此技术,你必须使用同样是阻塞式的IO和Network调用,否则你将后患无穷!还有,请注意Python, Ruby, Java or PHP等这些语言缺省都是阻塞式的,所以当你同时使用非阻塞的服务器和这些语言其中之一的话,请务必当心!

嵌入式Web服务器学习之阻塞IO/非阻塞IO

Reactor

服务端用非阻塞socket<--->客户端用阻塞socket

之前, 我们简要第了解了一下非阻塞的socket。 在本文中, 我们让服务端用非阻塞socket, 客户端依然用我们熟悉的阻塞的socket.        服务端程序如下(非阻塞的socket)...
  • stpeace
  • stpeace
  • 2015年02月05日 23:08
  • 2766

linux 下非阻塞客户端,服务器代码

服务器端源代码如下: [cpp] view plain copy #include    #include    #include    #inclu...

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解      在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非...
  • hguisu
  • hguisu
  • 2012年04月12日 16:35
  • 187593

非阻塞服务器需要注意的主要问题(tornado)

非阻塞服务器有一个严重的问题,一些人甚至在没解决这个问题的背景下就开发自己的应用框架(比如Python的Tornado) 当你使用非阻塞服务器的时候,你会获得出色的性能并且不需要担心可扩展性,然...

图像检索服务器编写问题记录——服务器端模型选择+epoll和非阻塞IO

0.服务器端模型选择 大体思路是:在主线程中使用epoll承受高并发连接,在主线程中开辟工作线程用来处理就绪的描述符。嗯,这个原来有官名,叫反应者模式。事件驱动编程。另外工作线程处理的就绪的文件描述符...

java 写的非阻塞http服务器

  • 2013年07月02日 18:04
  • 3.72MB
  • 下载

非阻塞connect需要处理的问题

套接字状态默认为阻塞的。对于非阻塞的套接字,如果相应的操作没有满足,就会立即返回EWOULDBLOCK错误,使用比较多即TCP的connect函数。 阻塞的connect要等到3次握手完成才能返回,因...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非阻塞服务器需要注意的主要问题(译)
举报原因:
原因补充:

(最多只允许输入30个字)