ТОП ошибок в
инфраструктуре,
мешающих
высоким нагрузкам
Андрей Половов
Андрей Колаштов
Привет!
# whoami
andrey.polovov
# hostname -d
flant.ru
# whoami
andrey.kolashtov
# hostname -d
flant.ru
24×7×365 L1/L2/L3/+ DevOps SLA
+ =
Наши клиенты
Первый канал Forbes.ru Лепра и Dirty Ситимобил
# capsh --print | grep clients
О чём доклад?
О чём доклад?
Проблемы с базами
О чём доклад?
Проблемы с базами
Проблемы с кодом
О чём доклад?
Проблемы с базами
Проблемы с кодом
Проблемы с архитектурой
О чём доклад?
Проблемы с базами
Проблемы с кодом
Проблемы с архитектурой
Проблемы с сетью
О чём доклад?
Проблемы с базами
Проблемы с кодом
Проблемы с архитектурой
Проблемы с сетью
Человеческий фактор
Disclaimer
Проблемы с базами
Распространённость
Влияние на производительность
Сложность решения
Проблемы с базами / Транзакции
Проблемы с базами / Транзакции
SELECT # Получить текст
UPDATE # Обновить счётчик
UPDATE # Начислить автору денег
UPDATE # Списать деньги из бюджета
# Σ 4 Disk IO
Проблемы с базами / Транзакции
START TRANSACTION;
SELECT # Получить текст
UPDATE # Обновить счётчик
UPDATE # Начислить автору денег
UPDATE # Списать деньги из бюджета
COMMIT;
# Σ 2 Disk IO
Проблемы с базами / Транзакции
~ $ time php insert_300k_rows.php
real 6m13.465s
~ $ time php insert_300k_rows_transaction.php
real 0m32.298s
Проблемы с базами / Транзакции
SET autocommit = 1;
mysql_query(“UPDATE `tbl` SET `a` = 1 WHERE `b` = 2”);
Проблемы с базами / Транзакции
Изучайте лог запросов (binlog или general.log)
Диагностика:
Проблемы с базами / Транзакции
Изучайте лог запросов (binlog или general.log)
N коммитов ≈ N апдейтов ➡ Cкорее всего проблема
Диагностика:
Проблемы с базами / Индексы
Распространённость
Влияние на производительность
Сложность решения
Проблемы с базами / Индексы
Мало данных – нет проблем
Проблемы с базами / Индексы
↑ Данные
↑ full scan
↑ t query
↑ Disk IO
Проблемы с базами / Индексы
Продумать индекс при создании таблицы
Как быть программисту:
Проблемы с базами / Индексы
Продумать индекс при создании таблицы
Изменили запрос — продумали индекс
Как быть программисту:
Проблемы с базами / Индексы
Вычисляете запрос (slow_log, newrelic, okmeter.io)
Как быть админу:
Проблемы с базами / Индексы
Вычисляете запрос (slow_log, newrelic, okmeter.io)
explain
Как быть админу:
Проблемы с базами / Индексы
Вычисляете запрос (slow_log, newrelic, okmeter.io)
explain
Как быть админу:
Добавляете индекс
Проблемы с базами / Жадные запросы
Распространённость
Влияние на производительность
Сложность решения
База
(200Mbit)
Фронт
(5Mbit)
Проблемы с базами / Жадные запросы
SELECT * FROM `t`;
Проблемы с базами / Итого
Будьте конкретнее в своих запросах
Проблемы с базами / Итого
Будьте конкретнее в своих запросах
Помните об индексах
Проблемы с базами / Итого
Будьте конкретнее в своих запросах
Помните об индексах
Транзакции помогут снять нагрузку с БД
Проблемы с кодом
Проблемы с кодом / HTTP-api
Распространённость
Влияние на производительность
Сложность решения
Проблемы с кодом / HTTP-api
$resp = http_get(“http://news.example.com/api/last.php”);
Проблемы с кодом / HTTP-api
Смерть apache:
1 запрос = 1 воркер
Проблемы с кодом / HTTP-api
Смерть apache:
1 запрос = 1 воркер
Воркеры долго висят
Проблемы с кодом / HTTP-api
Смерть apache:
1 запрос = 1 воркер
Воркеры долго висят
MaxClients
Проблемы с кодом / HTTP-api
1 запрос = 1 воркер
Воркеры долго висят
Смерть apache:
MaxClients
Connection Timed Out
Проблемы с кодом / HTTP-api
Что делать?
Ищите workaround:
Проблемы с кодом / HTTP-api
Что делать?
Ищите workaround:
Кэшируйте запросы
Проблемы с кодом / HTTP-api
Что делать?
Ищите workaround:
Кэшируйте запросы
Используйте MQ
Проблемы с кодом / HTTP-api
Ищите workaround:
Кэшируйте запросы
Что делать?
Используйте MQ
Поставьте тайм-аут 1 сек
Проблемы с кодом / HTTP-api
newrelic → web external (или любой профайлер)
Как диагностировать?
netstat -natup или tcpdump
Проблемы с кодом / cron
Распространённость
Влияние на производительность
Сложность решения
Проблемы с кодом / cron
http://example.com/cron/action1.php
Проблемы с кодом / cron
http://example.com/cron/action1.php
set_time_limit(0);
Проблемы с кодом / cron
http://example.com/cron/action1.php
set_time_limit(0);
* * * * * www-data curl http://example.com/cron/action1.php
Проблемы с кодом / cron
Что плохого?
Лишний воркер
Проблемы с кодом / cron
Что плохого?
Лишний воркер
Долго висят воркеры
Проблемы с кодом / cron
Лишний воркер
Долго висят воркеры
Что плохого?
MaxClients
Проблемы с кодом / cron
Что делать?
Используйте cli
Проблемы с кодом / cron
Что делать?
Используйте cli
Устанавливайте таймауты
Проблемы с кодом / cron
Используйте cli
Устанавливайте таймауты
Что делать?
Ставьте локи (утилита setlock)
Проблемы с кодом / Итого
Будьте внимательны к cron-заданиям
Проблемы с кодом / Итого
Будьте внимательны к cron-заданиям
Не пользуйтесь HTTP-api напрямую
Архитектурные проблемы
Архитектурные проблемы / Одинокий apache
Распространённость
Влияние на производительность
Сложность решения
Архитектурные проблемы / Одинокий apache
apache280
Архитектурные проблемы / Одинокий apache
Что плохого?
Статика (jpg, css, js, ...)
Архитектурные проблемы / Одинокий apache
Медленные клиенты
Статика (jpg, css, js, ...)
Что плохого?
Архитектурные проблемы / Одинокий apache
Что делать?
Используйте nginx
location ~* ^/.+.(jpg|css|js)$ {
root /web/example.com/public/;
}
Apache 46%
nginx 20%
Microsoft IIS 8%
Google 8%
Other 18%
Доля веб-серверов, апрель 2017
Распространённость
Влияние на производительность
Сложность решения
Архитектурные проблемы / PHP-сессии
Архитектурные проблемы / PHP-сессии
Архитектурные проблемы / PHP-сессии
Что делать?
Храните PHP-сессии в памяти!
Распространённость
Влияние на производительность
Сложность решения
Архитектурные проблемы / stateful-код
Архитектурные проблемы / stateful-код
Архитектурные проблемы / stateful-код
Архитектурные проблемы / stateful-код
Враги stateless:
Локальные файловые хранилища
Архитектурные проблемы / stateful-код
Локальные файловые хранилища
Экзотические БД
Враги stateless:
Архитектурные проблемы / stateful-код
Храните файлы в S3 (NFS только как временное решение!)
Не используйте экзотические БД
Как быть?
Распространённость
Влияние на производительность
Сложность решения
Архитектурные проблемы / HTTP-кеш
Архитектурные проблемы / HTTP-кеш
Архитектурные проблемы / HTTP-кеш
http://conf.ontico.ru/live/
Архитектурные проблемы / HTTP-кеш
http://conf.ontico.ru/live/
GET /api/live/current.json?thread=436630
GET /api/live/next.json?thread=475171
Архитектурные проблемы / HTTP-кеш
http://conf.ontico.ru/live/
location ~* "^/api/live/(current|next).json" {
proxy_cache conf_ontico_ru;
proxy_cache_key $request_uri;
proxy_cache_valid 1m;
...
proxy_pass http://web-conference;
}
Архитектурные проблемы / Итого
Кеш — главная помощь при highloadКеш — главная помощь при highload
Архитектурные проблемы / Итого
Не оставляйте apache одного
Кеш — главная помощь при highload
Архитектурные проблемы / Итого
Не оставляйте apache одного
Храните PHP-сессии в памяти
Кеш — главная помощь при highload
Архитектурные проблемы / Итого
Не оставляйте apache одного
Храните PHP-сессии в памяти
Пишите stateless-приложения
Кеш — главная помощь при highload
Сетевые проблемы
Распространённость
Влияние на производительность
Сложность решения
Сетевые проблемы / persistent connect
Сетевые проблемы / persistent connect
Сетевые проблемы / persistent connect
Чем грозят “короткие” соединения
Оверхед CPU на создание сокетов
Оверхед на TCP syn, ack...
Сетевые проблемы / persistent connect
Чем грозят “короткие” соединения
Оверхед CPU на создание сокетов
Оверхед CPU на инициализацию сессии в БД
Оверхед на TCP syn, ack...
Сетевые проблемы / persistent connect
Оверхед CPU на создание сокетов
Оверхед CPU на инициализацию сессии в БД
Чем грозят “короткие” соединения
Обилие TIME_WAIT-сокетов
Оверхед на TCP syn, ack...
Сетевые проблемы / persistent connect
Решение для PG
PGBouncer
Сетевые проблемы / persistent connect
upstream backend {
keepalive 100;
server 10.1.1.5;
}
...
proxy_http_version 1.1;
proxy_set_header Connection "";
...
Распространённость
Влияние на производительность
Сложность решения
Сетевые проблемы / TIME_WAIT-сокеты
Сетевые проблемы / TIME_WAIT-сокеты
Оверхед CPU на проверку входящего пакета
Чем грозят TIME_WAIT-сокеты:
Сетевые проблемы / TIME_WAIT-сокеты
Чем грозят TIME_WAIT-сокеты:
Памяти почти не просят
Оверхеда CPU на исходящие пакеты нет
При этом:
Оверхед CPU на проверку входящего пакета
Сетевые проблемы / TIME_WAIT-сокеты
~ $ sudo netstat -natu | grep TIME_WAIT | wc -l
47572
Сетевые проблемы / TIME_WAIT-сокеты
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
Решение:
Сетевые проблемы / TIME_WAIT-сокеты
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
Решение:
Сетевые проблемы / TIME_WAIT-сокеты
net.ipv4.tcp_tw_reuse = 1
persistent connections
Правильное решение:
Распространённость
Влияние на производительность
Сложность решения
Сетевые проблемы / Плохой канал
Сетевые проблемы / Плохой канал
Коммунальное облако
Сетевые проблемы / Плохой канал
Сетевые проблемы / Плохой канал
Сетевые проблемы / Плохой канал
Сетевые проблемы / Итого
Используйте управляемую инфраструктуру
Сетевые проблемы / Итого
Используйте persistent connections
Используйте управляемую инфраструктуру
Сетевые проблемы / Итого
Используйте persistent connections
Не перестарайтесь в борьбе с TIME_WAIT
Используйте управляемую инфраструктуру
Человеческий фактор
Распространённость
Влияние на производительность
Сложность решения
Человеческий фактор / Базовая настройка
Человеческий фактор / Базовая настройка
%software% performance tuning
Человеческий фактор / Базовая настройка
Распространённость
Влияние на производительность
Сложность решения
Человеческий фактор / Хабраэффект
Человеческий фактор / Хабраэффект
Loading...
Распространённость
Влияние на производительность
Сложность решения
Человеческий фактор / Пятничный выкат
Человеческий фактор / Пятничный выкат
Must have
Must have
Сбор бэкапов
Must have
Сбор бэкапов
Мониторинг важных параметров
Must have
Хотя бы базовая статистика
Сбор бэкапов
Мониторинг важных параметров
Must have
Хотя бы базовая статистика
Сбор бэкапов
Грамотный деплой
Мониторинг важных параметров
Must have / Наша статистика
Хотя бы базовая статистика
Сбор бэкапов
Грамотный деплой
Мониторинг важных параметров
Must have / Наша статистика
6 / 10
Хотя бы базовая статистика
Сбор бэкапов
Грамотный деплой
Мониторинг важных параметров
Must have / Наша статистика
6 / 10
3 / 10
Хотя бы базовая статистика
Сбор бэкапов
Грамотный деплой
Мониторинг важных параметров
Must have / Наша статистика
6 / 10
3 / 10
3 / 10Хотя бы базовая статистика
Сбор бэкапов
Грамотный деплой
Мониторинг важных параметров
Must have / Наша статистика
6 / 10
3 / 10
3 / 10
1 / 20
Хотя бы базовая статистика
Сбор бэкапов
Грамотный деплой
Мониторинг важных параметров
Итого
Транзакции Индексы Жадные запросы
Внешние запросы cron
PHP-сессии HTTP-кешОдинокий apache stateful-код
Базы
Код
Архитектура
Сеть
Человеческий фактор
persistent connections TIME_WAIT rtt
Базовая настройка Хабраэффект Пятничный выкат
Наши Docker-проекты
github.com/flant/dapp
github.com/flant/pam_docker
Андрей Половов
andrey.polovov@flant.ru
Всем спасибо!
Наш блог на Хабрахабре
habrahabr.ru/company/flant/
Андрей Колаштов
andrey.kolashtov@flant.ru
Наш блог на Хабрахабре
habrahabr.ru/company/flant/
Тут мы рассказываем о нашем опыте
и актуальных технологиях.
Подписывайтесь, чтобы быть в курсе!

ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)