HighLoad оптимизация
Материал из Chesser Wiki
Шпаргалка по HighLoad оптимизации веб-сервера
Условия: 1 физический сервер/VPS/VDS + PHP + MYSQL
Цель: ускорение сервера в 10-50 раз, как минимум :)
Ниже список, на что стоит обратить внимание при оптимизации сервера. Браться за все подряд смысла нет, все зависит от конкретной ситуации и ее bottleneck.
Содержание
Диагностика, мониторинг и профилирование
- munin, cacti, newrelic, zabbix
- диски:
df -h, iotop, mpstat, iostat, sar, lsof, smartctl, dd hdparm -I, hdparm -t, iozone, bonnie++
- процессы/память: ps aux, top, htop, vmstat, pstree, strace, watch, free -m, lsmod
- сеть: tcpdump, netstat, iptraf
- web server: ab(ApacheBench), httperf
- другие инструменты диагностики
Оптимизация ОС и общие советы
- анализ /var/logs
- если логи не нужны, лучше их вырубить, либо настроить logrotate
- ФС: XFS для быстрого чтения и больших файлов, ext3/4 - универсальны
- монтирование ФС: relatime(или noatime), async
- проверка стабильности и работоспобности dns resolve, переход на 8.8.8.8 и 8.8.4.4
Веб-сервер фронтенд Nginx
- проверить worker_processes, worker_connections, %events_module% (kqueue - freebsd, epoll - linux), worker_priority
- unix сокеты вместо IP сокетов
- 304 http headers на всю статику, на месяц: expires 30d
- gzip on
- gzip_static on (ngx_http_gzip_static_module); "for i in `find ./* -type f -name '*.js'`; do echo $i; gzip -c -9 $i > $i.gz; done;"
- отключить логи статики: access_log off
- try_files вместо "if (... !-f)"
- fastcgi_cache
- aio on - поддержка асинхронного IO в nginx, подробнее
- sendfile on - если без aio
- open_file_cache
- timer_resolution 100ms - уменьшает частоту вызова функции таймера
Веб-сервер бекенд PHP-FPM
(забыть про апач(httpd) навсегда)
- php-акселераторы(opcode кеширование): apc или xcache или ZendOptimizerPlus
- отключить лишние(неиспользуемые) модули PHP
- связь с фронтендом через unix-сокет
Сервер Баз Данных MySQL
Основные советы по работе с mysql
на уровне конфига и анализа логов
- анализ переменных статистики работы сервера (tuning-primer.sh, mysqltuner, иногда phpMyAdmin). Настройка /etc/my.conf и расчет потребляемой памяти mysql
- профилирование slow queries (можно с помощью mysqlsla)
- кеширование SQL-запросов на уровне БД
- поднятие лимитов на файловые хендлеры в ОС, нужно для оптимизации работы временных таблиц в виртуальной памяти
- поднятие лимитов на коннекты к серверу БД
- расширение/подгон буферов памяти под работающий софт/данные
- myisam -> innodb или наоборот
на уровне приложения
- добавление обычных, мультиколонных индексов, а также FORCE INDEX в проблемные таблицы
- отказ/пересмотр запросов с wildcard-символами и сокращение фуллсканов
- использование DELAYED запросов, мульти (bulk) вставки/апдейты, statements
- использование PREPARED STATEMENTS
- по возможности вмесло php-mysql использовать php-mysqli в купе с mysqlnd
- если данные помещаются в памяти, то некоторые SQL-запросы можно выполнять через api - см. HandlerSocke
Оптимизация приложений
- использование APC var-кеширования, либо(что хуже) memcached/redis/nosql...
- анализ и доработка запросов к БД
- замещение штатных сервисов приложения внешними. Например, замена стандартной функции поиска на SphinxSearch
- сокращение http запросов к вебсерверу, объединение отдаваемых http ресурсов, иногда CSS sprites