« xcode,cocoa开发:如何使用第三方的dylib | Main | 匿名网民的安全指南(1) »

beta技术沙龙:lighttpd , mod_cache , 进程线程以及其他

作者:virushuo 发表于 2009-07-15 00:07 最后更新于 2009-07-16 10:07
版权声明:按照by-nc-sa的cc协议可转载,拒绝采用“独家” 授权媒介(含网站和平面媒体)转载、引用、链接,除非获得本人许可。转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。


阙宏宇是我相当佩服的程序员,做同事的一段时间里,让我学到了很多东西。从当年就看他在做lighttpd的缓存扩展mod_cache,也实际使用情况。近几年这东西经过几次改进,越来越好用。甚至创下过单服务器跑满1G网卡的记录。这次很高兴能有机会请他来beta技术沙龙分享一些经验。

他所在的环境也非常好,有相当大的流量可以实际应用,这也是大部分人难得的机会。我看到了很多人在twitter上的相关讨论,如果有机会,希望你们也能来beta技术沙龙,分享下你的经验,不同行业下的背景肯定不一样,这是相当有讨论价值的。

争论最多的地方应该是 线程/进程 。这是永恒的争论,频率大概只小于"java好还是C#好"。这几天在Top Language组里面也在讨论线程和进程的问题。按照我个人有限的经验,我更倾向于多进程,尤其是存在共享数据区域的时候,多线程的写还是挺容易出问题的,更不容易调试。一种说法是:使用锁是基本功,但我宁可采用多进程,分开数据区域。(mod_cache的多个进程之间也是不共享数据的)。当然,这事关应用场合,对于缓存来说,这种处理完全可行。确实有一些情况必须使用多线程写,但这种情况我也没觉得线程比进程能好多少。事实上,除了图形界面程序,我个人不打算在任何地方应用多线程了。

也有说法认为多进程是浪费了多个核。其实不然,服务器程序是连续处理的,虽然进程之间存在等待和数据复制的问题,但多个任务的连续处理正好可以弥补这个空闲,计算资源不会被浪费。用个不怎么贴切的例子来简要说明一下吧:文件下载的时候,如果下载一个文件,分开多个线程,同时下载多个块能加快一些速度,而如果有多个文件下载,那么所有文件都单线程下载,但多个文件同时进行,最终速度是差不多的。前者需要处理锁,后者什么都不用管,简单很多。

这样做设计上可能需要花一些心思,不过我觉得比处理锁还是容易点。如果说"用好锁是程序员的基本技能",我认为能够正确的划分数据区域和任务,降低耦合也是必须的基本技能。这样划分好之后,程序是可以分布在多台机器上(当然通讯开销更大),未来的扩展余地更大。(仍然是要看应用场合的)

twitter上看有朋友提到更好的解决方式是erlang。不过这个我尚未涉足,不甚了解。不敢乱说,还希望有实际经验的朋友能写点东西分享。

继续说回lighttpd和mod_cache。这个组合其实是相当不错的,也有过很大的应用考验,可以放心用了。基于lighttpd,我也写了一个mod,用来做转发。用途是从某个url pattern转向某个端口。一般人可能用不到这个功能,也没什么成熟产品。于是我就基于lighttpd写了一个,效果很好,目前已经运行了500多天无故障。

在大量并发请求的时候,我认为event base是个不错的选择。我对lighttpd 1.5的实现不太满意。但1.4是相当不错的。现在作者不怎么活跃,不过已经足够用了,代码也相对简单,有问题可以自己改改看。是个不错的选择。

这次活动有视频记录,ppt和视频都在这里可以看到。

另,下次活动主题是:大型网站的lucene搜索实战,欢迎到时候来参加和讨论。

相关文章:
blog comments powered by Disqus
CC License. Some rights reserved.
署名·非商业用途·保持一致
本站之所有未作特别说明的内容均使用 创作共用协议.
POWERED_BY_MT_3.2