четверг, 24 января 2013 г.

HighLoad оптимизация

Шпаргалка по HighLoad оптимизации веб-сервера

Условия: 1 физический сервер/VPS/VDS + PHP + MYSQL
Цель: ускорение сервера в 10-50 раз, как минимум :)
Ниже список, на что стоит обратить внимание при оптимизации сервера.
Браться за все подряд смысла нет, все зависит от конкретной ситуации и ее bottleneck.
  • Диагностика, мониторинг и профилирование
    • munin, cacti
    • диски:
      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
    • отключить лишние(неиспользуемые) модули PHP
    • связь с фронтендом через unix-сокет
  • Сервер Баз Данных MySQL     на уровне конфига и анализа логов:
    Авторские права на представленный материал принадлежат администрации сайта http://chesser.ru, при копировании контента ссылка на источник обязательна.
    • анализ переменных статистики работы сервера (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 — см. HandlerSocket
    основные советы по работе с mysql
  • Оптимизация приложений
    • использование APC var-кеширования, либо(что хуже) memcached/redis/nosql…
    • анализ и доработка запросов к БД
    • замещение штатных сервисов приложения внешними. Например, замена стандартной функции поиска на SphinxSearch
    • сокращение http запросов к вебсерверу, объединение отдаваемых http ресурсов, иногда CSS sprites
Список сайтов и материалов по HighLoad
Справочник по популярным unix/linux командам

Комментариев нет:

Отправить комментарий