高并发网络服务的思考

最近一直在学习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等待的应用。

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

没有计算机的日子

公司给配备的笔记本又坏了,上周末终于坚持不住,送去维修. 从上周五开始就没有计算机用了,只能在公司随便找个服务器暂时用用,每天上班都不知道能干什么,郁闷啊。对于我来说,如果一段时间没有计算机用,不能上网,真是不知道还能做什么了。

想想现在的生活,什么都可以没有,每天可以不出门,但是如果没有电,日子就没法过下去了。家里偶尔停电一天,肯定是不会在家里呆着,只能在外面流浪一天。真不知道以前的人们是怎么生活的。没有网络,没有电视,没有电,没有自来水,如果让我回到那个时代,估计肯定是要经审分裂的。

Posted in Uncategorized | Leave a comment

转贴–关于中国经济的一片文章

    虽然我一向标榜远离政治,对所谓的世界大势有一种与生俱来的失望。但最近的很多很多事情,还是让我觉得有某种东西如梗在喉,不吐不快。 我厌恶评论,因为评论家大多只是坐而论道的好手,一旦起而行之,则捉襟见肘。站着说话不腰疼,固然很惬意。我知道有一天我也许会因为我说的这些而打了自己的嘴巴。

    但我还是决定要说,就如鲁迅先生所说,如果一个房子里的人要闷死了,你把他叫醒固然很残忍,但,如果你把所有的人都叫醒,又怎么没有可能把房子打一个洞来透气呢? 我知道,也许我也不能把这座房子建的更好,但希望我说的话,能够给别人一些启示或者思索,这些启示或者思索中,也许就有建房子的高手呢。

    我今天要说的是,到底谁在抛弃中国? 这个问题看起来太大,几乎无从说起。我还是从细微处说起吧。 昨天看到一个贴子,内容是这样的:

房改是把你腰包掏空,教改是把你二老逼疯,医改是要提前给你送终。

    很好玩的一个贴子,却很真实的反映了我们改革的一个现实。中国的未来在哪里?我们要走向美国,还是变成下一个拉美?我们常常可以听到这样一句话,美国的现在就是我们的未来。这句话让我们生出很多美丽的遐想,好像我们真的再这样埋头苦干很多年,就一定能赶英超美,过上欧美人的幸福生活。但是现在,在我们看来,也许赶英超美不过是一个美丽的遐想,也许中国貌似强大的经济外表之下已经暗流涌动,也许歌舞升平之下已经危机四伏。为什么要提拉美? 在我们的主流视野里从来都没有拉美,在我们的概念里,拉美这个名词不比非洲高等多少。我们是不屑于提拉美的,那里滋生着一切资本主义的毒瘤,贫富分化,社会动荡,政治独裁,经济畸形发展,拉美人在独立以后,瞎折腾了200多年,还是处于第三世界。 我们怎么能把自己和拉美比?拉美人第一次进入我们的视线,大概是在去年,我们在谈论中国汽车业的未来走势时,第一次提到这个词,后拉美化。有人对当时世界汽车巨头纷纷进入中国,瓜分市场提出了自己的忧虑,说中国汽车如果不能走自己独立发展的品牌之路,而企图以市场换技术,最后只能如同拉美的汽车市场一样,沦为世界汽车巨头的加工厂,在食物链底层,抢食一点点残羹冷之。永远不可能在世界市场上与他们并驾齐驱。而更重要的是,以低廉的劳动力换来的投资必将不会长久,因为一旦出现劳动力成本更低的市场,跨国巨头马上就会进行产业转移,到那个时候,中国汽车业就会被抽空,拉美的今天就是中国的未来。这种担忧不无道理。而我今天要说的,不仅仅是中国的汽车业,而是中国的整个未来。我们要走向何方?是发达的欧美,还是混乱的拉美?

    郎咸平在华工(我不知道具体是那所大学的简称)演讲的时候,对大学生们说,“30年以后写信给你女儿的时候你可能会写,你在别国当保姆的日子还好吗?”“如果信托制度一直缺乏,那么改革将会把我们带到菲律宾而不是美国。”大学生莫名惊诧。其实我觉得倒真没有什么可惊诧的。这个道理连我都能想明白,我们中国的那些精英阶层,喝过洋墨水,读过哈佛剑桥的,谁能不心知肚明呢?但是愿意把它讲出来,讲给我们懵懵懂懂的大众和青年学生的,估计只有郎咸平一个人了。有些东西是得多用脚趾头想想。上帝给我们一个脑袋,不是为了让我们整天琢磨同事有没有比我多发多少工资或者邻居的老公为什么比我能挣钱的。记得在中学学世界近代史的时候,曾经就有一个问题一直想不明白。为什么拉美国家独立的时间和美国差不多,到最后发展的差距咋就这么大呢?历史书告诉我们,那是因为帝国主义的掠夺。我一直觉得那是狗屁,如果一对小兄弟一起长大,有一天哥哥对弟弟说,从今天开始,你归我管了,你挣的钱归我,做弟弟的能愿意?据说拉美国家独立以后,很快就变成了美国的后院。不过这是结果,可不是原因了。之所以美国能把他们当后院,还不是因为几十年之后,当哥哥的已经比弟弟强大了好多,敢于对弟弟说,你挣的钱要是不给我,看我不揍你。当然,我当时是想不明白的。我面对这样的答案,也不过就是在心里说句狗屁,除此之外,是断然提不出反对意见的。但现在,我敢说,也许真实的答案已经被我们发现,并且他正在困扰着我们的中国。拉美与美国的差距在于,它没有形成良好的财富再生体制,套一句比较主流的话,它缺乏一种财富积累上的可持续发展能力。举一个简单的例子来说明这样的差别。

