Anda di halaman 1dari 30

Brian M.

Shire
PHP Tek 2007, Chicago
May 17th, 10:15-11:15 am

Facebook © 2007
About Facebook

A social utility that connects you with people around you


Networks based around a workplace, region, high school or college

Typical uses:
Look up people around you

See what’s going on with your friends

Share information with people you know

Facebook:
60+ Engineers
200+ Total Employees
23 Million active users in the last 30 days
Facebook Growth
15.5 ●
●●


● 1026
● ●

● ●








1000








● ●




● ●

● ● ●

14



User Accounts ●







● ● ●
● ●





● ●
● ● ●
● ●
● ●
● ●

Page Views per Day ●


● ●
● ●

● ● ●
● ●●



● ●
● ● ●
● ●●

● ● ●● ●


800
● ● ●


●●●
● ●


● ● ●●

12 Exponential (k=1.56/year) ●

● ●








● ●
● ●
● ●

● ● ●●

● ●

●● ●

Exponential (k=0.96/year) ●

●●




● ●



● ●
● ●

● ● ● ●





● ●
● ●●
● ●
● ● ●
● ●

● ●

●● ●
● ●
● ● ●

10

●●
● ● ●

● ●●●●
● ●● ●●
● ●
●● ●
●● ●
●●



●●
●●
●●
●●







600
●●
●● ●

● ● ●
● ● ●
● ● ●

●● ●
● ●



● ● ●
●●
●● ●
●●● ●
●●● ● ●
●●
●●
●●
●●
●●

●●●
●●●
●●●●●
●● ●
●●●
●●●
●●● ●
●●●
●●●● ●
●●● ●
●●
●●● ●
●●●

8 ●●●● ● ●
●●● ●● ●
●●● ● ●
●●● ●
●●●● ●
●●● ●
●●●● ●
● ●
●●●● ●
●●●●● ●
●●●●● ● ●
●●●●
●●●●●
●●●
●●●●●
●●●●● ●●●●● ●
●●●●
●●●●●
●●●●●
●●●●
●●●● ●
●●●●●●●

●●●●
●●●●●●● ●
●●

●●●●
●●●●
●●● ●
●●●●
●●●
●●● ●●
●●●

400
● ●
●●● ●
●●●● ●
● ●
●●
●●●
●● ● ●
●●● ●
●●● ●
●●● ●
●●●● ●
●●●●●
●●●●● ●
●●●●●●●● ● ● ● ●
●● ● ●
● ●
●●● ●
●● ●● ●
●●
●●●
●●● ●

● ●● ●
●●●● ●

6 ●●● ● ● ●
●●●● ●

●● ●● ●
●●● ● ● ●
●● ● ● ● ● ●
●●
●●● ●
● ●
●● ● ● ● ● ●
● ● ●
●●● ● ● ● ● ●
●● ● ●
●●●● ●
● ●
●● ● ● ● ●
●●● ● ● ●
● ●
●●● ●● ● ● ● ●
● ● ●
●●● ● ●
● ● ● ● ● ● ●
● ● ● ● ●
●●● ●

● ● ● ● ● ●
●● ● ● ● ● ●
●● ● ● ● ●

User Accounts Page Views


● ● ● ● ● ● ● ●

●● ● ●
● ●


● ● ● ● ● ● ● ● ● ●
● ● ●
● ● ●● ●



● ● ●
●● ● ● ● ●
● ● ● ●
●● ● ● ● ●
● ●
● ● ● ● ●
● ● ● ● ● ●
● ●

(Millions) (Millions per Day)



● ● ● ●
●● ● ●● ●
● ●
● ●
● ●● ● ●
● ● ● ●
● ● ● ● ●
● ● ● ● ● ● ●● ● ●
●● ● ● ● ● ● ●
●● ● ● ●
● ●
●● ● ● ●
● ●
● ● ●
●●● ●
● ● ●
● ● ● ● ● ●
● ● ● ●●● ●
●● ● ● ● ● ● ● ●
●●● ● ● ● ● ●
● ● ● ● ●
●● ● ● ●

200
● ●

4
●● ●● ● ●
●● ● ● ●
●● ●
●●● ● ● ● ●
●● ●
●● ● ● ● ● ●
●●● ● ● ●●
●●● ● ● ●
●●●●● ● ● ● ● ● ● ● ●
●●● ● ●
●●●● ● ● ● ●
●●● ● ●
●●● ● ● ●
●●● ● ● ●
●●●
●●● ● ●
●●● ●
●●●● ● ●
●●
●●● ●● ● ● ●
● ● ● ●
●●●● ● ●●●
●●●● ●● ●
●●●● ● ● ● ● ●
●●●● ●
●●●●●●●● ●
●● ●
●●●●
●●● ● ● ● ●
●●● ●● ●
●●● ●
●●
●●● ● ●
●● ●● ●
●● ●
●● ●
●●●● ●

