SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
Facebook Performance
      Caching



           Lucas Nealan
        DC PHP Conference
    November 7, 2007, 16:00 – 17:00
Facebook

Social Platform
Sharing and communicating efficiently
6th most trafficked site in the U.S.*




               * ComScore 2007
Facebook Stats

Over 52 million active users
~ 50 pages per user daily
250,000 new users daily
Over 7,000 platform applications
Facebook Architecture

                                       !5678



         -**. /012",
                       (") *+",




34%#%+
                                  !"#$%$&"'
Complexity
Connecting to all Database is impossible
Large codebase
Scaling affects resources in many ways
  ‣ Memory consumption
  ‣ Socket connection limits
Cache retrieval is ~ 10% cpu-user of most pages
What are the Benefits of Caching?
Caching Layers

    $GLOBALS
       APC
    Memcached
     Database
   Browser Cache
  Third Party CDN
Globals Cache
function cache_get($id, $key, $apc=false) {
  if (isset($GLOBALS['CACHE']["$key:$id"])) {
    $cache = $GLOBALS['CACHE']["$key:$id"]));
    $hit = 1;
  } elseif ($apc && (($cache = apc_fetch("$key:$id")) !==
            false) {
    $hit = 1;
  } else {
    ... // fetch from memcached
    if ($apc) apc_store("$key:$id", $cache);
  }
  if ($hit) $GLOBALS['CACHE']["$key:$id"] = $cache;
  return $hit ? $cache : NULL;
}
Globals Cache
         Avoids unnecessary APC and Memcached requests
         Automatic via abstraction
         But still has function call cost overhead