第一种情况:
    假设在一个地方发现了金矿,来了一个人投资建了一个矿场,雇一百个工人为他淘金,每年获利1000万,矿主把其中的50%做为工人工资发下去,每个工人每年收入5万,他们拿一万来租房子,剩下的四万可以结婚,生孩子,成家立业,矿主手里还有五百万,可以做投资。因为工人手里有钱,要安家落户,所以,房子出现需求。于是矿主用手里的钱盖房子,租给工人,或者卖给工人。工人要吃要喝,所以,开饭店,把工人手里的钱再赚回来。开饭馆又要雇别的工人,于是工人的妻子有了就业机会,也有了收入。一个家庭的消费需求就更大了。这样,几年之后,在这个地方出现了100个家庭。孩子要读书,有了教育的需求,于是有人来办学校,工人要约会,要消费,要做别的东西,于是有了电影院,有了商店,这样,50年过去以后,当这个地方的矿快被挖光了的时候,这里已经成了一个10万人左右的繁荣城市。

       
而第二种情况是这样的:
  假设同样发现了金矿,同样有人来投资开采,同样雇100工人,同样每年获利1000万,但是矿主把其中10%作为工资发下去,每个工人一年1万。这些钱只够他们勉强填饱肚子,没有钱租房子,没有钱讨老婆,只能住窝棚。矿主一年赚了900万,但是看一看满眼都是穷人,在本地再投资什么都不会有需求。于是,他把钱转到国外,因为在本地根本就不安全,他盖几个豪华别墅,雇几个工人当保镖,工人没有前途,除了拼命工作糊口,根本没有别的需求。唯一可能有戏的就是想办法骗一个老婆来,生一个漂亮女儿,或许还可以嫁给矿主做老婆。50年下去以后,这个地方除了豪华别墅,依然没有别的产业。等到矿挖完了,矿主带着巨款走了,工人要么流亡,要么男的为盗,女的为娼。

    一个很简单的例子,其实就是拉美和美国不同的发展轨迹。也许今天美国人应该说,感谢华盛顿,他为美国缔造了最现代最科学的政治体制,感谢亨利·福特,他一手缔造了美国的中产阶级。而拉美国家就没有那么幸运了,他们的大独裁者创造了掠夺性的经济体制,以一种豪强的姿态疯狂瓜分着社会财富,而使整个经济虚脱,再也无力发展。

    这里我们有必要再提一下亨利·福特。古今中外所有的商业人物中,亨利·福特对社会经济的影响无人能出其右。正是他用他的T型车一手缔造了最初的中产阶级,并将美国社会第一个引入了现代社会,(欧洲在这一点上,比美国晚了几十年)。亨利·福特说我要让我的工人能买得起我的T型车,于是他给工人发高工资,他还创造了流水线的生产方式,使汽车大幅降低,于是,福特公司一跃成为最大的汽车公司,于是有了钱的工人可以买汽车,可以买房子,可以做其它的消费,于是中产阶级诞生了。于是在完成西部扩张,在领土上已经没有回旋余地的美国发现了另外一个金矿,迅速成长的中产阶级带动了巨大的需求,支撑起庞大的国内市场,继续拉动经济高速增长。美国从来都是一个依靠国内需求实现经济增长的国家,而中国空有12亿人口,却居然内需不足,不得不靠外贸来拉动经济增长,你说这不是咄咄怪事。你以为你是弹丸之国的日本哪?靠外向型经济就能养得膘满肠肥?12亿人口,谁能养活中国?除了你自己。也难怪现在全世界都在指着你,说你对人家倾销。       
  说到这儿,该说到我们中国的问题了,为什么我们会内需不足,为什么我们会没有强大的中产阶级?我们的财富到那儿去了?我们到底还有多大的持续增长能力。中国用一种渐进的方式完成了自己的资本原始积累。这里边姑且不说什么权钱交易,制度漏洞,不劳而获。没有一个国家的资本原始积累是干净的。但关键就在于,在积累完成以后,我们该怎么做,是继续任贫富分化发展呢?还是创造我们自己的现代社会,创造坊锥形的社会结构。   
  看到那位网友的话真的倒吸一口冷气,我们在做什么?我们的改革是不是正在走向一个反面,以疯狂搜刮普通大众并不多的社会财富来继续换取虚高的发展?今早上看到一篇文章,比较中国和新加坡的十大差距,具体的不说,因为小国毕竟比中国这样一个泱泱大国要好管理得多。但是,让我深思良久的还是新加坡的体制中所投出来的平等思想,那种对普通大众的关怀。而我们,这种声音除了矫揉造作的官员做秀以外,我们看到了哪些实质性的东西?中国从来就没有平等。过去没有,现在没有,将来有没有也很难说。我们只有所谓精英和庶民。当所有的接受过良好教育的青年花一辈子的时间才能买一个安身之所的时候,当一个家庭的一个孩子上学就要掏空家里的一切积蓄的时候,当你在股市上投了钱就相当于捐款,被那些国企老板用什么MBO名正言顺的中饱私囊的时候,当一个农民辛苦一年的收入还不如一个大款吃一段饭的开销的时候,你指望大家不去省吃俭用,疯狂存钱?你指望银行里几万亿的存款能够转化为巨大的需求?你指望消费品市场能够持续火热?你指望有点闲钱的人能够去做更有用的投资而不是作为热钱去炒房?你指望本来就不多的社会财富能够更快更合理流动?我们很穷,因为我们钱本来就不多,却被装在了很少的人的腰包里,我们本来就不富裕,却在银行压一块,在房子上压一块,在股市里套一块,我钱看起来不少,但是就是转不动,都是死钱。于是,少数人手里的钱只能去买LV、卡地亚、施华洛世奇,因为除了这个,他们也没什么可买的了。有些人还跳出来粉饰太平,说什么奢侈中国,狗屁!

    哪个大国的经济能靠几个奢侈品品牌带动起来,再说奢侈品跟你有啥关系啊?你瞎激动什么啊?你要是中国也有几个顶极奢侈品品牌的话,跟着起起哄也还可以。那不过是让法国、意大利多赚点钱而已。这就是我们的中国,我们的农民还没有富裕起来,就已经为孩子的教育问题吐干净了血,我们的中产阶级还没有诞生就已经横遭劫掠,我们到哪儿找内需?我们除了出口,让全世界来养活我们以外,有什么办法?所以,全世界都说你倾销。是啊,12亿人,谁养活得了你啊? 为什么会这样,为什么我们的改革走入了这样的一种境地?教育收费,房价高启,股票圈钱,上帝啊,这是啥决策啊。哪个已经富得流油的国家在当初这么迫不及待地从自己的人民手里捞钱?

    我们的精英阶层都到哪儿去了?为什么这种用脚趾头都能想明白的问题,他们就想不明白? 我们的精英阶层到哪儿去了?这个问题很有意思。我想,精英阶层有两个去向,一个被收买了,一个被扼杀了。

    郎顾之争已经让所有的人都对内地的经济学家失望了。为什么整个内地的经济学家会败在一个叫郎咸平的香港人手里?只有一个问题——良知,不是大陆经济学家太笨了,而是他们已经被收买,良知泯灭,除了为主子叫几声以外,已经没有什么别的作用。于是我们的官僚、资本、还有知识界人士就结成了联盟,制定着进一步瓜分财富的计划。于是我们的普罗大众就失去了话语圈,就算惨叫几声,也不会被人听见。

    这是被收买的,还有被扼杀的。 就是青年。

    想起鲁迅先生所说,最有希望的就是我们的青年。但是,又是教育,教育,中国教育,被这些狗屁精英把持的中国教育,一方面掏光你的钱袋,另一方面让你接受填鸭式的知识,除了会背几个狗屁单词之外,几乎剥夺你任何独立思考的能力。好啊,这招真好,真是斩草除根了。郎咸平对大学生说:“我们这一代人不懂法制,也没有良心。”“我们这一代是要早点被淘汰的,把权力交给你们,你们才是未来。”唉,也许郎先生真的不太了解中国的内地,他不知道现在大学生的孱弱肩膀,也许根本就担不起这个担子。 在这样的一个世界里,你该怎么办?保护你自己。这是每个人首先想到的答案,要么离开它,要么让自己变强大,因为别指望政府保护你。记得五年前我就说,中国在进入一个世界急剧分化的时代,我们能做的仅仅是在它分化完之前拼尽全力挤入上层而已。现在我依然说这话。变强大,只有变得强大,你才能保护你自己,保护你想保护的人,你才能让自己的声音被更多的人所听到。最后,想起一句话,如果一个国家不爱自己的人民,你有什么权力要求自己的人民去爱他的国家。

    希望,我们,不要说这句话。

Posted in Uncategorized | Leave a comment

Apache + Tomcat 续

    配置完成了,以为能够正常运行了,结果还没跑多就就发现系统奇慢无比,CPU占用率始终保持在95%以上,而且全部是被Tomcat占用,按理说我按装的几个应用不是很耗费CPU,所以考虑是不是因为分配的内存太小,所以java不停的在GC导致的。重新配置了启动参数,分配了初始256M内存,最大512M内存。启动后没有访问几个页面,又出现了CPU被长期占用不释放的情况。这次可以肯定不是GC的问题了。尝试着把Apache关闭,单独运行Tomcat,在关闭Apache后,Tomcat也就立刻释放了CPU的占用,连续访问了很长时间页面,也没有再出现这种情况,所以可以肯定是Apache和引起的,不过到目前为止也不知道是什么原因。目前服务器只能把Tomcat运行在80端口,然后Apache的SVN服务改到88端口访问了。

Posted in 计算机与 Internet | Leave a comment