У меня есть «большая» виртуальная машина с apache 2.4.6-90, MPM Prefork, почти полностью посвященная веб-сайту, запрограммированному на PHP 5.4.16 Cake 1.3 (да, старый ...), который подключается к внешнему выделенному серверу Percona.
Мне нужно обрабатывать около 10 тыс. Запросов в минуту, а на данный момент я получаю не более 3000 (50 в секунду).
Странно, что apache не использует весь доступный процессор или оперативную память, максимум я получаю 6 средних точек нагрузки на 24-ядерной виртуальной машине с более чем 32 ГБ свободной оперативной памяти в любое время.
Я играл со многими вариантами, касающимися mpm_prefork (большие и малые пулы серверов) и некоторых параметров ядра, без каких-либо значительных улучшений, я действительно схожу с ума. Установка ProxySQL на тот же компьютер не помогла ...
Сайт не использует пул подключений к базе данных, поэтому ProxySQL действительно помог снизить количество активных подключений, но не вызвал большого улучшения производительности. Он поддерживает до 100 подключений при тестах с задержкой <2000 мс, это хорошая новость для сервера базы данных, не актуальна для веб-сервера ...
Если я увеличу MaxRequestWorkers до большого числа, например 1000, почти весь запрос завершится ошибкой из-за тайм-аута, и сервер продолжит использовать не все доступные ресурсы.
Это типичное чтение:
Server load: 4.75 4.25 4.35
CPU Usage: u1175.25 s50.09 cu0 cs0 - 205% CPU load
19.6 requests/sec - 0.6 MB/second - 33.5 kB/request
215 requests currently being processed, 38 idle workers
Будем очень признательны за любые подсказки о том, как достичь более высокой производительности !!!
ОПИСАНИЕ СЕРВЕРА:
Virtualized with libvirt/kvm (Host Centos 7, exclusive cores assigned)
VCPUS: 24 exposed as Westmere E56xx/L56xx/X56xx (Nehalem-C) (real: Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz)
RAM: 64GB
HD: RAID1 SSD
ТЕКУЩАЯ КОНФИГУРАЦИЯ MPM_PREFORK:
StartServers 200
MinSpareServers 25
MaxSpareServers 50
MaxRequestsPerChild 5000
ServerLimit 512
MaxRequestWorkers 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 10
Timeout 60
ТЕКУЩИЕ ПРЕДЕЛЫ
# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256965
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 40000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 256965
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ТЕКУЩИЕ ПРЕДЕЛЫ ПИД-регулятора:
#cat /proc/11648/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 256965 256965 processes
Max open files 40000 40000 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 256965 256965 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
НЕКОТОРЫЕ ПАРАМЕТРЫ SYSCTL:
net.core.somaxconn = 32768
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 87380 134217728
net.core.netdev_max_backlog = 300000
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_mem = 50576 64768 98152
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10