«Разработка и оптимизация высоконагруженного...

Preview:

DESCRIPTION

Автор: Максим Овсянников, веб-разработчик компании "Центр Высоких Технологий". Советы по оптимизации и разработке высоконагруженных веб-проектов

Citation preview

Разработка и оптимизация

выcоконагруженного проекта

Максим Овсянников

Популярная Механика

• www.popmech.ru• Новостной сайт• До 450 тысяч просмотров в сутки• До 1000 просмотров в минуту

Перед началом разработки

• Собрать все требования и информацию• Сформировать видение системы

Подготовка окружения

• dev и demo сервера• Везде одинаковое окружение• Выкладка кода только через VCS• Обязательно использовать IDE

Выбор архитектуры

• Apache• nginx + php-fpm• memcached• сессии перенести в memcached или redis

Кеширование

• Не всегда можно использовать стандартный механизм автокеширования

• Нужно кешировать не только HTML вывод• Кешировать вспомогательные данные

Кеширование

Кеширование на nginx

fastcgi_temp_path /tmp/nginx/fastcgi_cache 1 2;

fastcgi_cache one;

fastcgi_cache_valid 200 301 302 304 5m;

fastcgi_cache_key "$request_method|$host|$request_uri";

fastcgi_ignore_headers "Cache-Control" "Expires";

fastcgi_no_cache $cookie_USER_AUTHORIZED;

fastcgi_cache_bypass $cookie_USER_AUTHORIZED;

Cтатика

• Кеширование статики на клиенте• Отдельная страница 404• Отключить логи

location ~* ^.+\.(ico|gif|jpeg|png...)$ { root /var/www/public_html; access_log off; expires max; error_page 404 = /404.html;}

Перед выкладкой

• Проверить конфигурацию инструментами Битрикса• Отключить модуль веб-аналитики

Поиск узких мест

• лог 50x ошибокerror_page 500 502 503 504 /50x.html;location = /50x.html { access_log /var/log/nginx/50x.error.log error50x; root /var/www/public_html;}

• логи медленных запросов PHP и mysqlslowlog = /var/log/nginx/fpm-slow.logrequest_slowlog_timeout = 10s

• логи ошибок PHPdisplay_errors = Off; log_errors = On; error_log

Профилирование c XHProf

• Почти не создает нагрузки в продакшене• Можно быстро найти корень проблемы• Подключениеauto_prepend_file = "/var/www/auto_prepend.php"auto_append_file = "/var/www/auto_append.php"

• либо через dbconn.php и событие OnAfterEpilog

В начале выполнения страницы

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

$GLOBALS["time_start"] = microtime(true);

В конце выполнения страницы

$time = microtime(true) - $GLOBALS["time_start"];$xhprof_data = xhprof_disable();$xhprofRootDirUtils = "/var/www/xhprof-0.9.4/xhprof_lib/utils/";include_once $xhprofRootDirUtils . "xhprof_lib.php";include_once $xhprofRootDirUtils . "xhprof_runs.php";

if ($time > 10) { $xhprof_runs = new XHProfRuns_Default(); $prof_file_name = "time_" . intval($time) . "s_" . preg_replace('/[^A-Za-z0-9_\-]/', '_', $_SERVER["REQUEST_URI"]);

$xhprof_runs->save_run($xhprof_data, $prof_file_name);}

Что еще оптимизировать?

• Подобрать время запуска фоновых задач• Тяжелые задания запускать когда посещаемость минимальная

New Relic (newrelic.com)

Выводы

• Все отслеживаем и записываем• Постоянный мониторинг состояния системы• Кеширование на нескольких уровнях• Связь сисадмин - разработчик

Спасибо за вниманиеВопросы?

Recommended