Download - PHP Tek 2008 : APC @ Facebook
![Page 1: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/1.jpg)
Brian M. ShirePHP Tek 2008, Chicago
May 23rd 11:15am-12:15pm
![Page 2: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/2.jpg)
About Facebook
A social utility to communicate & share information
5th most-trafficked website in the world. (source: comScore)
Over 70 million active users.
![Page 3: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/3.jpg)
Customization.
Global collaboration is beneficial!
“Own the stack.”
Open Source
Facebook uses and modifies Open Source technology.....
![Page 4: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/4.jpg)
Provides a significant PHP interpreter performance increase.
Open source allows collaboration, bug fixes and optimizations.
Alternative PHP Cache (APC)
“APC is a free, open, and robust framework for caching and optimizing PHP intermediate code.”
George SchlossnagleDaniel CowgillRasmus LerdorfGopal VijayaraghavanEdin Kadribasic
APC Developers:
Ilia AlshanetskyMarcus BörgerSara GolemonBrian Shire
![Page 5: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/5.jpg)
Motivations for Optimization
http://www.flickr.com/photos/wwworks/2222523486
Save Energy!
![Page 6: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/6.jpg)
Motivations for Optimization
Save Money!
http://www.flickr.com/photos/twon/1526777999
![Page 7: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/7.jpg)
Motivations for Optimization
Better User Experience!
http://www.flickr.com/photos/dnorman/1539617436
![Page 8: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/8.jpg)
Requests per second provide an overall measurement of performance gains.
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.
The APC Advantage
APC User & File
APC User
PHP 2.4 rps
5.2 rps (x2)
22 rps (x9)
29.5 rps (x12)
![Page 9: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/9.jpg)
Start Request
Compilation:
Convert PHP source
into opcodes
Execute opcodes
End Request
APC hook Opcode
Cache
StoreAPC hook
Miss
Hit
Fetch Opcodes
Start Request
Compilation:
Convert PHP source
into opcodes
Execute opcodes
End Request
PHP
Compilation With Opcode Caches
APC
![Page 10: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/10.jpg)
1 <?php2 $output = ’Hello World’;3 if($_GET[‘exclaim’]) {4 $output .= ‘!’;5 } else {6 $output .= ‘.’;7 }8 echo $output;9 ?>
PHP Source
1 ASSIGN !0, ‘HELLO+WORLD’ 2 FETCH_R GLOBAL $1, ‘_GET’ 3 FETCH_DIM_R $2, $1, ‘exclaim’ 4 JMPZ $2, ->6 5 ASSIGN_CONCAT !0, ‘%21’ 6 JMP ->7 7 ASSIGN_CONCAT !0, ‘.’ 8 ECHO $0 9 RETURN 110 ZEND_HANDLE_EXCEPTION
Opcodes
Opcode output generated with the Vulcan Logic Dissassembler (VLD)by Derick Rethans (http://pecl.php.net/packages/VLD/)
From Code to Opcode
![Page 11: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/11.jpg)
apc.php is a web based console.
Monitor apc.php
Located in apc source directory.
Monitor cache size, hit rate, and configuration.
For automated monitoring, use apc_cache_info() and apc_sma_info() with the $limited flag to reduce load.
Browsing of File and User caches.
![Page 12: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/12.jpg)
Monitor apc.php to determine your memory usage.
Performs poorly when memory is at capacity.
Hints optimize hash lookup tables.
Maximum number of files or user entries.
Cache Size and Hints
apc.shm_segments = 1
Allocate extra memory for overhead.
Deleted items remain in the cache until no longer in use.
Facebook: 1.6GB in production, 6GB in development.
Facebook: over 3,000 files and 490,000 user variables.
apc.shm_size = 30
apc.num_files_hint = 1000
apc.user_entries_hint = 4096
![Page 13: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/13.jpg)
Uses file locking operations
Faster alternative to file locks
Stable, not effecient
Architecture specific, Linux Kernel 2.6.x or later
Significant performance gain
Better alternative to Linux Futex Locks
Same performance gain
Stable, wide OS support
Ported from the PostgreSQL project
Runs in user space
Locking Mechanisms
File Locks
IPC Semaphore Locks
Pthread Mutex Locks
Linux Futex Locks
Spin Locks
Facebook: Spin Locks!
![Page 14: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/14.jpg)
0
50
100
60 120 180
Fil
e
APC Locking Performance Comparison Under High Contention
systemuser
0
50
100
60 120 180
IPC
Sem
. systemuser
0
50
100
60 120 180
Fute
x
systemuser
0
50
100
60 120 180
Pth
read
systemuser
0
50
100
60 120 180
Spin
Time in Seconds
systemuser
APC Locking Performance Comparison Under High Contention
![Page 15: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/15.jpg)
APC stats files to determine if they’ve been updated.Start Request
Compilation:
Convert PHP source
into opcodes
Execute opcodes
End Request
APC hook Opcode
Cache
StoreAPC hook
Miss
Hit
stat()Disabling updates will increase performance.
Requires restart or apc_cache_clear() to update.
CVS, SVN and rsync backdate modified times.
stat_ctime checks the creation time for updates.
To Stat or Not to Stat?
apc.stat = true
apc.stat_ctime = false
Facebook: apc.stat = FALSE!
![Page 16: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/16.jpg)
Inspect System Calls Using strace
System calls are expensive!
Inspect them with strace:
> strace -e trace=file httpd -Xstat("/www/html/test.php", {st_mode=S_IFREG|0644, st_size=710, ...}) = 0getcwd("/usr/local/apache/bin", 4095) = 41chdir("/www/html") = 0open("/www/html/includes/1.inc", O_RDONLY) = 7stat("/www/html/includes/1.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/2.inc", O_RDONLY) = 8stat("/www/html/includes/2.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/3.inc", O_RDONLY) = 9stat("/www/html/includes/3.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/4.inc", O_RDONLY) = 10stat("/www/html/includes/4.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/5.inc", O_RDONLY) = 11stat("/www/html/includes/5.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/6.inc", O_RDONLY) = 12stat("/www/html/includes/6.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/7.inc", O_RDONLY) = 13stat("/www/html/includes/7.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/8.inc", O_RDONLY) = 14stat("/www/html/includes/8.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/9.inc", O_RDONLY) = 19stat("/www/html/includes/9.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/10.inc", O_RDONLY) = 20stat("/www/html/includes/10.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0chdir("/usr/local/apache/bin") = 0
![Page 17: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/17.jpg)
Reducing System CPU
Example:
<?php
/* Include some really important libraries */include_once(‘/www/includes/1.inc’);include_once(‘/www/includes/2.inc’);include_once(‘/www/includes/3.inc’);include_once(‘/www/includes/4.inc’);include_once(‘/www/includes/5.inc’);include_once(‘/www/includes/6.inc’);include_once(‘/www/includes/7.inc’);include_once(‘/www/includes/8.inc’);include_once(‘/www/includes/9.inc’);include_once(‘/www/includes/10.inc’);
echo ‘ok’?>
![Page 18: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/18.jpg)
stat("/www/html/test.php", {st_mode=S_IFREG|0644, st_size=710, ...}) = 0getcwd("/usr/local/apache/bin", 4095) = 41chdir("/www/html") = 0open("/www/html/includes/1.inc", O_RDONLY) = 7open("/www/html/includes/2.inc", O_RDONLY) = 8open("/www/html/includes/3.inc", O_RDONLY) = 9open("/www/html/includes/4.inc", O_RDONLY) = 10open("/www/html/includes/5.inc", O_RDONLY) = 11open("/www/html/includes/6.inc", O_RDONLY) = 12open("/www/html/includes/7.inc", O_RDONLY) = 13open("/www/html/includes/8.inc", O_RDONLY) = 14open("/www/html/includes/9.inc", O_RDONLY) = 19open("/www/html/includes/10.inc", O_RDONLY) = 20chdir("/usr/local/apache/bin") = 0
System Call Reduction With apc.stat=FALSE
stat("/www/html/test.php", {st_mode=S_IFREG|0644, st_size=710, ...}) = 0getcwd("/usr/local/apache/bin", 4095) = 41chdir("/www/html") = 0open("/www/html/includes/1.inc", O_RDONLY) = 7stat("/www/html/includes/1.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/2.inc", O_RDONLY) = 8stat("/www/html/includes/2.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/3.inc", O_RDONLY) = 9stat("/www/html/includes/3.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/4.inc", O_RDONLY) = 10stat("/www/html/includes/4.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/5.inc", O_RDONLY) = 11stat("/www/html/includes/5.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/6.inc", O_RDONLY) = 12stat("/www/html/includes/6.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/7.inc", O_RDONLY) = 13stat("/www/html/includes/7.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/8.inc", O_RDONLY) = 14stat("/www/html/includes/8.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/9.inc", O_RDONLY) = 19stat("/www/html/includes/9.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0open("/www/html/includes/10.inc", O_RDONLY) = 20stat("/www/html/includes/10.inc", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0chdir("/usr/local/apache/bin") = 0
apc.stat = TRUE apc.stat = FALSE
![Page 19: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/19.jpg)
Inline garbage collector removes entries from cache as soon as possible.
Spreads load on startup, only caches percent of requests.
The non-blocking write lock is preferred to setting slam_defense.
Read updated files after given delay to prevent loading incomplete files.
“Time to Live”
Entries still in use will be removed after the gc_ttl has expired.
Maximum time a cache entry can remain in cache.
Slam Defenses & TTL
apc.slam_defense = 0
apc.write_lock = 1
apc.file_update_protection = 2
apc.ttl = 0
apc.user_ttl = 0
apc.gc_ttl = 3600
![Page 20: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/20.jpg)
Limits the maximum file size that will be cached.
A regular expression that excludes files from being cached.
Setting to zero causes files to only cache if they match apc.filters.
Filtering Files
apc.max_file_size = 1M
apc.filters = NULL
apc.cache_by_default = true
![Page 21: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/21.jpg)
Monitor Upload Progress
Upload progress support
Update frequency in percent of file size or per byte count
Hidden form input name for apc user variable key
Prefix for the apc user variable key
<form> <input type=”hidden” name=”APC_UPLOAD_PROGRESS” value=”A86DCF0C”> ... </form>
Produces an APC user cache entry “upload_A86DCF0C” containing upload statistics.
The HTML Form:
apc.rfc1867 = On
apc.rfc1867_freq = 0
apc.rfc1867_name = APC_UPLOAD_PROGRESS
apc.rfc1867_prefix = upload_
![Page 22: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/22.jpg)
API
array apc_cache_info ([ string $cache_type [, bool $limited ]] )array apc_sma_info ([ bool $limited ] )
bool apc_store ( string $key , mixed $var [, int $ttl ] )bool apc_add ( string $key , mixed $var [, int $ttl ] )
mixed apc_fetch ( string $key )
bool apc_delete ( string $key )bool apc_clear_cache ([ string $cache_type ] )
bool apc_compile_file ( string $filename )
Info. & Stats.
Insertion
Retrieval
Deletion
File Insertion
![Page 23: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/23.jpg)
User cache stores PHP variables across multiples requests on a per server basis.
Primary commands for utilizing the user cache:
Optimize...Application configuration
Statistics such as site usage, request types, error conditions, timing
Nth tier cache in addition to memcache or other caching service
HTML or other output
Database backed values that only change rarely like product listings
Site behavior like new features, A/B tests, or rate controls
The User Variable Cache
bool apc_store ( string $key , mixed $var [, int $ttl ] )bool apc_add ( string $key , mixed $var [, int $ttl ] )
mixed apc_fetch ( string $key )
Insertion
Retrieval
![Page 24: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/24.jpg)
Control site configuration and features via the user cache.
Datacenter 'B
web Servers:
Datacenter 'A'
Web Servers:
apc_sitevar.php
Spawns requests to multiple web servers
The site updates in the time it takes to make HTTP requests.
Updates are simple and fast for the Engineer.
Engineers Users
Controlling Site Behavior with "Sitevars"
Site-wide Server Variables: “Sitevars”
![Page 25: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/25.jpg)
Facebook primes it’s cache before each 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.
Improve Startup with Cache Priming
Apache is restarted for major code pushes.
bool apc_store ( string $key , mixed $var [, int $ttl ] )
bool apc_compile_file ( string $filename )
Insertion
File Insertion
![Page 26: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/26.jpg)
Serialize Cache Values
Stop Apache
Disallow connections via
iptables or load balancer
Deserialize and apc_store()
values.
Start Apache
apc_compile_file()
PHP source
Allow connections via
iptables or load balancer
Serialized User
Cache Values
Serialized User
Cache Values
Distributed to Web Servers
Master Restart Script
Single Control Server Multiple Web Servers
System
Apache
PHP & APC
Local Disk
APC Priming and Restart
![Page 27: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/27.jpg)
APC Binary Dump (experimental patch)
Allows the abilty to copy the APC memory cache to disk, and reload at a later time.
Ability to load pre-compiled files into your cache.
Ability to load and run code without touching disk or keeping source code on file.
Does not currently support apc.stat=1 mode.
Only works between identical architectures (x86_64 vs. i386, little vs. big endian).
Works only between the same PHP versions.
![Page 28: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/28.jpg)
Prime APC Cache and
apc_bindump_file("gzip://...")
Stop Apache
Disallow connections via
iptables or load balancer
apc_binload_file("gzip://...")
Start Apache
Allow connections via
iptables or load balancer
Binary File Binary FileDistributed to Web Servers
Master Restart Script
Single Control Server Multiple Web Servers
System
Apache
PHP & APC
Local Disk
APC Binary Priming and Restart
![Page 29: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/29.jpg)
Lazy Loading
Significant time is spent copying opcodes from APC.
Only a small portion of the code is executed.
Delay copying until function is called.
Perceived as include() being slow.
Will soon be available as an experimental patch to APC and PHP.
include('library.php');
library_function();
exit();
<?php // Normal LoadingCopyALL
Functions
APCFunctions
ExecuteSingle
Function
include('library.php');
library_function();
exit();
<?php // Lazy Loading
APCFunctions
Copy Single
Function&
Execute
![Page 30: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/30.jpg)
Installation via “pecl install apc”or source http://pecl.php.net/packages/APC/
Start with a basic apc.ini file:
apc.enabled=1apc.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 spin locks.
Try the apc.stat=0 setting.
Measure changes in CPU usage and maximum requests per second.
Getting Started
![Page 31: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/31.jpg)
Further Information...
I appreciate feedback/questions about APC, patches, this talk, and anything else! <[email protected]>
More implementation examples in Lucas Nealan's “Facebook Performance Caching”http://sizzo.org/wp/talks/
Slides, and patches will be available at http://tekrat.com
![Page 32: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/32.jpg)
Acknowledgments
George SchlossnagleDaniel CowgillRasmus LerdorfGopal VijayaraghavanEdin Kadribasic
APC Developers:
Ilia AlshanetskyMarcus BörgerSara Golemon
![Page 33: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/33.jpg)
Any Questions?
Q & A
Thank you!
![Page 34: PHP Tek 2008 : APC @ Facebook](https://reader033.vdocument.in/reader033/viewer/2022051608/53f1ef3a8d7f72104c8b4c6c/html5/thumbnails/34.jpg)