● ●
●●●
●● ●
●●● ● ●
●●● ● ●
●● ●
●● ● ● ● ●
●●● ●

●●●● ●
●●●●●●●● ● ●● ●
●●● ●● ●● ● ●
●●●●●
● ●● ● ● ●
●●● ● ● ● ● ●
●●●● ●

●●●
●●● ● ● ● ● ●●● ● ●
●● ● ● ● ● ●●● ● ●
● ●● ●● ● ●●●● ●
● ●●●●●● ●
●●● ● ● ● ● ● ●●●●
● ●●● ● ●●● ● ● ● ●

2
● ●●●●●● ●
●●● ● ●●● ● ● ● ●
● ●● ● ●
● ● ● ●
● ●●● ● ● ● ● ●●● ●●●● ● ● ●
● ● ● ●●● ●●●●● ● ●● ● ● ● ● ● ● ●●● ●● ●
●●
● ● ●● ● ●●● ●
● ● ●●● ● ●● ● ● ● ● ● ●● ●●● ● ● ● ● ● ●
● ●●● ●● ● ● ●
● ● ● ● ●●● ● ● ● ●
● ● ● ● ● ● ● ● ● ●● ● ●
●●● ●● ●● ● ●
●●●● ● ●●● ● ● ● ● ● ● ● ●● ●
● ●● ● ● ● ●● ● ● ●●●
● ●●●● ● ● ●
● ●
●●●● ●● ●
● ●● ●●●●

1.5 18

●●●●●
●●●●●

Date (1.1.2005 to 1.17.2007)

2005 2006 2007


Super Bowl XLI: February 4th, 2007
250

Active Users
(in Thousands per Minute)

200
Sunday, Feb. 11
Active Users Last Minute

Sunday, Feb. 4
150

100

Superbowl Superbowl
Begins Half Ends
time

Time of Day (10am to 10pm PST)

10 12 2 4 6 8 10
Grey’s Anatomy: February 22, 2007
900

Active Users
(in Thousands per 15 Minutes)

850

800

750

700

Grey's Anatomy 6−7pm PST

650

Time of Day (4pm to 8pm PST)

4 5 6 7 8
The Open Source Advantage
Allows proprietary code alterations
Improvements contributed to open source community
Extended range of engineering possibilities
Discussions get voiced in a public forum

Some Facebook open source projects include Thrift, phpsh and the Firefox Toolbar.
http://developers.facebook.com/opensource.php

Facebook proudly uses:


Vallgrind OProfile
Callgrind Memcached
Kcachegrind Python
APD ...
PHP Apache Linux GNU MySQL XDebug

and the Alternative PHP Cache (APC)...


Alternative PHP Cache (APC)
http://pecl.php.net/packages/APC/

APC is a PHP intermediate opcode cache.

Provides a significant PHP interpreter performance increase.

Local user variable cache can also be used for application specific benefits.

Open source allows collaboration, bug fixes and optimizations.


The APC Advantage
Requests per second provide a blunt measurement of performance gains on Facebook’s profile.php page.

Apache/PHP Requests Per Second

Configuration Requests Per Second


PHP 2.47 rps.

APC User 5.24 rps. 2.12 x

APC User & File 22.01 rps. 8.91 x

Facebook 29.56 rps. 11.96 x

Measurements made using Apache Bench (ab) with 1000 total requests, concurrency of 40.
Executed on a dual Dual Core AMD Opteron 2.2Ghz, 8GB RAM.
PHP vs. APC
Start Request Start Request

APC hook Opcode


Cache
Compilation: Compilation:

Convert PHP source Convert PHP source Miss


into opcodes into opcodes

APC hook
Store

Execute opcodes Execute opcodes


Hit

End Request End Request


From Code to Opcode

PHP Source Opcodes


1 <?php 1 ASSIGN !0 ‘Hello+World%21’
2 $output = ’Hello World!’; 2 ECHO !0
3 echo $output; 3 RETURN 1
4 ?> 4 ZEND_HANDLE_EXCEPTION

Opcode output generated with the Vulcan Logic Dissassembler (VLD)


