Slide 1

Slide 1 text

Scaling Laravel the talk!

Slide 2

Slide 2 text

What is Scaling? Optimization Scaling Out

Slide 3

Slide 3 text

• Increase requests per second • Increase speed of response (reduce response time) • Decrease resource usage • Secondary Goal: Less Servers! What is Scaling Optimization Goal: Efficiency

Slide 4

Slide 4 text

• Consistent requests per second • Consistent speed of response • Consistent despite increasing traffic What is Scaling Scaling Out Goal: Consistency

Slide 5

Slide 5 text

Optimization

Slide 6

Slide 6 text

Optimization • Eager Loading (n+1 problem) • Object Caching (decorator pattern) • PHP-FPM (process management) • OpCache • Server Specialization (mysql optimization)

Slide 7

Slide 7 text

Optimization Eager Loading “n+1 problem” • Initial query returning a Collection • + 1 Additional query per object in Collection

Slide 8

Slide 8 text

Optimization Eager Loading 3 Topics 6 Video Series

Slide 9

Slide 9 text

Optimization Eager Loading +1 queries Lazy Loading

Slide 10

Slide 10 text

Optimization Eager Loading +6 queries +3 queries Total Queries: 10

Slide 11

Slide 11 text

Optimization Eager Loading • First Query: Grab all topics (+1 query) • Foreach Topic: Grab Series (+3 queries) • Foreach Series: Grab Content (+6 queries)

Slide 12

Slide 12 text

Optimization Eager Loading -2 queries

Slide 13

Slide 13 text

Optimization Eager Loading -5 queries nested!

Slide 14

Slide 14 text

Optimization Object Caching Reduce DB Queries + Processing

Slide 15

Slide 15 text

Optimization Object Caching

Slide 16

Slide 16 text

Optimization Object Caching Decorators • Add behavior w/out modifying code • Interface • Modifier(s) • Root Object (gross)

Slide 17

Slide 17 text

Optimization Object Caching An Interface Repository!

Slide 18

Slide 18 text

Optimization Object Caching Build Our Original Behavior

Slide 19

Slide 19 text

Optimization Object Caching Get it Working

Slide 20

Slide 20 text

Optimization Object Caching A cache decorator! magic!

Slide 21

Slide 21 text

Optimization Object Caching TopicCache::topics( TopicQuery::topics( Topic::all(); ); )

Slide 22

Slide 22 text

Optimization Object Caching Update Service Provider We “wrap” TopicQuery with decorator TopicCache.

Slide 23

Slide 23 text

Optimization Object Caching You’re empowered to do fun things!

Slide 24

Slide 24 text

Optimization Review: Code Optimization “n+1 problem”: eager loading object caching: decorators

Slide 25

Slide 25 text

Optimization PHP-FPM Optimizing PHP-FPM Process Management

Slide 26

Slide 26 text

Optimization PHP-FPM • Enable more requests per second • Trade-off between more requests and CPU/RAM usage • Monitor your server, even if just looking at `top` or `htop` commands (preferably under load) Process Management pm.max_children

Slide 27

Slide 27 text

Optimization PHP-FPM Rule of Thumb (RAM - Overhead) / Memory per Request (2048mb - 512mb) / 50mb = ~30 max processes (2048mb - 1024mb) / 50mb = ~20 max processes *check CPU usage after making changes!

Slide 28

Slide 28 text

Optimization PHP-FPM /etc/php/7.[1|2]/fpm/pool.d/www.conf Limits your req/sec directly (but w/ RAM/CPU trade off) Speeds up “startup time” Keep spares around But not too many Limit potential problems

Slide 29

Slide 29 text

Optimization PHP-FPM apt-get install htop

Slide 30

Slide 30 text

Optimization Opcache Opcache enabled

Slide 31

Slide 31 text

Optimization Opcache • Reduce CPU and file I/O per request • Small trade off in RAM usage • Really a no-brainer Cache PHP File Bytecode

Slide 32

Slide 32 text

Optimization Opcache /etc/php/7.[1|2]/fpm/php.ini

Slide 33

Slide 33 text

Optimization Opcache /etc/php/7.[1|2]/fpm/php.ini

Slide 34

Slide 34 text

