Как сделать проект с 1 500 000 просмотров в сутки, который...
DESCRIPTION
Максим Овсянников, Центр Высоких Технологий IzhDevCom November 2014TRANSCRIPT
Как сделать проект с
1 500 000 просмотров в
сутки, который не ломается
Максим Овсянников
Центр Высоких Технологий
Популярная механика
● www.popmech.ru
● Новостной сайт
● До 1.5 миллионов просмотров в сутки
● До 3000 просмотров в минуту
Требуется
● Не допустить медленной работы
● Устранить узкие места
● Постоянно контролировать происходящее
Перед началом работы
● Собрать все требования и информацию
● Сформировать видение системы
Подготовка окружения
● dev и demo сервера
● Везде одинаковое окружение
● Выкладка кода только через VCS
● Обязательно использовать IDE
Выбор технологий
Apache
nginx + php-fpm
memcached
Кеширование
Кеширование на разных уровнях
Кеширование ответов от других сервисов
Кеширование на nginx
● ngx_http_fastcgi_module
● Управляет передачей запросов к fastcgi
● Часть запросов можно не передавать
● К кеше хранятся ответы от fastcgi
Пример
fastcgi_cache_path /tmp/nginx/fastcgi_cache levels=1:2 keys_zone=one:20m max_size=100m;...location .. {
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;
}
Дополнительная настройка
По типу запросаlocation @nocached {
#передаем запрос на бекенд}...if ($request_method != GET) { return 412; }...error_page 412 = @nocached;
Дополнительная настройка
По url: location или сравнение urlif ($request_uri ~ nocache) { return 412; }
И еще настройка
Отдаем ответ из кеша в случае ошибкиfastcgi_cache_use_stale http_503 | timeout;
А если контент динамический?
● Кеш на 1 секунду
● 3000 запросов в минуту
● 50 запросов в минуту
● = экономия 49 запросов в секунду
Статика
● Кеширование статики на клиенте
● Отдельная страница 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 и mysql
slowlog = /var/log/nginx/fpm-slow.logrequest_slowlog_timeout = 10s
• логи ошибок PHP
display_errors = Off; log_errors = On; error_log
Профилирование с XHProf
• Почти не создает нагрузки в продакшене
• Можно быстро найти корень проблемы
• Подключение
auto_prepend_file = "/var/www/auto_prepend.php"
auto_append_file = "/var/www/auto_append.php"
• либо в PHP коде приложения
Начало страницы
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);
}
Что в итоге?
Узкие места
● Файловая система (сессии, кеш,
автолоадинг)
● БД
● Внешние сервисы
Что еще оптимизировать?
● Подобрать время выполнения фоновых
задач
● Тяжелые задания запускать когда
посещаемость минимальна
Мониторинг
● munin
● newrelic
● google analytics, метрика
Munin
Newrelic
● реалтайм время работы процессов
● число запросов
● время работы скриптов
● ошибки
● проверка доступности сайта
● есть мобильное приложение
Выводы
● Все отслеживаем и записываем
● Постоянный мониторинг состояния
системы
● Кеширование на нескольких уровнях
● Связь сисадмин - разработчик
Спасибо за внимание!
Вопросы?
Максим Овсянников
vk.com/maksim.ovsyannikov