by Derick Rethans (http://pecl.php.net/packages/VLD/)
From Code to Opcode

PHP Source Opcodes


1 <?php 1 ASSIGN !0, ‘HELLO+WORLD’
2 $output = ’Hello World’; 2 FETCH_R GLOBAL $1, ‘_GET’
3 if($_GET[‘exclaim’]) { 3 FETCH_DIM_R $2, $1, ‘exclaim’
4 $output .= ‘!’; 4 JMPZ $2, ->6
5 } else { 5 ASSIGN_CONCAT !0, ‘%21’
6 $output .= ‘.’; 6 JMP ->7
7 } 7 ASSIGN_CONCAT !0, ‘.’
8 echo $output; 8 ECHO $0
9 ?> 9 RETURN 1
10 ZEND_HANDLE_EXCEPTION

Opcode output generated with the Vulcan Logic Dissassembler (VLD)


by Derick Rethans (http://pecl.php.net/packages/VLD/)
<? phpinfo(); ?>

phpinfo() displays configuration information

Verify configuration settings have taken place

Debug configuration problems


Basic Configuration Options

apc.enable 0 Enable APC

apc.enabled_cli 0 Enable APC when running via the command line

apc.mmap_file_mask NULL Name of the file mask where as specified by mmap


Cache Size and Hints

apc.shm_segments 1 One shared memory segment required


apc.shm_size 30
Size needs to hold all file and user entries
@ Facebook:
apc.shm_segments=1 Monitor usage using apc.php
apc.shm_size=648
Extra space is required for deleted entries

Behaves poorly when memory is at capacity

apc.num_files_hint 1000 Hints optimize hash lookup tables


apc.user_entries_hint 4096
Maximum number of files or user entries
@ Facebook:
apc.num_files_hint=100
apc.user_entries_hint=640000
Locking type Locking Mechanisms
File Locks Uses file locking operations
Default Stable, not effecient

IPC Semaphore Locks Faster alternative to file locks

Linux Futex Locks Architecture specific, Linux Kernel 2.6.x or later


EXPERIMENTAL Significant performance gain

pthread mutex Locks Better alternative to Linux Futex Locks


EXPERIMENTAL Same performance gain
Currently Used @ Facebook
More stable, more architecture support

spin Locks Ported from the PostgreSQL project


EXPERIMENTAL Runs in user space
Locking Performance
100

50
File

100

50
IPC Sem

100

50
Futex

100

50
Pthread

100
Percent

50
Spin User CPU

System CPU
0

0 10 15 20 25 30 60 120 180

Seconds
Locking Performance (Overlayed)
100

50
File

100

50
IPC Sem

100

50
Futex

100

50
Pthread

100
Percent

50
Spin User CPU

System CPU
0

0 10 15 20 25 30 60 120 180

Seconds
To Stat or Not To Stat?
Start Request
apc.stat TRUE APC stats files to determine if they’ve been updated
@ Facebook:
apc.stat=FALSE Disabling updates will increase performance stat()
APC hook Opcode
Requires restart or apc_cache_clear() to update Cache
Compilation:

Convert PHP source Miss


into opcodes

APC hook
Store
apc.stat_ctime FALSE CVS, SVN and rsync backdate modified times
@ Facebook:
apc.stat_ctime=FALSE stat_ctime checks the creation time for updates
Execute opcodes
Hit

End Request
Slam Defenses & TTL

apc.slam_defense 0 Spreads load on startup by only caching given percent of requests

apc.write_lock 1 A non-blocking write lock provides a better solution to setting slam_defense

apc.file_update_protection 2 Read updated files after given delay to prevent loading incomplete files

apc.ttl 0 “Time to Live”


apc.user_ttl 0
Maximum time a cache entry can remain in cache.

apc.gc_ttl 3600 Inline garbage collector removes deleted entries from cache as soon as possible.
Entries still in use by a request will be removed after the gc_ttl has expired.
Filters

apc.max_file_size 1M Limits the maximum file size that will be cached.

apc.filters NULL A regular expression that excludes files from being cached.

apc.cache_by_default 1 Setting to zero causes files to only cache if they match apc.filters.

apc.report_autofilter 0 Logs files excluded due to early/late binding issues


Recent Features

apc.include_once_override 0 Optimizes include_once() calls


EXPERIMENTAL

apc.rfc1867 0 Upload progress support


EXPERIMENTAL

apc.localcache 0 A process localized cache


apc.localcache_size 512
EXPERIMENTAL
apc.php
APC Login
Opcode Cache

Refresh Data View Host Stats System Cache Entries User Cache Entries Version Check

General Cache Information Host Status Diagrams


APC Version 3.0.15-dev Memory Usage Hits & Misses
PHP Version 5.2.2-dev
APC Host shirebook.local
Server Software Apache/1.3.37 (Darwin) PHP/5.2.2-dev
Shared Memory 1 Segment(s) with 800.0 MBytes
(mmap memory, file locking)
Start Time 2007/04/30 23:32:27
Uptime 3 minutes
File Upload Support 1

apc.php is located in the APC source directory


File Cache Information
Cached Files 2 (397.6 KBytes)
Hits 15 Free: 798.3 MBytes (99.8%) Hits: 15 (88.2%)
Misses 2 Used: 1.7 MBytes (0.2%) Misses: 2 (11.8%)
Request Rate (hits, misses) 0.08 cache requests/second
Hit Rate 0.07 cache requests/second Detailed Memory Usage and Fragmentation
Miss Rate 0.01 cache requests/second
Insert Rate 0.01 cache requests/second
Cache full count 0

User Cache Information


Cached Variables 0 ( 0.0 Bytes)
Hits 0
Misses
Request Rate (hits, misses)
Hit Rate
0
0.00 cache requests/second
0.00 cache requests/second
User and file cache browser
Miss Rate 0.00 cache requests/second
Insert Rate 0.00 cache requests/second Fragmentation: 0%
Cache full count 0

Runtime Settings
apc.cache_by_default 1
apc.enable_cli 1
apc.enabled 1
apc.file_update_protection
apc.filters
apc.gc_ttl
0

3600
Graphs of hit rates and memory usage
apc.include_once_override 0
apc.localcache 0
apc.localcache.size 512
apc.max_file_size 1M
apc.mmap_file_mask /tmp/apc.IXpNut
apc.num_files_hint 200
apc.report_autofilter 0
apc.rfc1867 0
apc.shm_segments 1
apc.shm_size 800
apc.slam_defense 0
apc.stat 1
apc.stat_ctime 0
apc.ttl 7500
apc.user_entries_hint 162000
apc.user_ttl 7500
apc.write_lock 1
API
http://us.php.net/manual/en/ref.apc.php

array apc_cache_info(string cache, boolean limited) Cache information


array apc_sma_info(boolean limited) Shared memory segment information.

boolean apc_store(string key, mixed value, int ttl) Store key/value pair in cache.
boolean apc_add(string key, mixed value, int ttl) Add key/value pair if key isn’t in cache.

mixed apc_fetch(string key) Fetch the value associated with key.


boolean apc_delete(string key) Delete the value associated with key.
boolean apc_clear_cache(string cache) Clear all entries from the cache.

boolean apc_compile_file(string file) Compile given file and store in cache, bypass all filters.

boolean apc_define_constants(string key, Define an array of key/value constants.


array constants
bool case_sensitive)
boolean apc_load_constants(string key, Assign each key/value constants in cache using define()
bool case_sensitive)
The User’s Cache
User cache stores PHP variables across multiples requests on a per server basis.

Primary commands for utilizing the user cache:


boolean apc_store(string key, mixed value)
mixed apc_fetch(string key)

Optimize...
Application configuration
Statistics such as site usage, request types, error conditions, timing
Nth tier cache in addition to memcache or other caching service
Database backed values that only change rarely like product listings
HTML or other output
Site behavior like new features, A/B tests, or rate controls
Site-wide Server Variables: “Sitevars”
Facebook controls site configuration and features via the user cache.

Controlling Site Behavior with "Sitevars"

Datacenter 'A'
Web Servers:
Engineers Users

apc_sitevar.php

Spawns requests
to multiple web
servers
Datacenter 'B
web Servers:

Updates are simple and fast The site updates in the time
for the Engineer. it takes to make HTTP requests.
Optimus Prime

Facebook primes it’s cache before each code push or server restart.

Ready to serve requests without delay due to compilation or updating cache values.

Handles immediate flood of requests with limited warm-up time.

Starts with same cache state limiting differences between servers.

boolean apc_store(string key, mixed value)


boolean apc_compile_file(string file)
APC Priming and Restart

Single Control Server Multiple Web Servers

System

Disallow connections via Allow connections via


Master Restart Script
iptables or load balancer iptables or load balancer

Apache
Stop Apache Start Apache

PHP & APC


Serialize Cache Values apc_compile_file() Deserialize and apc_store()
PHP source values.

Local Disk
Serialized User Distributed to Web Servers Serialized User
Cache Values Cache Values
Getting Started
Installation via “pecl install apc”
or source http://pecl.php.net/packages/APC/

Start with a basic apc.ini file:


apc.enabled=1
apc.shm_size=100M

Install apc.php under the DocumentRoot, configure the USER and PASS variables
Monitor apc.php for usage and adjust configuration

Try tuning some of the discussed settings to meet application needs


Add some APC user variables
Try different locking types
Try the apc.stat=0 setting

Measure changes in CPU usage and maximum requests per second


APC Developers

George Schlossnagle Edin Kadribasic


Daniel Cowgill Ilia Alshanetsky
Rasmus Lerdorf Marcus Börger
Gopal Vijayaraghavan Sara Golemon

Thank you!