高并发网络服务的思考

最近一直在学习Twisted, Python的异步网络开发框架。也看了一些与其相关的资料,把所了解到的一些内容和想法记录一下。

通常我们所熟悉的网络服务开发,不论是天天在使用的Java Servlet也好,还是Python下的各种以WSGI为基础的Web Framework也好,都是采用多线程的方式处理并发请求。在主线程中监听,建立Socket后交给线程来处理,主线程继续等待请求。

这种模式在目前的系统中大量被应用。曾经也考虑过,每一个线程的代价是多少?这些线程真的是并行执行的吗?当线程访问IO,比如访问磁盘,数据库时,线程的等待的代价是多少?对于主要业务是CRUD的Web系统,线程接受一个请求后,以下各部分占总处理时间的比例是多少?

  • 从Request中读取数据
  • 处理请求
  • 访问数据库
  • 处理数据
  • 写回Response

每台服务器最多能同时启动多少线程来应对并发?如今很多网站要面对每秒几K,几十或者几百K的并发访问(更不要提DDOS的攻击),需要多少硬件来处理这样的访问量?

前些天看到一个Slide,有一组数字来对比不同IO的代价(数字来自于:Node .js by Francisco Treacy):

L1 Cache

3 cycles

L2 Cache

14 cycles

RAM

250 cycles

Disk

41,000,000 cycles

Network

240,000,000 cycles

这些数字看起来很恐怖,磁盘IO是内存的16万倍。读写数据库等常见的网络IO是内存读写的将近100万倍。

虽然没有实际的数据说明CRUD系统各个部分的消耗时间占比,但是总上面这些数据可以很容易看出,1,3,5步的时间肯定比2,4步多几个数量级。那么也可以说,一个线程被从Pool中取出到再回到Pool中所经历的时间,大部分在IO阻塞中等待。

虽然不能确定线程在被IO阻塞的时候需要占用多少系统资源,但是系统毕竟不可能同时运行太多的线程,也就是说,就算大量的线程在等待,系统也无法在负载更多的并发请求。

相对于这样的一种模式,现在常见的另一种模式,也就是异步网络开发模式。在异步模式下,所有请求运行在一个进程/线程中。系统最核心的是一个基于事件的无限循环,每一次循环,系统会等待所有的IO,任何一个或者多个IO准备好了读或者写,等待结束,系统开始依次处理每一个IO请求,然后系统进入下一轮等待。这种模式叫Reactor Pattern。这样的方式要求每一个处理IO请求的处理单元,必须尽量的充分利用CPU资源,如果遇到任何高消耗的IO操作,都要交由系统的核心,重新进入循环调度,而不能等待。这种的调度方式也叫做cooperative multitask,这在早期的计算机系统中大量使用,Mac OS 9版本也采用类似的调度核心。

(Borrowed from Dave Peticolas’ An Introduction to Asynchronous Programming and Twisted Part 2)

对比同步和异步的开发模式,在同步模式下,开发人员可以随意使用CPU资源,开发人员假设外部系统能够完美的处理好多线程的调度,外部系统全权包办CPU资源的调配,应用可以随意贪婪的使用CPU资源。异步模式则将系统资源的使用权很大程度上交由开发人员来决定,系统信任每一个模块/处理会自觉得使用仅必须的CPU时间,而且会自觉的将CPU资源让出给其他的模块/方法使用。这听上去好像很原始,开发人员需要用很大的精力去考虑非业务的问题。当需要面对的是一个高并发访问的系统,访问的稳定性和快速响应,应该比复杂花哨的功能更有价值吧。

(PS. 这两种模式的对比感觉有点像当今的社会现象,看看日本震后群众的表现就知道了)

从另外一个角度来对比,为了能够处理大量的并发,同步模式使用了Queue来缓冲超过处理能力的请求,即使所有的线程都在等待IO(如数据库响应),这些在Queue中的请求也无法得到处理。而异步模式下,即使已经接受了大量的请求,只要这些请求都在等待,再来一个新请求的时,也能够立即开始处理新的请求。从整体上来看,异步模式的系统响应应该更快,即使不总是能够最快的返回所有请求的数据,但是也能够更快速的开始反馈,当然这需要有一个优良设计的系统来支撑,不然异步模式就成为了一次只能响应一个请求的系统。

Load Balancer这样的应用,本身的处理逻辑很简单,只需要按照某种规则将外部的请求转发到内部的某一台Server上,然后将Server的response返回给用户。但是这样的应用是直接面对并发的,后台应用可以使用大量的节点的cluster,但是Load Balancer总是要单独面对。同时能够处理大量的IO正是异步系统的特长。采用异步的方式,Balancer可以同时打开大量的Socket(对外及对内的),而不需要消耗线程资源来等待。Nginx正式采用了异步的模式,也就是基于Event的模式来达到极高的负载能力和响应速度的。

