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 *