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

翻译 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等这些语言缺省都是阻塞式的,所以当你同时使用非阻塞的服务器和这些语言其中之一的话,请务必当心!

单进程非阻塞服务器

进程的执行取决于调度算法,多个进程就是多个资源,进程是资源分配的单位,用多进程在客户端访问服务器中是很常见的应用。下面我们介绍一种单进程实现客户端访问服务器的方法,其基本思想就是虽然使用单线程但是不让...
  • u012193416
  • u012193416
  • 2017年11月26日 17:46
  • 59

python非阻塞式单进程服务器

python的单进程服务器一次只能处理一个客户端,显然是没有实用价值的,但是我们可以将单进程服务器变为非阻塞式的。 利用socket中的setblocking()方法可以将tcp套接字转化为非阻塞式...
  • wangbowj123
  • wangbowj123
  • 2017年09月07日 00:17
  • 123

高性能非阻塞Web 服务器Undertow

概述 WildFly 8 包含了一个全新的Web服务器(Undertow),WildFly 8 默认的Web服务器为Undertow。一句话概括什么是Undertow - 高性能非阻塞 Web ...
  • fayeyiwang
  • fayeyiwang
  • 2017年01月25日 14:05
  • 1410

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

Reactor
  • zhiwensun
  • zhiwensun
  • 2014年04月09日 10:00
  • 849

一个高并发非阻塞的网络服务器例子

一个高并发非阻塞的网络服务器例子 nginx, redis 服务器程序都是高并发非阻塞服务器程序的典型代表,acl 库的 C 库(lib_acl) 的 aio 模块设计了完整的非阻塞异步...
  • zdy0_2004
  • zdy0_2004
  • 2014年11月01日 02:14
  • 695

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

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

数据库设计中应注意的问题

引言数据库设计是信息系统设计的基础,一个好的数据库设计在满足了软件需求之外,还要易维护、易扩充等等要求。当然,对专家们反复强调的数据的一致性、冗余性、访问效率等问题的解决,很大程度上取决于数据库设计者...
  • houzuoxin
  • houzuoxin
  • 2014年09月14日 20:37
  • 2678

组装服务器注意事项

最近做虚拟化工作需要,为公司组装了一台服务器。把过程经验介绍一下: 根据摆放环境选择机箱尺寸,一般服务器机箱多使用19寸机箱(分为1U.2U.3U.4U)、塔式机箱。对于服务器扩展性要求不高...
  • DavidLee2009
  • DavidLee2009
  • 2015年12月06日 11:43
  • 446

在设计数据库时需要注意哪些?

1.在针对表结构设计时如果是n对n的关系,尽可能的设计成1对N的关系。避免表关联太复杂,以便于提高查询效率。 2.首先在定义字段名称是尽可能以简单字符串来完成,建议是能读懂字段所存储内容的大概意...
  • zhengdjin
  • zhengdjin
  • 2012年04月12日 15:08
  • 1045

分布式网络爬虫浅见

    昨天研究过larbin之后,晚上回去想了想,larbin是单机的爬取,速度有限,像baidu,google这样的公司肯定不是用一个爬虫去爬,不然 那么大的数据量,根本就处理不了.如果能将其改成...
  • caohao2008
  • caohao2008
  • 2007年06月24日 09:01
  • 5181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非阻塞服务器需要注意的主要问题(译)
举报原因:
原因补充:

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