4Developers 2015: Scaling LAMP doesn't have to suck - Sebastian Grodzicki
Transcript of 4Developers 2015: Scaling LAMP doesn't have to suck - Sebastian Grodzicki
Scaling LAMPdoesn't have to suck
SebastianGrodzicki
CTO @ GoldenLine
~100 req/s ~4.7M UU
#DevOps
LAMP
• Linux
• Apache
• MySQL
• PHP
Scaling LAMP
• shared hosting
• VPS
• dedicated server
Scaling LAMP
• split LAMP into LM + LAP
• use virtual machines or Docker
• forget 127.0.0.1 (AKA localhost)
• forget about local storage
A better LAMP
• Linux (tuned)
• Apache Nginx
• MySQL Percona Server
• PHP PHP-FPM
• Redis
• Resque
Linux (tuned)
• Linux is mostly sane
• use latest kernel
• distribution doesn’t matter
• (I like Debian)
Tune Linux
• open_files
• network/sysctl
• i/o scheduler
Linux: open_files
• default: 1024 (ulimit -n)
• soft nofile 999999
• hard nofile 999999
Linux: sysctl
• net.ipv4.ip_local_port_range = 1024 65535
• net.ipv4.tcp_tw_recycle = 1
• net.ipv4.tcp_tw_reuse = 1
• net.core.somaxconn = 999999 (default: 128)
Linux: i/o scheduler
• $ cat /sys/block/sda/queue/scheduler noop deadline [cfq]
• $ echo deadline > /sys/block/sda/queue/scheduler
• $ cat /sys/block/sda/queue/scheduler noop [deadline] cfq
Nginx
• open-source HTTP server
• swap out Apache
• easy + sane config
Nginx21k req/s @ 10% CPU & 160 MB RAM
Nginx
• load balancer
• reverse proxy
• content caching
• streaming media
• web server
Percona Server
• open source MySQL fork
• patches from Twitter and Google
• drop-in MySQL replacement
• faster at scale, more reliable
MySQL vs Perconanew transactions per minute
Percona Server
• only use InnoDB (XtraDB)
• disable query cache
• enable thread pool
PHP-FPM
• standard with PHP 5.3+
• daemonization & process management
• used by Rasmus Lerdord (author of PHP)
PHP-FPM
• pm = static
• pm.max_children = {{ CPU cores * 4 }}
• pm.max_children = 32 # 8c/16t
• pm.max_children = 64 # 16c/32t
• pm.max_children = 80 # 20c/40t
PHP-FPM
• 5.6 is faster than 5.5
• 5.5 is faster than 5.4
• 5.4 is faster than 5.3
• 5.6 is much faster than 5.3
PHP-FPM
• 5.6: OPcache
• 5.5: OPcache
• 5.4: APC
• 5.3: APC
Redis
• key-value cache & store
• >= Memcached
• optional persistence & hot cache
• clients for almost every language
• use phpredis (the C extension)
Resque
• open source library
• made by GitHub
• ported to PHP (php-reque)
• uses Redis
Load Balancer A Load Balancer B
App 1 App 2 App 3 App N
DB 1 DB 2 DB N Redis 1 Redis 2 Redis N
DNS
Questions?
Thank you!