High Concurrency Web Architecture
and Laravel Performance Tuning
@LaravelConf Taiwan 2019
By Albert Chen
About Me
• Albert Chen
• Software Engineer
• M17 HandsUp
• Open Source Maintainer
What Is High Concurrency?
What Is High Concurrency?
PV = 2,000,000 (200w)
QPS = (200w x 0.8) / (24 x 3600 x 0.2)
93 QPS 😀
What Is High Concurrency?
2,000,000 (200w) in 1 minute
QPS = 200w / 60
33333 QPS 😭
What Is High Concurrency?
Read in High Concurrency
• Vertical Scaling
• Horizontal Scaling
• Content Delivery Network
• Data Caching
• Single Point Optimization
Write in High Concurrency
• Message Queue
• Rate Limit
• Maximum Serving Limit
• Wait in Line
• Rules Optimization
Performance Tuning
in Laravel
Performance Tuning in Laravel
• Route and Config Files Cache
• Cache (Not Limited to Database)
• Async Event (Delayed Processing)
• Database Read/Write Separation
• OPCache
• Preloading in PHP 7.4
Route and Config Files Cache
php artisan route:cache
Route and Config Files Cache
Register
Route
Route
Register
Route
Route
Register
Route
Route
Route
Collection
• Lifecycle for Registering Routes
Route and Config Files Cache
Unserialize
Cached
Serialized
Route Collection
Route
Collection
• Lifecycle for Routes Caching
Route and Config Files Cache
Route Numbers No cache (ms) Cache (ms) Speed-up
1 2.5 1.9 1.3x
10 5.2 2.6 2.0x
100 22.5 4.3 5.3x
1,000 166 32 5.1x
10,000 1,513 334 4.5x
https://voltagead.com/laravel-route-caching-for-improved-performance/
Route and Config Files Cache
https://voltagead.com/laravel-route-caching-for-improved-performance/
Route and Config Files Cache
php artisan config:cache
Route and Config Files Cache
Merged
Config File
• Lifecycle for Config Caching
Config

Files
Benchmark Comparison
• Provider: Google Cloud Platform
• Instance Type: n1-standard-8
• CPUs: 8 vCPU Cores (Skylake)
• Memory: 30 G
• Disk: 20 G SSD
• OS: Ubuntu 18.04 LTS
• PHP Version: 7.3
Benchmark Comparison
• Benchmark without Cache
Benchmark Comparison
• Benchmark with Routes and Config Cache
Cache (Not Limited to Database)
• Discover Hotspot Data (Hit Rate)
• Proper TTL for Cached Data
• Avoid Expiring Cache at The Same Time
• Revoke Cache when Data Changes
• Avoid Cache Missing
• Hierarchical Cache Design
• High Available Cache System
• Warm Up the Cache
Cache (Not Limited to Database)
• Revoke Cache when Data Changes
Cache (Not Limited to Database)
• Avoid Cache Missing
Cache (Not Limited to Database)
• Avoid Cache Missing
Client
Database
Cache Layer
Client Client
Cache (Not Limited to Database)
• Hierarchical Cache Design
Database
Local
Memory
Local
Memory
Local
Memory
Cache Layer
Cache
Revoke
Cache (Not Limited to Database)
• High Available Cache System
https://rancher.com/blog/2019/deploying-redis-cluster/
Cache (Not Limited to Database)
• Warm Up the Cache
Request
Request
Request
Request
Cache
Layer
Database
Time Consuming Query(Warm Up)
Async Event (Delayed Processing)
Producer
Kafka
Rabbit MQ
Queue Driver
Consumer
Producer
Producer
Producer
Consumer
Consumer
Consumer
(Laravel Event) (Laravel Queue Worker)
Database Read/Write Separation
20% on Write
80% on Read
Master
Slave Slave Slave
Read Replicas
Database Read/Write Separation
Database Read/Write Separation
App
Master
Slave Slave Slave
Read Replicas
Write
Read
Database Read/Write Separation
Database Read/Write Separation
Database Read/Write Separation
Master Slave Slave Slave
Read Replicas
SQL Proxy
Slave
Write
Read Read Read Read
OPCache
PHP

Files
Tokenizing
Semantic
Parsing
AST
Generate
Bytecode
Execute
Bytecode
Output
• Lifecycle in PHP
OPCache
PHP

Files
Tokenizing
Semantic
Parsing
AST
Generate
Bytecode
Execute
Bytecode
Output
• Lifecycle in PHP with OPCache
Load Bytecode
From Memory
Check
Bytecode Cache
Benchmark Comparison
• Benchmark with OPCache
Benchmark Comparison
• Benchmark without OPCache
Preloading in PHP 7.4
Preloading in PHP 7.4
PHP

Files
Tokenizing
Semantic
Parsing
AST
Generate
Bytecode
Execute
Bytecode
Output
Load Bytecode
From Memory
Check
Bytecode Cache
Preload
in Memory
• Lifecycle in PHP with Preloading
Preloading in PHP 7.4
composer require ayesh/composer-preload
Benchmark Comparison
• Benchmark with Preloading
Benchmark
Preloaded
files
Server
startup time
Opcache
memory used
Per request
memory used
QPS
No
preloading
0 0.06 s
16 MB after
warmup
1,825 KB 596 rq/s
Preload hot
classes
878 0.26 s 21 MB 869 KB 695 rq/s
Preload
everything
14541 1.56 s 105 MB 881 KB 675 rq/s
https://github.com/composer/composer/issues/7777
Use Case Analysis
Banana News
• PV is around 200w
• Large amount of content resource
• Fuzzy search support
• Changeable news rank by topics
• 99% read, 1% write
Banana News
Server Database
Images
Server
(CDN)
Banana News
Database
Images
Server
(CDN)
Server
Server
Server
Load
Balancer
Banana News
Images
Server
(CDN)
Load
Balancer
Master
Slave Slave Slave
Read
Server
Server
Server
Banana News
Images
Server
(CDN)
Load
Balancer
Master
Slave Slave Slave
Read
Redis
Cache
Server
Server
Server
Banana News
Images
Server
Load
Balancer
Master
Slave Slave Slave
Read
Redis
Cache
CDN
Elastic Search
Server
Server
Server
eg. Cloudflare
AATIX
• High concurrency in short period
• Limited tickets for selling
• High available service
AATIX
Images
Server
Load
Balancer
Master
Slave Slave Slave
Read
Redis
Cache
CDN
Server
Server
Server
AATIX
Images
Server
Load
Balancer
Master
Slave Slave Slave
Read
Redis
Cache
CDN
Server
Server
Server
😱
AATIX
Read
HTTP Request
CDN
Queue
Write
DB
AATIX
Images
Server
Load
Balancer
Master
Slave Slave Slave
Read
Redis
Cache
CDN
Server
Server
Server
Queue
AATIX
Master
Slave Slave Slave
Read
Redis
Cache
Server
Server
Server
Queue
Local Cache
Atomic Counter
Rate Limit
Circuit Breaking
AATIX
• Avoid large amount of write requests at the same time
• Queue
• Rate Limit
• Reduce repeated requests from clients
• Service isolation for hotspot data
• Circuit breaking for high availability
• Large amount of webhook calls
• High availability for webhooks
• Instant response time
• Chat service for live streaming
HandsUp
HandsUp
Facebook
Webhooks
Message
Load
Balancer
Server
Server
Server
Queue
PubNub

Service
Analysis
Service
Swoole Service
PubSub
Many to Many
Queue Workers
The Last
But Not the Least
Q&A

High Concurrency Architecture and Laravel Performance Tuning