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

на уровне конфига и анализа логов

на уровне приложения

  • добавление обычных, мультиколонных индексов, а также 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

Список ссылок по теме