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