Optimization Opcache • Must reload PHP-FPM after any code change • (e.g. after any deploy) • (you’re not editing code files in production, right?) Caveat: sudo service php7.2-fpm reload

Slide 35

Slide 35 text

Optimization Review: Server Optimization PHP-FPM: Process Management Opcache: Free Performance Boost

Slide 36

Slide 36 text

Optimization Specialization • Give MySQL it’s own server*** • Give Redis it’s own server • Give workers their own server • etc Split Out Services:

Slide 37

Slide 37 text

Optimization MySQL Optimization tools.percona.com/wizard

Slide 38

Slide 38 text

Optimization MySQL Optimization tools.percona.com/wizard Caches + InnoDB: The interesting stuff

Slide 39

Slide 39 text

Optimization Review: Optimization PHP-FPM: Process Management Split Servers: Esp MySQL “n+1 problem”: Eager Loading Object Caching: Decorators

Slide 40

Slide 40 text

Scaling Out

Slide 41

Slide 41 text

• Load Balancing (Considerations) • Laravel + Proxies (Trusted Proxy) • Queues (tricks!) Scaling Out

Slide 42

Slide 42 text

Scaling Out Load Balancing • Spread traffic across multiple servers • Remember: This is about consistency, not speed! • Also, caveats!

Slide 43

Slide 43 text

Scaling Out Caveats • More Servers! • LB + App Servers • … And everything else… Load Balancing

Slide 44

Slide 44 text

Scaling Out Caveats Load Balancing • Decentralizing Services • Redis (session/object cache) • MySQL* • Any other services (search, workers, cron) • Decentralizing Files • Sessions • User uploads: S3, NFS

Slide 45

Slide 45 text

Scaling Out Load Balancing Example: HAProxy Load Balancing

Slide 46

Slide 46 text

Scaling Out HAProxy /etc/haproxy/haproxy.cfg

Slide 47

Slide 47 text

Scaling Out HAProxy /etc/haproxy/haproxy.cfg

Slide 48

Slide 48 text

Scaling Out Example: Laravel + Proxies (e.g. load balancers) Load Balancing

Slide 49

Slide 49 text

Scaling Out Trusted Proxy

Slide 50

Slide 50 text

Scaling Out Trusted Proxy

Slide 51

Slide 51 text

Scaling Out Trusted Proxy X-Forwarded-* headers

Slide 52

Slide 52 text

Scaling Out Laravel app/Http/Middleware/TrustProxies.php Load balancer’s IP address here 172.31.0.238

Slide 53

Slide 53 text

Scaling Out Laravel 172.31.0.238

Slide 54

Slide 54 text

Scaling Out Trusted Proxy X-Forwarded-* header values used!

Slide 55

Slide 55 text

Scaling Out Needed For: • Correct client detection • cookies, CSRF token Trusted Proxy • Correct URL & form URI generation • url(), action() and similar helpers

Slide 56

Slide 56 text

Queues

Slide 57

Slide 57 text

Queues Scaling Out • Don’t make users wait • Remove artificial timeout and memory constraints • Scale work across many servers Work outside of the HTTP cycle

Slide 58

Slide 58 text

Scaling Out Queues Even if you’re on one server! .env

Slide 59

Slide 59 text

Scaling Out Queues Personal Favorite: SQS Driver *CHEAP*

Slide 60

Slide 60 text

Scaling Out Queues Personal Favorite: SQS Driver **VERY CHEAP**

Slide 61

Slide 61 text

Scaling Out Queues Trick 1: Priority

Slide 62

Slide 62 text

Scaling Out Queues Trick 2: Segmentation Separate Queues

Slide 63

Slide 63 text

Scaling Out Queues Trick 2: Segmentation: Separate Workers

Slide 64

Slide 64 text

Queues Scaling Out • Put workers on a server sized for their purpose • Scale workers separately Segmentation

Slide 65

Slide 65 text

• Optimization vs Scale Out • Optimization • Eager Loading + n+1 • Caching • PHP-FPM • Opcache • Specialization • MySQL Optimization • Scale Out • LB Configuration • Headers/Trusted Proxy • Queues What We Covered Scaling Laravel

Slide 66

Slide 66 text

More! Scaling Laravel • scalinglaravel.com • serversforhackers.com • @fideloper