Caching and tuning fun  for high scalability                           Wim Godden                         Cu.be Solutions
Who am I ?Wim Godden (@wimgtr)Owner of Cu.be Solutions (http://cu.be)Open Source developer since 1997Developer of OpenXZen...
Who are you ?Developers ?System/network engineers ?Managers ?Caching experience ?
Caching and tuning fun  for high scalability                           Wim Godden                         Cu.be Solutions
Goals of this tutorialEverything about caching and tuningA few techniques   How-to   How-NOT-to→ Increase reliability, per...
LAMP
Architecture
Our base benchmarkApachebench = useful enoughResult ?                      Single webserver                    Proxy      ...
Caching
What is caching ?                    CACHE
What is caching ?                                             x = 5, y = 2                                                ...
Theory of caching                                                                            DB                           ...
Theory of caching                            DB                    HIT                          Cache
Caching techniques                #1 : Store entire pages           #2 : Store part of a page (block)           #3 : Store...
How to find cacheable dataNew projects : start from cache everythingExisting projects :   Look at MySQL slow query log   M...
Caching storage - DiskData with few updates : goodCaching SQL queries : preferably notDONT use NFS or other network file s...
Caching storage - Disk / ramdiskLocal  5 Webservers → 5 local caches  How will you keep them synchronized ?        → Dont ...
Caching storage - Memcache(d)Facebook, Twitter, YouTube, … → need we say more ?Distributed memory caching systemMultiple m...
Caching storage - Memcache(d)Facebook, Twitter, YouTube, … → need we say more ?Distributed memory caching systemMultiple m...
Memcache - where to install
Memcache - where to install
Memcache - installation & running itInstallation   Distribution package   PECL   Windows : binariesRunning   No config-fil...
Caching storage - Memcache - some notesNot fault-tolerant   Its a cache !   Lose session data   Lose shopping cart data   ...
Caching storage - Memcache - some notesNot fault-tolerant   Its a cache !   Lose session data   Lose shopping cart data   ...
Memcache in code<?php$memcache = new Memcache();$memcache->addServer(172.16.0.1, 11211);$memcache->addServer(172.16.0.2, 1...
Wheres the data ?Memcache client decides (!)2 hashing algorithms :   Traditional       Server failure → all data must be r...
Benchmark with Memcache                      Single webserver             Proxy                    Static         PHP    S...
Memcache slabs            (or why Memcache says its full when its not)Multiple slabs of different sizes :   Slab 1 : 400 b...
Memcache - Is it working ?Connect to it using telnet               STAT pid 2941                                         S...
Memcache - backing up
Memcache - tipPage with multiple blocks ?→ use Memcached::getMulti()                     Hashing  getMulti($array)        ...
Updating data
Updating data                LCD_Popular_Product_List
Adding/updating data$memcache->delete(LCD_Popular_Product_List);
Adding/updating data
Adding/updating data - Why it crashed
Adding/updating data - Why it crashed
Adding/updating data - Why it crashed
Cache stampeding
Cache stampeding
Memcache code ?    Memcache code     Visitor interface        Admin interface                         DB
Cache warmup scriptsUsed to fill your cache when its emptyRun it before starting Webserver !2 ways :   Visit all URLs     ...
Cache stampeding - what about locking ?Seems like a nice idea, but...While lock in placeWhat if the process that created t...
LAMP...          → LAMMP          → LNMMP
NginxWeb serverReverse proxyLightweight, fast10.2% of all Websites
NginxNo threads, event-drivenUses epoll / kqueueLow memory footprint10000 active connections = normal
Nginx - a true alternative to Apache ?Not all Apache modules   mod_auth_*   mod_dav*   …Basic modules are availableSome 3r...
Nginx - Configuration        server {         listen        80;         server_name   www.domain.ext *.domain.ext;        ...
Nginx + PHP-FPM - performance ?                         Single webserver                    Proxy                       St...
Reverse proxy time...
VarnishNot just a load balancerReverse proxy cache / http accelerator / …Caches (parts of) pages in memoryCareful :   uses...
Varnish - backends + load balancing backend server1 {     .host = "192.168.0.10"; } backend server2{     .host = "192.168....
Varnish - VCLVarnish Configuration LanguageDSL (Domain Specific Language)   → compiled to CHooks into each requestDefines ...
Varnish - whatever you wantReal-time statistics (varnishtop, varnishhist, ...)ESI
Varnish - ESIPerfect for caching pages             Header (TTL : 60 min)              In your article page output :       ...
Varnish with ESI - hold on tight !                         Single webserver             Proxy                       Static...
Varnish - what can/cant be cached ?Can :   Static pages   Images, js, css   Pages or parts of pages that dont change often...
ESI → no caching on user-specific content ?                                           Logged in as : Wim Godden           ...
Coming soon...Based on NginxReduces load by 50 – 95%  Requires code changes !  Well-built project → few changes  Effect on...
Whats the result ?
Whats the result ?
FiguresFirst customer :   No. of web servers : 18 → 4   No. of db servers : 6 → 2   Total : 24 → 6 (75% reduction !)Second...
AvailabilityStable at 2 customersStill under heavy developmentBeta : Jul 2012Final : Sep 2012
Tuning
PHP speed - some tipsUpgrade PHP - every minor release has 5-15% speed gain !Use an opcode cache
Caching storage - Opcode caching
DB speed - some tipsUse same types for joins   i.e. dont join decimal with intRAND() is evil !count(*) is evil in InnoDB w...
Caching & Tuning @ frontend        http://www.websiteoptimization.com/speed/tweak/average-web-page/
Frontend tuning1. You optimize backend2. Frontend engineers messes up → havoc on backend3. Dont forget : frontend sends re...
Tuning frontendMinimize requests  Combine CSS/JavaScript files
Tuning frontendMinimize requests  Combine CSS/JavaScript files  Use CSS Sprites
CSS Sprites
Tuning content - CSS sprites
Tuning content - CSS sprites         11 images             1 image         11 HTTP requests      1 HTTP requests         2...
Tuning frontendMinimize requests   Combine CSS/JavaScript files   Use CSS Sprites (horizontally if possible)Put CSS at top...
What else can kill your site ?Redirect loops   Multiple requests       More load on Webserver       More PHP to process   ...
Above all else... be prepared !Have a monitoring systemUse a cache abstraction layer (disk → Memcache)Dont install for the...
So...Cache  But : never delete, always push !  Have a warmup script  Monitor your cache  Have an abstraction layerApache =...
Questions ?
Questions ?
Were hiring !Lots of challengesWork with cutting-edge technologyVaried :   PHP development   System / network architecture...
ContactTwitter             @wimgtrWeb                http://techblog.wimgodden.beSlides                 http://www.slidesh...
Thanks !                     Please...Rate my talk : http://speakerrate.com/talks/9501
Caching and tuning fun for high scalability @ LOAD2012
Upcoming SlideShare
Loading in...5
×

Caching and tuning fun for high scalability @ LOAD2012

2,622

Published on

Caching has been a 'hot' topic for a few years. But caching takes more than merely taking data and putting it in a cache : the right caching techniques can improve performance and reduce load significantly. But we'll also look at some major pitfalls, showing that caching the wrong way can bring down your site. If you're looking for a clear explanation about various caching techniques and tools like Memcached, Nginx and Varnish, as well as ways to deploy them in an efficient way, this talk is for you.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,622
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
44
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Caching and tuning fun for high scalability @ LOAD2012

  1. 1. Caching and tuning fun for high scalability Wim Godden Cu.be Solutions
  2. 2. Who am I ?Wim Godden (@wimgtr)Owner of Cu.be Solutions (http://cu.be)Open Source developer since 1997Developer of OpenXZend Certified EngineerZend Framework Certified EngineerMySQL Certified Developer
  3. 3. Who are you ?Developers ?System/network engineers ?Managers ?Caching experience ?
  4. 4. Caching and tuning fun for high scalability Wim Godden Cu.be Solutions
  5. 5. Goals of this tutorialEverything about caching and tuningA few techniques How-to How-NOT-to→ Increase reliability, performance and scalability 5 visitors/day → 5 million visitors/day (Dont expect miracle cure !)
  6. 6. LAMP
  7. 7. Architecture
  8. 8. Our base benchmarkApachebench = useful enoughResult ? Single webserver Proxy Static PHP Static PHPApache + PHP 3900 17.5 6700 17.5 Limit : Limit : CPU, network database or disk
  9. 9. Caching
  10. 10. What is caching ? CACHE
  11. 11. What is caching ? x = 5, y = 2 Same result n = 50 CACHE select * from article join user Doesnt change on article.user_id = user.id all the time order by created desc limit 10
  12. 12. Theory of caching DB le t ab fro m ul t res ata ned e ct d retur sel ta = $da if ($data == false) Page GET /page set( key , $ $da fals data) ta = e get( key ) Cache
  13. 13. Theory of caching DB HIT Cache
  14. 14. Caching techniques #1 : Store entire pages #2 : Store part of a page (block) #3 : Store data retrieval (SQL ?) #4 : Store complex processing result #? : Your call ! When you have data, think : Creating time ? Modification frequency ? Retrieval frequency ?
  15. 15. How to find cacheable dataNew projects : start from cache everythingExisting projects : Look at MySQL slow query log Make a complete query log (dont forget to turn it off !) Check page loading times
  16. 16. Caching storage - DiskData with few updates : goodCaching SQL queries : preferably notDONT use NFS or other network file systems especially for sessions locking issues ! high latency
  17. 17. Caching storage - Disk / ramdiskLocal 5 Webservers → 5 local caches How will you keep them synchronized ? → Dont say NFS or rsync !
  18. 18. Caching storage - Memcache(d)Facebook, Twitter, YouTube, … → need we say more ?Distributed memory caching systemMultiple machines ↔ 1 big memory-based hash-tableKey-value storage system Keys - max. 250bytes Values - max. 1Mbyte
  19. 19. Caching storage - Memcache(d)Facebook, Twitter, YouTube, … → need we say more ?Distributed memory caching systemMultiple machines ↔ 1 big memory-based hash-tableKey-value storage system Keys - max. 250bytes Values - max. 1MbyteExtremely fast... non-blocking, UDP (!)
  20. 20. Memcache - where to install
  21. 21. Memcache - where to install
  22. 22. Memcache - installation & running itInstallation Distribution package PECL Windows : binariesRunning No config-files memcached -d -m <mem> -l <ip> -p <port> ex. : memcached -d -m 2048 -l 172.16.1.91 -p 11211
  23. 23. Caching storage - Memcache - some notesNot fault-tolerant Its a cache ! Lose session data Lose shopping cart data ...
  24. 24. Caching storage - Memcache - some notesNot fault-tolerant Its a cache ! Lose session data Lose shopping cart data …Firewall your Memcache port !
  25. 25. Memcache in code<?php$memcache = new Memcache();$memcache->addServer(172.16.0.1, 11211);$memcache->addServer(172.16.0.2, 11211);$myData = $memcache->get(myKey);if ($myData === false) { $myData = GetMyDataFromDB(); // Put it in Memcache as myKey, without compression, with no expiration $memcache->set(myKey, $myData, false, 0);}echo $myData;
  26. 26. Wheres the data ?Memcache client decides (!)2 hashing algorithms : Traditional Server failure → all data must be rehashed Consistent Server failure → 1/x of data must be rehashed (x = # of servers)
  27. 27. Benchmark with Memcache Single webserver Proxy Static PHP Static PHPApache + PHP 3900 17.5 6700 17.5Apache + PHP + MC 3900 55 6700 108
  28. 28. Memcache slabs (or why Memcache says its full when its not)Multiple slabs of different sizes : Slab 1 : 400 bytes Slab 2 : 480 bytes (400 * 1.2) Slab 3 : 576 bytes (480 * 1.2) (and so on...)Multiplier (1.2 here) can be configuredStore a lot of very large objects→ Large slabs : full→ Rest : free→ Eviction of data !
  29. 29. Memcache - Is it working ?Connect to it using telnet STAT pid 2941 STAT uptime 10878 STAT time 1296074240 "stats" command → STAT version 1.4.5 STAT pointer_size 64 STAT rusage_user 20.089945 Use Cacti or other monitoring tools STAT rusage_system 58.499106 STAT curr_connections 16 STAT total_connections 276950 STAT connection_structures 96 STAT cmd_get 276931 STAT cmd_set 584148 STAT cmd_flush 0 STAT get_hits 211106 STAT get_misses 65825 STAT delete_misses 101 STAT delete_hits 276829 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 613193860 STAT bytes_written 553991373 STAT limit_maxbytes 268435456 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 20418140 STAT curr_items 65826 STAT total_items 553856 STAT evictions 0 STAT reclaimed 0
  30. 30. Memcache - backing up
  31. 31. Memcache - tipPage with multiple blocks ?→ use Memcached::getMulti() Hashing getMulti($array) algorithmBut : what if you get some hits and some misses ?
  32. 32. Updating data
  33. 33. Updating data LCD_Popular_Product_List
  34. 34. Adding/updating data$memcache->delete(LCD_Popular_Product_List);
  35. 35. Adding/updating data
  36. 36. Adding/updating data - Why it crashed
  37. 37. Adding/updating data - Why it crashed
  38. 38. Adding/updating data - Why it crashed
  39. 39. Cache stampeding
  40. 40. Cache stampeding
  41. 41. Memcache code ? Memcache code Visitor interface Admin interface DB
  42. 42. Cache warmup scriptsUsed to fill your cache when its emptyRun it before starting Webserver !2 ways : Visit all URLs Error-prone Hard to maintain Call all cache-updating methods Make sure you have a warmup script !
  43. 43. Cache stampeding - what about locking ?Seems like a nice idea, but...While lock in placeWhat if the process that created the lock fails ?
  44. 44. LAMP... → LAMMP → LNMMP
  45. 45. NginxWeb serverReverse proxyLightweight, fast10.2% of all Websites
  46. 46. NginxNo threads, event-drivenUses epoll / kqueueLow memory footprint10000 active connections = normal
  47. 47. Nginx - a true alternative to Apache ?Not all Apache modules mod_auth_* mod_dav* …Basic modules are availableSome 3rd party modules (needs recompilation !)
  48. 48. Nginx - Configuration server { listen 80; server_name www.domain.ext *.domain.ext; index index.html; root /home/domain.ext/www; } server { listen 80; server_name photo.domain.ext; index index.html; root /home/domain.ext/photo; }
  49. 49. Nginx + PHP-FPM - performance ? Single webserver Proxy Static PHP Static PHPApache + PHP 3900 17.5 6700 17.5Apache + PHP + MC 3900 55 6700 108Nginx + PHP-FPM + MC 11700 57 11200 112 Limit : single-threaded Apachebench
  50. 50. Reverse proxy time...
  51. 51. VarnishNot just a load balancerReverse proxy cache / http accelerator / …Caches (parts of) pages in memoryCareful : uses threads (like Apache) Nginx usually scales better (but doesnt have VCL)
  52. 52. Varnish - backends + load balancing backend server1 { .host = "192.168.0.10"; } backend server2{ .host = "192.168.0.11"; } director example_director round-robin { { .backend = server1; } { .backend = server2; } }
  53. 53. Varnish - VCLVarnish Configuration LanguageDSL (Domain Specific Language) → compiled to CHooks into each requestDefines : Backends (web servers) ACLs Load balancing strategyCan be reloaded while running
  54. 54. Varnish - whatever you wantReal-time statistics (varnishtop, varnishhist, ...)ESI
  55. 55. Varnish - ESIPerfect for caching pages Header (TTL : 60 min) In your article page output : /top <esi:include src="/news"/> Latest news (TTL : 2 min) /news In your Varnish config : sub vcl_fetch { if (req.url == "/news") {Navigation Article content page esi; /* Do ESI processing */ (TTL : set obj.ttl = 2m; 60 min) Article content (TTL : 15 min) } elseif (req.url == "/nav") { /nav /article/732 esi; set obj.ttl = 1m; } elseif …. …. }
  56. 56. Varnish with ESI - hold on tight ! Single webserver Proxy Static PHP Static PHPApache + PHP 3900 17.5 6700 17.5Apache + PHP + MC 3900 55 6700 108Nginx + PHP-FPM + MC 11700 57 11200 112Varnish - - 11200 4200
  57. 57. Varnish - what can/cant be cached ?Can : Static pages Images, js, css Pages or parts of pages that dont change often (ESI)Cant : POST requests Very large files (its not a file server !) Requests with Set-Cookie User-specific content
  58. 58. ESI → no caching on user-specific content ? Logged in as : Wim Godden TTL = 0s ? 5 messages TTL=1h TTL = 5min
  59. 59. Coming soon...Based on NginxReduces load by 50 – 95% Requires code changes ! Well-built project → few changes Effect on webservers and database servers
  60. 60. Whats the result ?
  61. 61. Whats the result ?
  62. 62. FiguresFirst customer : No. of web servers : 18 → 4 No. of db servers : 6 → 2 Total : 24 → 6 (75% reduction !)Second customer (already using Nginx + Memcache) : No. of web servers : 72 → 8 No. of db servers : 15 → 4 Total : 87 → 12 (86% reduction !)
  63. 63. AvailabilityStable at 2 customersStill under heavy developmentBeta : Jul 2012Final : Sep 2012
  64. 64. Tuning
  65. 65. PHP speed - some tipsUpgrade PHP - every minor release has 5-15% speed gain !Use an opcode cache
  66. 66. Caching storage - Opcode caching
  67. 67. DB speed - some tipsUse same types for joins i.e. dont join decimal with intRAND() is evil !count(*) is evil in InnoDB without a where clause !Persistent connect is sort-of evil
  68. 68. Caching & Tuning @ frontend http://www.websiteoptimization.com/speed/tweak/average-web-page/
  69. 69. Frontend tuning1. You optimize backend2. Frontend engineers messes up → havoc on backend3. Dont forget : frontend sends requests to backend ! SO...Care about frontendTest frontendCheck what requests frontend sends to backend
  70. 70. Tuning frontendMinimize requests Combine CSS/JavaScript files
  71. 71. Tuning frontendMinimize requests Combine CSS/JavaScript files Use CSS Sprites
  72. 72. CSS Sprites
  73. 73. Tuning content - CSS sprites
  74. 74. Tuning content - CSS sprites 11 images 1 image 11 HTTP requests 1 HTTP requests 24KByte 14KByte
  75. 75. Tuning frontendMinimize requests Combine CSS/JavaScript files Use CSS Sprites (horizontally if possible)Put CSS at topPut JavaScript at bottom Max. no connections Especially if JavaScript does Ajax (advertising-scripts, …) !Avoid iFrames Again : max no. of connectionsDont scale images in HTMLHave a favicon.ico (dont 404 it !) → see my blog
  76. 76. What else can kill your site ?Redirect loops Multiple requests More load on Webserver More PHP to process Additional latency for visitor Try to avoid redirects anyway → In ZF : use $this->_forward instead of $this->_redirectWatch your logs, but equally important...Watch the logging process →Logging = disk I/O → can kill your server !Slashdot effect
  77. 77. Above all else... be prepared !Have a monitoring systemUse a cache abstraction layer (disk → Memcache)Dont install for the worst → prepare for the worstHave a test-setupHave fallbacks → Turn off non-critical functionality
  78. 78. So...Cache But : never delete, always push ! Have a warmup script Monitor your cache Have an abstraction layerApache = fine, Nginx = betterStatic pages ? Use VarnishTune your frontend → impact on backend !Prepare for the worst
  79. 79. Questions ?
  80. 80. Questions ?
  81. 81. Were hiring !Lots of challengesWork with cutting-edge technologyVaried : PHP development System / network architecture Scalability services Build our own services Work on Open Source → mail us : info@cu.be
  82. 82. ContactTwitter @wimgtrWeb http://techblog.wimgodden.beSlides http://www.slideshare.net/wimgE-mail wim.godden@cu.be Please... Rate my talk : http://speakerrate.com/talks/9501
  83. 83. Thanks ! Please...Rate my talk : http://speakerrate.com/talks/9501
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×