Facebook 的 PHP 性能与扩展性

炙手可热的 Facebook 是用 PHP 开发的。随着一些技术交流,逐渐能看到 Facebook 技术人员分享的经验。近期这个 geekSessions 站点上看到 Facebook 的 Lucas Nealan 分享的文档比较有参考价值。

Cache 为 王

任何一个成功的站点都有一套最合适自己的 Cache 策略。

Facebook_Cache_Level.png

Note:这个层次图画的稍微有点问题,不是严格从上到下的。

The Alternative PHP Cache , APC

Facebook 平均每个用户每天要访问超过 50 个页面,PHP的页面载入时间的优化就比较重要了。在 PHP Cache 层,Facebook 采用了 APC

Lucas Nealan 的 PPT 举了一个例子,一个页面显示的时间从 4000 多毫秒降到了 100 多 毫秒。在 apc.stat 关闭的模式下,性能还要更好一些。不过需要重启动或用apc_cache_clear() 来通知更新。

PHP_APC.png

Memcached 层

APC Cache 的是非用户相关的信息,而用户相关的数据 Cache 当然是在 Memcached 中。

Facebook 部署了超过 400 台 Memcached 服务器,超过 5TB 的数据在 Memcached 中。这是当前世界上最大的 Memcached 集群了。也给 Memcached 贡献了不少代码,包括 UDP 的支持和性能上的提升(性能提升超过 20%)。

程序 Profiling

Facebook 开发人员大量采用 Callgrind 、APD、 xdebug 、KCachegrind 等工具进行基准性能测试。任何一个 Web 项目,这也是不可或缺,也是比较容易忽略的一环。所有开发人员都应该具备熟练使用这些工具的能力才好。

补充一下:语言的选择

为什么 Facebook 选择 PHP 而不是其他语言? 用Flickr 的 Cal Henderson 这句话就能说明了: “Languages’s don’t Scale, Architecture Scale”。

从 80-20 的原则看,APC 和 Memcached 是最主要的。在这两个环节上下功夫,受益/开销比要大于另外几个环节。

(上面的图是从 Lucas Nealan 的文档截的,版权所有是他的)
EOF


18 thoughts on “Facebook 的 PHP 性能与扩展性

  1. xLight

    这个服务器的数量还是比较恐怖的。
    不知道他们使用什么样的架构,如何管理

    Reply
  2. ztka

    我怎么记得facebook是ruby开发的??
    你看看这个
    http://highscalability.com/friends-sale-architecture-300-million-page-view-month-facebook-ror-app
    #
    The Platform
    # Ruby on Rails
    # CentOS 5 (64 bit)
    # Capistrano – update and restart application servers.
    # Memcached
    # MySQL
    # Nginx
    # Starling – distributed queue server
    # Softlayer – hosting service
    # Pingdom – for website monitoring
    # LVM – logical volume manager
    # Dr. Nics Magic Multi-Connections Gem – split database reads and writes to servers

    Reply
  3. bigqiang.openid.cn

    楼上的,所提供的链接说的是一个叫 friend for sale 的facebook 功能应用是用ror开发的。开发这个应用的可不是facebook做的。

    Reply
  4. tesge

    hi Fenng,我下载的Lucas Nealan 的pdf上没有你文章中关于 APC 的那个结构图,是不是我下载的不pdf不全. 能把你下载的URL 告诉下吗? 谢谢

    Reply
  5. 代码罐头

    很可惜国内的很多应用
    在处于争论到底JAVA,RUBY,还是PHP,ASP.NET哪种好的程度上
    只是我没想到他们还在用APC
    似乎APC已经停滞开发很久了.
    如果是400台的memcached.我比较关心他们怎么处理memcached非持久性数据保存的问题
    因为万一其中一台挂了.所有cached的数据就要从头再去DB里面读取.这样性能会一下子下降很多.
    PS.希望和楼主交换下链接
    本人也是研究网站体系架构的
    http://www.hiadmin.com

    Reply
  6. cmpan

    为什么说“似乎APC已经停滞开发很久了.”
    让我感觉老外说中国男人都留着辫子

    Reply
  7. xueyong

    代码罐头 的评论:
    因为万一其中一台挂了.所有cached的数据就要从头再去DB里面读取.这样性能会一下子下降很多.
    设计上可以每台cache分别对后台M台db散列进行缓存。
    这样一台cache失效时,台每台db只要承受全部数据的1/N(N是cache数量)的操作压力(最优化情况下),所以这就是DB处理的底线了。
    我觉得比较复杂,不过大公司应该可以实现吧。呵呵
    ultraice#gmail#com

    Reply
  8. whitedog

    facebook之所以如此庞大的硬件开销,恰恰是因为,当初开始设计的时候就没有进行有效的软件框架设计。
    php最大的好处就是简单,宜用,我用3天学完,2个星期就开发一个生物实验用的信息平台。
    但是,问题在于php不能很好的让后台和前台有效分隔,而后台的可扩展性和分不性根本就是依靠于php不同的框架,其实说白了facebook后台用了很多C/C++还有Java之类的语言来辅助。

    Reply
  9. visvoy

    这个是做多副本轮询,一个挂了还有其他几个副本,直到全部挂了才会去db里面重建,当然在全挂之前个mc服务器会自动修复挂掉的副本,所以去读db的几率很小

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *