Who am I
System Architect
Team Lead
PHP Developer
Find me on
@alexhelkar
alexhelkar
https://github.com/alexhelkar
Performance
Story
Canvas
- PHP 7.0.8
- Digital Ocean 5$ Droplet
- Symfony 3 Demo Application
- Yandex Tank
[phantom]
address=555.166.5.74 ; fake ip
port=80 ;target port
rps_schedule=step(20, 60, 10, 30s) const(1, 30s) ;load scheme
uris = /ru/blog/
Yandex Tank Config
Results
Results
- Max. stable RPS: 50
- Response time: ~20ms
PHP 7 facts
- isset 1.55 times faster than array_key_exists
- is_file 26 times faster than file_exists
- single quotes slower that double quotes
- instanceof faster is_a
- etc.
Code performance?
Blackfire.io profile
Current results:
Total request time: 18.4 ms
file_exists called: 7 times
Exec. time for file_exists: 460 µs
Expected results:
Exec/ time: ~17.6 µs
Total request time: ~18.3996 ms
Perfomance
Response time?
Requests per second?
PHP lang performance
...овно?
OR
...амно?
SLA
Story
Demo App
recall with $$
Infrastructures scaling
5$
RAM: 512
CPU: 1
HDD: 20
50 RPS
App Server
10$
50 RPS
App Server
RAM: 1024
CPU: 1
HDD: 30
50 RPS
App Server
RAM: 512
CPU: 1
HDD: 20
LB Server
RAM: 512
CPU: 1
HDD: 20
15$
100 RPS
App Server
50 RPS
App Server
LB Server
5$
App Server
RAM: 512
CPU: 1
HDD: 20
RAM: 512
CPU: 1
HDD: 20
RAM: 512
CPU: 1
HDD: 20
RAM: 1024
CPU: 1
HDD: 30
20$
160 RPS
App Server
120 RPS
App Server
LB Server
App Server
App Server
RAM: 2048
CPU: 2
HDD: 40
RAM: 512
CPU: 1
HDD: 20
RAM: 512
CPU: 1
HDD: 20
RAM: 512
CPU: 1
HDD: 20
RAM: 512
CPU: 1
HDD: 20
Summary
- Often hardware is cheaper than software
- Often scaling is cheaper than tuning
- Often horizontal scaling wins vertical scaling
- Often applications are not scalable :(
Load Balancer Pattern
Examples
- Kubernetes Services
- Microservices
- etc
Good to know
- HAProxy TCP and HTTP Load Balancing
- Nginx HTTP Load Balancing
- Message Queue-Based Load Balancing
MQ Balancing
Story
MQ Balancing
Consumer retries
API Gateway
Benefits we've got
- Advanced routing of requests
- Advanced routing of responses
- Workers could be added dynamically without LB reconfig
- Buffer size by queue limit
- Back pressure by message TTL
Scaling out
Story
Generic Web App
Perfomance
Requests per second
(concurrency)
DNS Load Distribution
DNS Load Distribution
DNS Cache
Rule of Thumb: Add LB
What if?
Floating IP
Perfomance
Response time
(reads)
Reads Flow
DB Cache
Application Cache
Application Cache Candidates
- Memcached (sessions, k/v data)
- sessions
- k/v data
- Redis
- k/v data
- leaderboards
- durability
- replication
* Manual sharding both cases
Web Cache
Cache: Rule of thumb
IF Application is SLOW
Enable Caching
IF Application has GLITCHES
Disable Caching
Perfomance
Response time
(writes)
Cirquit Breaker
Fire & Forget
MySQL
Database Perfomance
MySQL
Story of 100 servers
MongoDB
Chose correct sharding key
Apache Cassandra
Linear writes
Apache Cassandra
Life story
Apache Kafka
2 billions messages on 3 machines
Distributed Locks
Consul || etcd || Zookeeper
Instead Summary
- Scalability as afterwords doesn't work
- Database is not a queue
- Database is not a lock system
- Redis is not a queue
- MySQL master is always SPOF
- Load balancers as a must
- Linear disk writes wins
- Perfomance in PHP is done by everything except PHP
- Being distributed is fucking hard
Questions?
Find me on
@alexhelkar
alexhelkar
https://github.com/alexhelkar
PHP at Scale: System Architect Toolbox
By Oleksii Petrov
PHP at Scale: System Architect Toolbox
- 495