Web server performance
Published in
1 min readSep 2, 2017
หลังจากที่ start docker-compose โดยใช้ laradock
เราสามารถ scale PHP-FPM ได้โดยที่ไม่จำเป็นต้องสร้าง swarm ก่อน (จากตัวอย่างใช้ 7 container)
#docker-compose scale php-fpm=7
ติดตั้ง wrk ไว้ทดสอบ (หรือจะใช้ wrk docker image ก็ได้)
apt install wrk
ทดสอบโดย wrk
wrk -t4 -c300 -d5s --timeout 2s https://www.example.com/test.php
ส่ง request ไปที่ test.php โดยแบ่งเป็น 4 threads, 300 connections ใช้เวลาสร้าง packet เพื่อทดสอบ 5 วินาที กำหนด timeout 2 วินาที
Kernel tunning
เพิ่มข้อความ ข้างล่างใน /etc/sysctl.d/00-tune.conf (อ้างอิง)
net.core.netdev_max_backlog = 5000 -- max number of packets in INPUT queue
net.core.rmem_default = 8388608 -- socket receive buffer (bytes)
net.core.rmem_max = 16777216
net.core.wmem_default = 8388608 -- socket send buffer (bytes)
net.core.wmem_max = 16777216
net.core.somaxconn = 1024 -- socket listen() backlog (additional tuning in TCP)
net.ipv4.tcp_max_syn_backlog = 3240000 -- TCP backlog
net.ipv4.tcp_syn_retries = 2 -- retry only 2 times (default: 6)
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syncookies = 1 -- prevent SYN flood attack (DON’T DISABLE)
net.ipv4.tcp_max_tw_buckets = 7200000 -- prevent DoS (more conn., more buckets)
net.ipv4.tcp_tw_reuse = 1 -- Fast reuse (Safer alternative to tw_recycle)
net.ipv4.tcp_fin_timeout = 15 -- FIN_WAIT_2 timeout (default: 60)
net.ipv4.tcp_no_metrics_save = 0 --(may be better to save metrics on some situation)
net.ipv4.netfilter.ip_conntrack_max = 204800 -- connection tracking
net.ipv4.ip_local_port_range = 10000 65000
Update kernel parameters
# Refresh kernel configuration
$ sysctl --system
Verify kernel parameters
sysctl net.core.somaxconn
Limit open files
#Allow more open files
ulimit -n 655350
เหลือ encoding ของ Caddy ที่เป็น gzip อยู่ Tossapon Nuanchuay แนะนำ Brotli ไว้จะมาเล่นต่อนะ