Как сделать проект с 1 500 000 просмотров в сутки, который...

33
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается Максим Овсянников Центр Высоких Технологий

Upload: egor-konovalov

Post on 08-Jul-2015

405 views

Category:

Internet


1 download

DESCRIPTION

Максим Овсянников, Центр Высоких Технологий IzhDevCom November 2014

TRANSCRIPT

Page 1: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Как сделать проект с

1 500 000 просмотров в

сутки, который не ломается

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

Центр Высоких Технологий

Page 2: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

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

● www.popmech.ru

● Новостной сайт

● До 1.5 миллионов просмотров в сутки

● До 3000 просмотров в минуту

Page 3: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 4: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 5: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Требуется

● Не допустить медленной работы

● Устранить узкие места

● Постоянно контролировать происходящее

Page 6: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Перед началом работы

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

● Сформировать видение системы

Page 7: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

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

● dev и demo сервера

● Везде одинаковое окружение

● Выкладка кода только через VCS

● Обязательно использовать IDE

Page 8: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Выбор технологий

Apache

nginx + php-fpm

memcached

Page 9: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Кеширование

Кеширование на разных уровнях

Кеширование ответов от других сервисов

Page 10: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 11: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

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

● ngx_http_fastcgi_module

● Управляет передачей запросов к fastcgi

● Часть запросов можно не передавать

● К кеше хранятся ответы от fastcgi

Page 12: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Пример

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;

}

Page 13: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Дополнительная настройка

По типу запросаlocation @nocached {

#передаем запрос на бекенд}...if ($request_method != GET) { return 412; }...error_page 412 = @nocached;

Page 14: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Дополнительная настройка

По url: location или сравнение urlif ($request_uri ~ nocache) { return 412; }

Page 15: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

И еще настройка

Отдаем ответ из кеша в случае ошибкиfastcgi_cache_use_stale http_503 | timeout;

Page 16: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

А если контент динамический?

● Кеш на 1 секунду

● 3000 запросов в минуту

● 50 запросов в минуту

● = экономия 49 запросов в секунду

Page 17: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Статика

● Кеширование статики на клиенте

● Отдельная страница 404

● Отключить логи

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

}

Page 18: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

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

• лог 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

Page 19: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

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

• Почти не создает нагрузки в продакшене

• Можно быстро найти корень проблемы

• Подключение

auto_prepend_file = "/var/www/auto_prepend.php"

auto_append_file = "/var/www/auto_append.php"

• либо в PHP коде приложения

Page 20: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Начало страницы

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

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

Page 21: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Конец страницы

$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);

}

Page 22: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Что в итоге?

Page 23: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 24: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 25: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Узкие места

● Файловая система (сессии, кеш,

автолоадинг)

● БД

● Внешние сервисы

Page 26: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

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

● Подобрать время выполнения фоновых

задач

● Тяжелые задания запускать когда

посещаемость минимальна

Page 27: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Мониторинг

● munin

● newrelic

● google analytics, метрика

Page 28: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Munin

Page 29: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Newrelic

● реалтайм время работы процессов

● число запросов

● время работы скриптов

● ошибки

● проверка доступности сайта

● есть мобильное приложение

Page 30: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 31: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014
Page 32: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Выводы

● Все отслеживаем и записываем

● Постоянный мониторинг состояния

системы

● Кеширование на нескольких уровнях

● Связь сисадмин - разработчик

Page 33: Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhDevCom November 2014

Спасибо за внимание!

Вопросы?

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

[email protected]

vk.com/maksim.ovsyannikov