总结一下,异步模式适合于有大量IO操作,需要花大量时间在IO等待的应用,而不是适合于需要大量CPU计算的应用。我们经常开发的基于CRUD的系统正是这样一种有着大量IO等待的应用。

Advertisements
Posted in 计算机与 Internet | 1 Comment

Move to WordPress

Finally, Live Space will be shutdown and all blog will move to WordPress. Maybe this is good news, but for us, Chinese, it is not what we want although WordPress is better than Live Space. The reason is GFW.

Posted in Uncategorized | Leave a comment

Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

Posted in Uncategorized | 1 Comment

It is long time no update this blog

Windows Live changed a lot. Seems more powerful.
Posted in Uncategorized | Leave a comment

Vista Can’t Sleep into S3(STR)

S3 – STR means Suspend to RAM. It is a power saving mode.

In S3 mode, computer can sleep and turn off almost all devices even fans. Power suppler only supply power to ram. It use very low power. When turned on a computer in s3 mode, OS can continue working inmediately.

I installed vista to my desktop computer. But it could’t turn into s3 mode. When I turned off computer to s3 mode, OS couldn’t wake up again and says "computer didn’t turn off properly and must restart". So, I searched in google, and found many problem about vista can’t wake up from sleep or hibernate. A description in microsoft websit is very similar to my problem:

"When you resume a Windows Vista-based computer from sleep, you may experience unexpected behavior from a USB device. This problem occurs on a computer that uses Open Host Controller Interface (OHCI) host controllers. This problem may cause unexpected behavior."

I have a MS mouse that was pluged into MS Keyboard’s USB Hub. I thought maybe it is reason. I tried to plug mouse to computer directly and turn of computer to s3 mode. When I turned it on, computer woke up immediately and worked very well.

Posted in 计算机与 Internet | Leave a comment

Vista的桌面

Vista的桌面照片真是太漂亮了,这两天在网上找到一篇文章,是采访为Vista拍摄桌面照片的作者的。
拍摄照片的人是科威特人 Hamad Darwish,业余摄影爱好者,涉足摄影也就几年的时间,但是拍摄的照片质量真实没得说。
微软在Flickr上找到了他,并询问他是否愿意为他们拍摄一组风景照片,但是并没有署名是微软,HD接受了邀请,然后微软给他发了EMail,是一份协议书,这时候HD才知道他是在为微软设计室工作。
HD接受了邀请后用了12天时间在Oregon南部的海边拍摄了6000多张照片,并为微软选出了15张,微软从15张中选中了5张作为Vista的桌面。

Hamad Darwish在Flickr上的地址:http://www.flickr.com/photos/darwishh/
 
 
Posted in 兴趣 | Leave a comment

Vista用什么杀毒软件??

    Vista RTM发布了快一个月了,我也赶时髦,装了一个Vista来用,英文版的用起来也很不错,在其上Office 2007英文版,感觉很完美。也没有想象中的那样耗费资源,日常处理还是很流畅的。感觉最好的还是Vista自带的驱动程序,太多了,我的计算机完全不用自己安装任何驱动程序,全部硬件都可以识别,调制解调器的驱动也可以通过上网更新自动安装。用Vista玩了一下魔兽世界,Vista自己带的显卡驱动也很不错,起码我在xp下用的Intel驱动还总是出现异常,画面破裂的现象,Vista下完全没有这个问题,而且很稳定,速度也很好。

    用了半个多月的Vista,个方面都很满意,但是杀毒软件一直是一个很头痛的问题。目前大部分的杀毒软件的厂商都提供了对Vista的支撑,以前在xp下用symantec antivirus,被恶意软件害过一次,因此还了kaspersky,开始使用vista后自然也选用了kaspersky的vista版,虽然还是beta阶段。开始没有觉得有什么问题,后来在往一台内网上的服务器复制一个比较大的文件的时候(300M多),出现了复职窗口始终显示在计算复制时间的提示,然后就没有任何反应了,等待了很久还是一样。把kaspersky的文件监测关闭后问题依然存在,直到把kaspersky卸载后问题不在出现。因此只能换了Symantec antivirus的Vista版。symantec的杀毒软件还是比较稳定的,不过好像感觉到收邮件的时候,对邮件的检测性能很低,一封40M的邮件根本收不下来,关闭邮件检测后,就能够很快的下载下来。昨天看到kaspersky发布了新的vista下的测试版,安装了一下原先的问题还是没有解决。不知道是我的vista安装的有问题还是kaspersky的问题。现在已经不知道用哪个杀毒软件好了。

    另外,还有一个问题就是我的Office 2007的outlook无法使用,一打开邮件就出错关闭,开始以为是我安装的中文版有问题,换成了英文版还是一样。说不能用也不完全正确,其他安装后第一次使用出现了错误,重启系统后问题就不存在了,因为我的计算机一般都是休眠,所有接下来的2天都是好的。在系统在一次重启后,outlook又开始罢工,知道现在也无法使用,只能用vista自己带的Windows Mail了。

Posted in Uncategorized | Leave a comment