foreach($ids as $id) {
  if (isset($GLOBALS['CACHE']["profile:$id")) {
    $profile = $GLOBALS['CACHE']["profile:$id"];
  } else {
    $profile = cache_get($id, 'profile');
  }
}
APC
Opcode caching
  ‣ Hundreds of included libraries
  ‣ Thousands of functions
Variable caching
  ‣ Hundreds of MB’s of data
APC User Cache
Non-user specific data
  ‣ Network information
  ‣ Database information
  ‣ Useragent strings
  ‣ Hot application data
  ‣ Site variables
Friends

           Normal      4050ms


            APC        135ms


          apc.stat=0   128ms
APC Opcode Priming
$path      = '/path/to/source';
$exclude   = $path.'/www/admin/';
$expr      = '.*.php';
$files =   split(' ', exec("find -L $path -regex '$expr'
                           | grep -v '$exclude' | xargs"));

// prime php files
foreach($files as $file) {
  apc_compile_file($file);
}
APC+SVN Client Cache Busting
function get_static_suffix($file) {
  global $ROOT;
  if ($version = cache_get($file, ‘sv’, 1) === null) {
    $version = trim(shell_exec(“svn info $ROOT/$file | grep
    ‘Changed Rev’ | cut -c 19-”));

        apc_store(“sv:$file”, $version);
    }

    return '?'.$version;
}
APC + Useragent Strings
Useragent string parsing is inefficient in PHP
Cache parsed useragents in APC for the first 10 minutes
Hit rate of over 50%


Pear implementation available soon:
  ‣ PEAR::Net_Useragent_Detect_APC
Site Variables

Enable/Disable site features across all servers
Configure memcached cluster IP’s
Configure product features
Version memcached keys for invalidation
Site Variables
                   9+;$6<-87-8    !"#                 -.(&91<67686
                   6'"5$'7686
                                  -./01$23
                   -.9&98$7#:#    -./01$23
                                  -./.$'-"+,
                                  -./.$'-"+,4#"5$                                -./.$'-"+,
                   -.<6;&#$7686


                                                                     =$59&98$;




*+;$ B<-8 !$'.$'
                                                                           =2!>?
  -.(&91<67686                                                           !"#$.&' @A
                                        !"#$ %&'"&()$ *+,-+)$
Memcached
Distributed object cache
Facebook currently utilizes > 400 memcached hosts
With > 5TB in memory cache
Facebook contributions:
  ‣ UDP Support
  ‣ Performance Enhancements
Many choices in opensource clients
What to cache?
 User Specific Data
   ‣ Long profile
   ‣ Short profile
   ‣ Friends
   ‣ Applications
 Key versioning
   ‣ sp:6:10030226
Cache Retreival
Create Wrapper functions:
  ‣ cache_get($id, <key>, <miss>, $apc, $timeout);
  ‣ cache_get_multi($ids, <key>, <miss>, $apc);


Cache key callback function:


   function profile_key($id) {
     global $VERSION_SP; // primed site variable
     return “sp:$version:$id”;
   }
Cache Multiget
Sort keys into buckets of servers   foreach($keys as $key => $kdata) {
                                      $host = get_host($key); // hash
For each server                       $keys_hosts[$host][$key] = $kdata;
  ‣ obtain connection               }

  ‣ send requests                   function get_host($key) {
                                      global $servers;
For each server
  ‣ read responses                      $prefix = $key[0].$key[1].$key[2];
                                        $prefix = isset($servers[$prefix) ?
  ‣ deserialize non-scalar types                  $prefix : ‘wildcard’;

                                        $hash = crc32($key);
                                        $host = $servers[$hash %
                                                  count($servers[$prefix]);
                                    }
Cache Multiget
Sort keys into buckets of servers   if (isset($cache_sock[$host])) {
                                      return $cache_sock[$host];
For each server                     }
  ‣ obtain connection
                                    list($ip, $port) = explode(‘:’, $host);
  ‣ send requests
                                    while($try < 5 && !$sock) {
For each server                       $sock = pfsockopen($ip, $port ...);
  ‣ read responses                    $try ++;
                                    }
  ‣ deserialize non-scalar types
                                    stream_set_write_buffer($sock, 0);

                                    $cmd = “get $keysrn”;
                                    fwrite($sock, $cmd);
Profile Multigets
Profile info
Profile installed platform applications
Viewer installed applications
Platform application data
List of friends
Privacy data
Cache Dispatching
cache_get_multi($ids, <key>, <miss>, $apc,
                $pending=false, &$pending_arr);

cache_dispatch();



Combine requests for data from the same memcache server
  ‣ Up to 10% performance improvement
Execute code while the kernel buffers the memcache response
Profile Multigets
                              <?php
<?php                         include_once(...);
include_once(...);
                              •get_profile(true);
parse_arguments();            •get_photos(true);
check_permissions();          •get_applications(true)
check_friends();
                              •get_friends(true)
check_friend_status();        •get_networks(true)
• get_profile();              cache_dispatch();
render_basic_information();
get_friend_details();         parse_arguments();
render_minifeed();            check_permissions();
render_wall();                check_friends();
• get_photos();               check_friend_status();
count_photos();               • get_profile();
• get_applications();         render_basic_information();
render_menu_actions();        get_friend_details();
• get_friends();              render_minifeed();
render_friends();             render_wall();
• get_networks();             get_photos();
render_networks();            count_photos();
render_applications();        get_applications();
                              render_menu_actions();
                              get_friends();
                              render_friends();
                              get_networks();
                              render_networks();
                              render_applications();
Lets make it even faster
Memcached PHP extension
  ‣ Reduced PHP function calling overhead
  ‣ Socket blocking in C instead of userspace PHP
  ‣ UDP support
Friends Again
Memcached extension runs ~ 10% faster realtime than in PHP userspace


                                             Userspace          131ms

                                             Extension          115ms
                                            Extension w/
                                                                122ms
                                                UDP
Serialization
Facebook internal serialization
  ‣ Profiles store 38% less memory in memcache
  ‣ Improves network throughput and realtime I/O




Compression
  ‣ Investigating LZO compression for even more space savings
UDP Memcached
TCP Limitations
  ‣ Maximum simultaneous connect count of ~ 250k
  ‣ Impedes scalability of memcached clusters


Requires a very stable network environment
Occasional misses are acceptible
Reduces kernel buffer memory usage on clients and servers
Supported in Facebook Memcache Extension coming soon
A Dirty Problem
Wrapper functions
   ‣ cache_dirty($id, $key);


Actively dirty cache entries as users change data
Dirty entries between multiple hosting facilities via proxy
Memcached Proxy
  0"1 2"34"3

56%$&"

                                       !.2=:



                       !"#$%$&"' ()
         7389.




                                          :8; ,%-"<$.




                         *%$+,+-. (/
Latency
Proxy deletes only work with low latency between facilities
When facilities are further apart deletes need to be smarter

    5"6 /"78"7

     92%$&"
                           !./0+



                                            !"#$%$&"' ()
                          +%,"-$.




                         !./0+
                         1"234$%


                                             !"#$%$&"' (*
Presention online
http://sizzo.org/talks/



lucas@facebook.com
PHP Development and the
   Facebook Platform

    Dave Fetterman

 Tomorrow 10:30 – 11:15
      Room “A”
Facebook的缓存系统

Weitere ähnliche Inhalte

Was ist angesagt?

Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-ThonApache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-ThonMasahiro Nagano
 
Observability with Consul Connect
Observability with Consul ConnectObservability with Consul Connect
Observability with Consul ConnectBram Vogelaar
 
Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010isnull
 
Static Typing in Vault
Static Typing in VaultStatic Typing in Vault
Static Typing in VaultGlynnForrest
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalabilityWim Godden
 
Puppet and the HashiStack
Puppet and the HashiStackPuppet and the HashiStack
Puppet and the HashiStackBram Vogelaar
 
Php on the Web and Desktop
Php on the Web and DesktopPhp on the Web and Desktop
Php on the Web and DesktopElizabeth Smith
 
Api Design
Api DesignApi Design
Api Designsartak
 
Integrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteIntegrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteBram Vogelaar
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareAlona Mekhovova
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015Fernando Hamasaki de Amorim
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011CodeIgniter Conference
 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksCarlos Sanchez
 
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...Puppet
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterZendCon
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stackBram Vogelaar
 
On secure application of PHP wrappers
On secure application  of PHP wrappersOn secure application  of PHP wrappers
On secure application of PHP wrappersPositive Hack Days
 

Was ist angesagt? (20)

Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-ThonApache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
 
Observability with Consul Connect
Observability with Consul ConnectObservability with Consul Connect
Observability with Consul Connect
 
Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010
 
Static Typing in Vault
Static Typing in VaultStatic Typing in Vault
Static Typing in Vault
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Puppet and the HashiStack
Puppet and the HashiStackPuppet and the HashiStack
Puppet and the HashiStack
 
Php on the Web and Desktop
Php on the Web and DesktopPhp on the Web and Desktop
Php on the Web and Desktop
 
Api Design
Api DesignApi Design
Api Design
 
Top Node.js Metrics to Watch
Top Node.js Metrics to WatchTop Node.js Metrics to Watch
Top Node.js Metrics to Watch
 
Integrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteIntegrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suite
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
 
Php on Windows
Php on WindowsPhp on Windows
Php on Windows
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011
 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
 
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stack
 
On secure application of PHP wrappers
On secure application  of PHP wrappersOn secure application  of PHP wrappers
On secure application of PHP wrappers
 

Ähnlich wie Facebook的缓存系统

Zend Con 2008 Slides
Zend Con 2008 SlidesZend Con 2008 Slides
Zend Con 2008 Slidesmkherlakian
 
Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioningSource Ministry
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetAchieve Internet
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & ToolsIan Barber
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionIan Barber
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppSmartLogic
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principlesPerl Careers
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applicationsTom Croucher
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebMikel Torres Ugarte
 
Tips
TipsTips
Tipsmclee
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: BackendVõ Duy Tuấn
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applicationschartjes
 

Ähnlich wie Facebook的缓存系统 (20)

Pecl Picks
Pecl PicksPecl Picks
Pecl Picks
 
Zend Con 2008 Slides
Zend Con 2008 SlidesZend Con 2008 Slides
Zend Con 2008 Slides
 
Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioning
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and Puppet
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & Tools
 
Memcached Study
Memcached StudyMemcached Study
Memcached Study
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 Version
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails App
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principles
 
EC2
EC2EC2
EC2
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo Web
 
Tips
TipsTips
Tips
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: Backend
 
Sinatra for REST services
Sinatra for REST servicesSinatra for REST services
Sinatra for REST services
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
Frontend Servers and NGINX: What, Where and How
Frontend Servers and NGINX: What, Where and HowFrontend Servers and NGINX: What, Where and How
Frontend Servers and NGINX: What, Where and How
 
Fatc
FatcFatc
Fatc
 

Mehr von yiditushe

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册yiditushe
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2yiditushe
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1yiditushe
 
性能测试技术
性能测试技术性能测试技术
性能测试技术yiditushe
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术yiditushe
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试yiditushe
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训yiditushe
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程yiditushe
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Luceneyiditushe
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍yiditushe
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Actionyiditushe
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1yiditushe
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demoyiditushe
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析yiditushe
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则yiditushe
 
10 团队开发
10  团队开发10  团队开发
10 团队开发yiditushe
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模yiditushe
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模yiditushe
 

Mehr von yiditushe (20)

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1
 
性能测试技术
性能测试技术性能测试技术
性能测试技术
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Lucene
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demo
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则
 
10 团队开发
10  团队开发10  团队开发
10 团队开发
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模
 

Facebook的缓存系统

  • 1. Facebook Performance Caching Lucas Nealan DC PHP Conference November 7, 2007, 16:00 – 17:00
  • 2. Facebook Social Platform Sharing and communicating efficiently 6th most trafficked site in the U.S.* * ComScore 2007
  • 3. Facebook Stats Over 52 million active users ~ 50 pages per user daily 250,000 new users daily Over 7,000 platform applications
  • 4. Facebook Architecture !5678 -**. /012", (") *+", 34%#%+ !"#$%$&"'
  • 5. Complexity Connecting to all Database is impossible Large codebase Scaling affects resources in many ways ‣ Memory consumption ‣ Socket connection limits Cache retrieval is ~ 10% cpu-user of most pages
  • 6. What are the Benefits of Caching?
  • 7. Caching Layers $GLOBALS APC Memcached Database Browser Cache Third Party CDN
  • 8. Globals Cache function cache_get($id, $key, $apc=false) { if (isset($GLOBALS['CACHE']["$key:$id"])) { $cache = $GLOBALS['CACHE']["$key:$id"])); $hit = 1; } elseif ($apc && (($cache = apc_fetch("$key:$id")) !== false) { $hit = 1; } else { ... // fetch from memcached if ($apc) apc_store("$key:$id", $cache); } if ($hit) $GLOBALS['CACHE']["$key:$id"] = $cache; return $hit ? $cache : NULL; }
  • 9. Globals Cache Avoids unnecessary APC and Memcached requests Automatic via abstraction But still has function call cost overhead foreach($ids as $id) { if (isset($GLOBALS['CACHE']["profile:$id")) { $profile = $GLOBALS['CACHE']["profile:$id"]; } else { $profile = cache_get($id, 'profile'); } }
  • 10. APC Opcode caching ‣ Hundreds of included libraries ‣ Thousands of functions Variable caching ‣ Hundreds of MB’s of data
  • 11. APC User Cache Non-user specific data ‣ Network information ‣ Database information ‣ Useragent strings ‣ Hot application data ‣ Site variables
  • 12. Friends Normal 4050ms APC 135ms apc.stat=0 128ms
  • 13. APC Opcode Priming $path = '/path/to/source'; $exclude = $path.'/www/admin/'; $expr = '.*.php'; $files = split(' ', exec("find -L $path -regex '$expr' | grep -v '$exclude' | xargs")); // prime php files foreach($files as $file) { apc_compile_file($file); }
  • 14. APC+SVN Client Cache Busting function get_static_suffix($file) { global $ROOT; if ($version = cache_get($file, ‘sv’, 1) === null) { $version = trim(shell_exec(“svn info $ROOT/$file | grep ‘Changed Rev’ | cut -c 19-”)); apc_store(“sv:$file”, $version); } return '?'.$version; }
  • 15. APC + Useragent Strings Useragent string parsing is inefficient in PHP Cache parsed useragents in APC for the first 10 minutes Hit rate of over 50% Pear implementation available soon: ‣ PEAR::Net_Useragent_Detect_APC
  • 16. Site Variables Enable/Disable site features across all servers Configure memcached cluster IP’s Configure product features Version memcached keys for invalidation
  • 17. Site Variables 9+;$6<-87-8 !"# -.(&91<67686 6'"5$'7686 -./01$23 -.9&98$7#:# -./01$23 -./.$'-"+, -./.$'-"+,4#"5$ -./.$'-"+, -.<6;&#$7686 =$59&98$; *+;$ B<-8 !$'.$' =2!>? -.(&91<67686 !"#$.&' @A !"#$ %&'"&()$ *+,-+)$
  • 18. Memcached Distributed object cache Facebook currently utilizes > 400 memcached hosts With > 5TB in memory cache Facebook contributions: ‣ UDP Support ‣ Performance Enhancements Many choices in opensource clients
  • 19. What to cache? User Specific Data ‣ Long profile ‣ Short profile ‣ Friends ‣ Applications Key versioning ‣ sp:6:10030226
  • 20. Cache Retreival Create Wrapper functions: ‣ cache_get($id, <key>, <miss>, $apc, $timeout); ‣ cache_get_multi($ids, <key>, <miss>, $apc); Cache key callback function: function profile_key($id) { global $VERSION_SP; // primed site variable return “sp:$version:$id”; }
  • 21. Cache Multiget Sort keys into buckets of servers foreach($keys as $key => $kdata) { $host = get_host($key); // hash For each server $keys_hosts[$host][$key] = $kdata; ‣ obtain connection } ‣ send requests function get_host($key) { global $servers; For each server ‣ read responses $prefix = $key[0].$key[1].$key[2]; $prefix = isset($servers[$prefix) ? ‣ deserialize non-scalar types $prefix : ‘wildcard’; $hash = crc32($key); $host = $servers[$hash % count($servers[$prefix]); }
  • 22. Cache Multiget Sort keys into buckets of servers if (isset($cache_sock[$host])) { return $cache_sock[$host]; For each server } ‣ obtain connection list($ip, $port) = explode(‘:’, $host); ‣ send requests while($try < 5 && !$sock) { For each server $sock = pfsockopen($ip, $port ...); ‣ read responses $try ++; } ‣ deserialize non-scalar types stream_set_write_buffer($sock, 0); $cmd = “get $keysrn”; fwrite($sock, $cmd);
  • 23. Profile Multigets Profile info Profile installed platform applications Viewer installed applications Platform application data List of friends Privacy data
  • 24. Cache Dispatching cache_get_multi($ids, <key>, <miss>, $apc, $pending=false, &$pending_arr); cache_dispatch(); Combine requests for data from the same memcache server ‣ Up to 10% performance improvement Execute code while the kernel buffers the memcache response
  • 25. Profile Multigets <?php <?php include_once(...); include_once(...); •get_profile(true); parse_arguments(); •get_photos(true); check_permissions(); •get_applications(true) check_friends(); •get_friends(true) check_friend_status(); •get_networks(true) • get_profile(); cache_dispatch(); render_basic_information(); get_friend_details(); parse_arguments(); render_minifeed(); check_permissions(); render_wall(); check_friends(); • get_photos(); check_friend_status(); count_photos(); • get_profile(); • get_applications(); render_basic_information(); render_menu_actions(); get_friend_details(); • get_friends(); render_minifeed(); render_friends(); render_wall(); • get_networks(); get_photos(); render_networks(); count_photos(); render_applications(); get_applications(); render_menu_actions(); get_friends(); render_friends(); get_networks(); render_networks(); render_applications();
  • 26. Lets make it even faster Memcached PHP extension ‣ Reduced PHP function calling overhead ‣ Socket blocking in C instead of userspace PHP ‣ UDP support
  • 27. Friends Again Memcached extension runs ~ 10% faster realtime than in PHP userspace Userspace 131ms Extension 115ms Extension w/ 122ms UDP
  • 28. Serialization Facebook internal serialization ‣ Profiles store 38% less memory in memcache ‣ Improves network throughput and realtime I/O Compression ‣ Investigating LZO compression for even more space savings
  • 29. UDP Memcached TCP Limitations ‣ Maximum simultaneous connect count of ~ 250k ‣ Impedes scalability of memcached clusters Requires a very stable network environment Occasional misses are acceptible Reduces kernel buffer memory usage on clients and servers Supported in Facebook Memcache Extension coming soon
  • 30. A Dirty Problem Wrapper functions ‣ cache_dirty($id, $key); Actively dirty cache entries as users change data Dirty entries between multiple hosting facilities via proxy
  • 31. Memcached Proxy 0"1 2"34"3 56%$&" !.2=: !"#$%$&"' () 7389. :8; ,%-"<$. *%$+,+-. (/
  • 32. Latency Proxy deletes only work with low latency between facilities When facilities are further apart deletes need to be smarter 5"6 /"78"7 92%$&" !./0+ !"#$%$&"' () +%,"-$. !./0+ 1"234$% !"#$%$&"' (*
  • 34. PHP Development and the Facebook Platform Dave Fetterman Tomorrow 10:30 – 11:15 Room “A”