阅读HAProxy代码学习linux下的splice函数用法

    自从linux 2.6.9后linux提供了驱动级的系统函数splice。它的作用是在文件描述符直接转发数据,直接对内核内存块做引用标记而不需要借用用户内存复制数据。这样就大大节省了分配内存,再read和write的性能消耗。
    自己用了一下这个函数发现总是返回EINVAL,于是去阅读HAProxy的源代码,总算弄明白了一些使用条件,理解了这个函数的设计思路。
    可以说splice本来就是用于select/poll/epoll等异步机制或者跨进程的通信,所以要求输入和输出必须至少有一个描述符是管道。于是我们可以看到以下清晰的流程:有数据读取时将来源fd的数据splice到pipe_in,然后异步请求写事件;写事件到来时从pipe_out再splice到目标fd。
    这样的流程处理常见的fd数据复制是够了,但是问题又来了,当处理网络socket描述符的时候,如果并发量很大,难道我们要为每个fd创建一对管道,那对系统是一个巨大的消耗。
    让我们看看HAProxy是怎么处理这个问题的:它用了一个pipe池,每当要做splice的时候就从里面取,不用的时候就放回去,而这个不用的时机很重要,也就是管道里的数据全部复制过去之后,这样管道只会在异步等待写出的短时间里被使用,同时的使用量就没有那么大,系统消耗就大大减小。
    以上就是一点点个人心得,希望对底层开发的程序员们有所帮助。

最后一天了

又在酒店和旁边的沙滩上发了两天呆,好好享受了难得的宁静时光。
今天出来首都逛逛,买点纪念品什么的,一会吃完饭再去逛逛公园,晚上将要登上途经迪拜回上海的飞机了,总的来说这里风光确实非常好,就是东西贵了点,特别是吃,嗯。

登上回马埃岛的船

下午在拉迪各尽情玩了几个小时,岛上的大龟很有意思,老婆还买了当地制造的椰子油。
最后在一片纯白的沙滩游了一会泳。由于遮蔽了海浪以保证安全,海底没有被冲击得那么平,脚底走得有点痛是不足之处。
总的来说今天见识了太多从没见过的新鲜事物,算是新奇而不失愉快的一天。

失败的第一天自由行

两次徒步行走都以走错路而告终,白走了怕是有十多公里路,我脚上起了水泡,老婆更是吃饭都出不了门了。
下定决心以后尽量多坐车。
ps:其实一路风景还不错,可惜老婆一直生气,所以也就没啥心情看风景了。
另:塞舌尔首都维多利亚的电影院居然在放盗梦空间,当然,一共就只放这一部电影,每天也只有两场。

发生在我身上的悖论:懒惰与疑心

    写了这么多年代码,也看了这么多年别人的代码,越来越发现程序员是一个悲剧而矛盾的职业。
    至少在我写代码的时候就充满这样那样的矛盾,比如我喜欢追求运行效率,又喜欢比较优美的代码风格,却不喜欢写注释!
    而最令我苦恼的矛盾就是每个程序员会碰到但不一定会去思考的问题:自己实现,还是用现成库?
    对于懒人来说当然是直接现成的上,对天生自信喜欢一切掌握的人来说当然是自己实现。
    我在一个项目开始的时候也是倾向于自己实现的,毕竟我是个很懒的人。但项目进行到一半的时候我又往往喜欢直接抛弃第三方的库转而用自己写的,原因很简单:我对于不是自己写的东西抱有一定的戒惧之心,觉得万一出问题调试起来比较困难,自己不一定能迅速定位错误(所以我不用boost,ACE之类源代码比较绕的第三方库)。
    这大概就是多疑吧,当然也是对自己做的东西要求比较严格,做事情力求完成即完美的性格在作怪。
    暂时是没什么药可救了,期待自己能慢慢摆正开发心态咯。

近况Big Summary

1. 结婚累到吐奶,到今天算是勉强回满了hp
2. 手头的项目全部都没动过,无限期暂停
3. scala学习进度很慢,时间啊时间……
4. 同时在看android开发
5. 玩sc2完全没上瘾
6. 预订了OpenPandora(http://www.openpandora.org)苦等发货
7. 工作时忙时闲,哥要不是特别淡定一准就要抓狂了
8. 想开个独立的开源游戏项目,不想再写周边
9. 没有一如既往地研究历史,不过下个月可以开始恢复这个习惯了