• Feeds

  • Archive for the ‘编程’ Category


    关于阙宏宇lighttpd与mod_cache在twitter上的一些讨论

    6月28日的beta技术沙龙上阙宏宇介绍了lighttpdmodcache,视频及slide在 http://club.blogbeta.com/76.html,modcache是阙宏宇开发的一个lighttpd module, 它在部分程度上可以替代squid。在活动的介绍上提到

    lighttpd是基于事件驱动的高性能web服务器。mod_cache是在lighttpd上运行的缓存插件。lighttpd+mod_cache 搭建的缓存系统,具有配置简单,性能高,在很多大型系统得到了广泛应用。本次活动由mod_cache作者阙宏宇介绍lighttpd的基础知识,讲解 lighttpd高性能的原理,讨论lighttpd的扩展编写方法等高级话题。也将分享mod_cache插件的特点和使用经验。

    在看视频的过程中我在twitter上也分享了阙宏宇的一些观点,同时也引起了一些网友的关注及讨论,部分内容摘录如下(下文每行开头的链接是发言人的twitter ID)

    xmpp: 刚看到阙宏宇的lighttpd mod_cache视频,他的调优建议把keep-alive设成=0(相当于关掉),个人不是很认同

    xmpp: 阙宏宇称”使用lighttpd+mod_cache比squid快一个数量级,原因是lighttpd用event/file, squid用thread/db“ 视频第41分钟

    xmpp: 阙宏宇最后说web server使用多线程是倒退,并拿memcached单线程跑得很好来证明。但是我觉得并不能单纯这么考虑,一是多核CPU被浪费,二是web server(io密集, 慢连接)和cache server特性有区别不能简单相提并论。

    SnaiX: @xmpp 我觉得阙宏宇的言论很有问题,首先所谓的event based也是需要较大消耗的,且,squid有n中模式可以选择,包括了所谓的db based files based。

    xmpp: @SnaiX 是阿,他的软件对于某些场景可能有意义,但是大部分情况还是没法代替squid的,视频最后Q&A也看到,比如没法实现合并多个相同资源的并发请求等

    xmpp: @eishn: “对于任务的处理, 不可避免会涉及到 multithreading 的问题” 是 @yingfeng 提到的,在我的理解,“任务”是指为了返回请求,需要消耗cpu及io等待,直至输出内容返回网络这个执行过程

    yingfeng: @xmpp 读过POSA II便可知道event based只是解决了acceptor端的问题,对于任务的处理,不可避免会涉及到multithreading的问题

    xmpp: @SnaiX: 批评多线程者无非就是批评锁,所以1最极端者就用单线程,2退一步者就线程不共享内存,线程间用消息通讯,3普通多线程通常加锁,因此会带来等待锁(其实Semaphore锁对等待线程没什么开销的)及线程切换开销,因此开发多线程程序只要了解底层原理就没什么恐惧的

    xmpp: @eishn 你说的是实现方法是协程吗,我倒很想看到你说的实现方法详细描述。如果是协程,它虽然避免了锁,但还是存在切换开销,而且也不能随时切换,我觉得如要利用多核优势,多线程是大势所趋

    alpha86: @xmpp 静态文件的请求可以开keep-alive, 动态请求的话其实keep-alive起不到多大效果。

    Joshfeng: @xmpp 我个人觉得keep-alive的设置要看服务器上主要是什么类型的文件

    xiaoxiaolu: RT @xmpp: … 他的调优建议把keep-alive设成=0(相当于关掉),个人不是很认同//就web而言,我挺认同的

    mikespook: RT: @xiaoxiaolu: RT @xmpp: 刚看到….调优建议把keep-alive设成=0(相当于关掉),个人不是很认同//就web而言,我挺认同的// 具体情况具体处理,keep-alive 对小文件友好,对高并发不利~

    rockyzh: @xmpp 同意,现在已经进入多核时代了,当年的squid以高效的单线程著称,现在可得改改了

    TerryTsui: RT: @xmpp: 阙宏宇最后说web server使用多线程是倒退,并拿memcached单线程跑得很好来证明。。。 //memcache 也可以是多线程跑啊

    xiaoxiaolu: RT @mikespook: RT: @xiaoxiaolu: RT @xmpp:调优建议把keep-alive设成=0,个人不是很认同//我挺认同// 具体情况具体处理,keep-alive 对小文件友好,对高并发不利~//高并发看情况,若跳出率很高,就关掉,省事的话,一律关掉

    SnaiX: @xmpp 在他视频20分钟左右的位置,提到squid和lighty的比较。提到“能不用线程就不用线程,尤其是几个线程在做同一个事情,用这种事件驱动的模型更好“,我不赞同,这种并发的目的就是用来做同一个事情的。其次就是线程模型和事件驱动一点也不冲突。

    SnaiX: @xmpp memcached的模型明显是比较简单的模型,为了实现方便而已。所以mc这种东西如果你不适用线程模式或者不对其进行一些特殊优化, 是很难用来吞吐大数据的,因为单线程会使得在write较多数据的时候占用的CPU时间太长,从而直接影响了对别的请求的响应。

    tangfl: @SnaiX @xmpp snaix 应该大力推销一下 csf 模式:前端 event driven,中间任务队列调度,后面线程池处理,完美了。。。

    eishn: @xmpp 阙宏宇说webserv使用多线程是倒退,基本赞同。不过其mcachd例子不妥,常规evt负载亦不低。然单线程异步io性能甚于多线程,高并发场合由 是,故多线程非最佳。然实现逻辑,多线程是最易用的,故最佳形式是以模拟多线程写逻辑,而以单线程异步实现,这也是我的做法。

    jiaojing: RT: @jeffz_cn: rt @xmpp RT: @yingfeng: @xmpp 读过POSA II便可知道event based只是解决了acceptor端的问题,对于任务的处理,…//多线程也只是用来做cpu时间片的分配,协程也是一个不错的选择.切换代价更 小

    SnaiX: @xmpp 我认为,如果仅仅是为了避免多线程所造成的程序复杂度上升而在该使用多线程的地方却不使用多线程,是一种无能的表现。譬如说,有言论说:多线程造成你的程序一旦有问题,整个进程就core dump了,所以不稳定。可关键是,你的程序应该有问题么?

    SnaiX: RT @tangfl: @SnaiX @xmpp 其实CSF也没什么可高深的,只是我觉得需要有这么一个东西,这样很多东西就可控了。做技术的,不能整天靠凑合来凑合去的过日子。

    eishn: @xmpp stackless python 协程可以做到随时切换, 不过不能达到 erlang 那样的协程级别的多核分配, 尽管可以由用户自己非原生实现。协程虽然还是有切换开销, 但是没有无谓切换, 只在类似 io 等待的场合下才会发生切换, 所以切换次数远小于线程。

    jiaojing: RT: @eishn: @xmpp stackless python 协程可以做到随时切换, 不过不能达到 erlang 那样的协程级别的多核分配, …。// erlang的smp也是用多线程(一个核一个线程,ps保证)跑多个scheduler.

    flierlu: 多线程领域也是在不停发展的,近几年 lock-free 和 wait-free 算法逐渐成熟,加上线程局部内存池等等技术,只要设计上不出大问题,肯定能超越多进程

    zhuzhaoyuan: @xmpp: @yingfeng: 读过POSA II便可知道event based只是解决了acceptor端的问题,对于任务的处理,不可避免会涉及到multithreading的问题 || 反对,要看服务类型是IO密集型还是计算密集型的,IO密集型的不需要多线程。

    附加说明

    • 在Twitter中,@表示reply某人, 类似email中的答复,RT表示retweet,类似email中的转发。
    • 从上面看到,Twitter在讨论上处理线索功能上还是比较弱,需要重复RT原文来串联上下文,很需要类似gmail那样conversation的功能。
    • 我的twitter ID是xmpp,欢迎大家follow。

    中国共有多少台服务器-初略估算初窥

    自从看了《编程珠玑》第7章粗略估算之后就养成了一个奇怪的习惯,喜欢去计算身边的数字。比如一个城市共有多少台电梯,中国共有多少座桥梁等。

    粗略估算又叫费米近似(Fermi problem),比如坐广州到深圳的和谐号动车组时候就想,广深线每分钟进入火车站人流量有多大?这个似乎要请专业的调查公司才能得到结果,但实际上每个人几乎都可以算出来,尤其是程序员。

    1. 和谐号列车有8个车厢,1号和8号是头等车厢,一般坐不满 ,满员估算50人。除去5号餐车。因此共有5×100+100=600个座位。
    2. 15分钟一趟,每天从6点到22点,共发车18*(60/15)=72次
    3. 根据观察,广深线平时都有座位,但也不会太空。假如平均坐满70%座位的话,每天单向人流量为 72 * 600 * 70% = 30240 人
    4. 每分钟人流量为30240/18/60=28人
    5. 进一步考虑,需要几个售票窗口。估算平均每个乘客购票需要15秒,则至少7个窗口才不会引起排队现象。这跟平时观察一致,平时非高峰时刻如果窗口在5个以下会出现排长队现象。

    72法则

    72法则是会计上的一个经验。假设最初投资金额为100元,复息年利率9%(r%),利用“72法则”,将72除以9(增长率),得8(y),即需约8年时间,投资金额滚存至200元(两倍于100元),而准确需时为8.0432年。上面的r和y换成任何数字,只要相乘总数是72, 该法则都成立。

    72法则在初略估算中经常要用到,比如上面广深线的例子,假如客流月增长率3%, 则24月之后,广深线客流量会翻一番。(24*3=72)

    编程领域估算

    服务器编程领域经常面临预先估算,因为在程序开发前实际的场景并不存在。据去年《程序员》杂志介绍,奥运订票网站的瘫痪,是因为每秒请求数超过2200次。假如这个请求数都不能预先估算到的话,应该算是架构设计的失败。

    更多有趣例子及深入阅读

    • 中国共有多少台正在运行中的服务器?
    • 你有多少根头发?
    • 成年人体的骨头块数。
    • 孔子的出生年份(公元)

    更多有趣的例子可参看美国马里兰大学更多初略估算测试大全(英文)

    5%的神话(关于开发效率与职业方向)

    Bruce Eckel(Thinking in Java/C++作者) 在他的 5%的神话 (Mythical 5%) 中提到:

    5%的程序员开发效率是其他95%程序员的20倍

    (5% of programmers are 20x more productive than the other 95%)

    按照80-20法则,80%的程序员几乎不看书,不读Blog,不参加技术会议,不持续学习。这些人也可能会进入大公司,他们日复一日的做着重复的 工作。另外20%则在专业方面比较主动,他们喜欢阅读,喜欢学习,喜欢参加技术活动。这20%当中又会有80%的人可能不会特别成功,他们仍然走在通往成 功的路上奋斗。剩下20%,也就是总数的5%的开发人员具备20倍的开发效率。

    那如何成为这5%中的一员呢

    Bruce Eckel 的观点:阅读,分析,总结,实践

    这5%的人会习惯经常阅读新技术,并喜欢参与各种有潜在价值的新概念的实践,他们会有非常有选择性的参与会议,大部分时间都花在有效率的事情上,将事情做成。

    要想比别人效率高出20%,则需要在各个方面达到平衡,而不单只是能将事情搞定那么简单,因此你要使用最好的工具,最优秀的技术,并尽最大的努力。平衡点并 不是从明显的事物上就可以轻松获得,或者是被人告知的经验,或者是大众化的经验。它需要自己摸索并发现事物背后的规律,需要自己去总结并发现。

    比如我们通常对各种编程语言优缺点熟记于心,我们通常可以脱口而出比如erlang适合大并发场合等等。但是大部分人不会意识到很多场合语言并不重要。

    因此如果你要成为那5你必须持之以恒的坚持学习,多学习编程是有好处的,但是仅仅局限于了解编程是不够的,比如类似以下经验:

    • 代码被阅读的时间比写代码的时间要长,如果你的代码不能被人理解,则没人会去改善或者修改其中的bug
    • Code review是最有成效的改善软件缺陷的方法,但在我们却经常“没有时间来考虑它”

    所以除了精通编程之外,最好多看一些编程方法与协作的书,如并不传授编程技巧的《代码大全》之类的书。

    Jeff Atwood (Coding Horror) 的观点:技术博客重要性

    当然也有持不同观点者,如Jeff Atwood(coding horror作者)则认为经常分享自己的技术体会比coding更重要,能写的人才能成为那5%。他曾经横穿北美,从美国西岸San Francisco到加拿大的东岸Montreal去给一个大学的学生讲技术Blog的重要性。他在这篇Is Writing More Important than Programming(ppt, 3mb)演讲中提到:

    大部分我景仰的程序员都是通过其blog让我景仰,而不是他的代码

    ……大部分不写blog程序员的理由有:太忙;写了也没人看;没有合适内容可写;觉得自己不善长表达等。

    Jeff Atwood大部分观点我是深表赞同的,可喜的是身边乐于分享的越来越多。比如新浪开发者博客今年2月才开张,现在已经有100多篇高质量文章了。

    另外我很敬佩的TopLanguage创建者刘未鹏也写过一篇很有名的为什么你应该(从现在开始就)写博客,想必很多朋友都看过。

    其他观点

    国内曾翻译过Erlang程序设计的Trustno1则认为这5%的人必须是钻研paper的人, 而只是看看rss,热衷于参加各种技术会议,搞搞各种可替代性很强的技术的人是不够格的,他在某帖子中提到:

    很简单的两个标准.
    标准一,你看到一个问题的第一感觉”这个事情不学3-4年数学算法光靠捣鼓捣鼓API设计模式肯定搞不定”
    案例一,老板让你做一个从视频里识别出人脸的程序.
    标准二,但凡性能Critial又没有现成方案的东西.
    案例二,老板让你做一个实时的全局照明渲染引擎.

    原讨论在这里 http://www.javaeye.com/topic/380651 其中一些观点也是有争议的,不过话题已经被锁定不让讨论了;)

    总结

    想必看了上面这一系列,你对怎样成为那5%已有自己的见解了。你要的答案或许不在这篇文章里,因为Bruce Eckel提到,大部分成为5%的人的经验是只可意会,不可言传的。