Слайд 2100+ проектов
10 центров разработки
более 1000 сотрудников в них
«Тензор» – это СБИС
миллион клиентов
![100+ проектов 10 центров разработки более 1000 сотрудников в них «Тензор» – это СБИС миллион клиентов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-1.jpg)
Слайд 3СБИС – data-centric application
Активно используем PostgreSQL
~400TB «рабочих» данных
«в продакшене» с 2008 года
уже
![СБИС – data-centric application Активно используем PostgreSQL ~400TB «рабочих» данных «в продакшене»](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-2.jpg)
более 250 серверов
Слайд 4СБИС – data-centric application
SQL – декларативный язык
вы описываете, что хотите получить
СУБД лучше
![СБИС – data-centric application SQL – декларативный язык вы описываете, что хотите](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-3.jpg)
«знает», как это сделать:
какие индексы использовать, в каком порядке соединять таблицы, как накладывать условия…
Слайд 5СБИС – data-centric application
SQL – декларативный язык
некоторые СУБД принимают «подсказки»
PostgreSQL – нет,
![СБИС – data-centric application SQL – декларативный язык некоторые СУБД принимают «подсказки»](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-4.jpg)
но…
всегда готов рассказать, как конкретно он выполняет ваш запрос
Слайд 6СБИС – data-centric application
Классика: «А почему у нас тут выполнялось долго?»
алгоритмически неэффективный
![СБИС – data-centric application Классика: «А почему у нас тут выполнялось долго?»](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-5.jpg)
запрос/план
неактуальная статистика
«затык» по ресурсам (процессор, диск, память)
блокировки – для DML-запросов
Слайд 7СБИС – data-centric application
Классика: «А почему у нас тут выполнялось долго?»
алгоритмически неэффективный
![СБИС – data-centric application Классика: «А почему у нас тут выполнялось долго?»](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-6.jpg)
запрос/план
неактуальная статистика
«затык» по ресурсам (процессор, диск, память)
«Нам нужен план!»
Слайд 9Получение плана
План запроса – дерево в текстовом представлении
каждый элемент – одна из
![Получение плана План запроса – дерево в текстовом представлении каждый элемент –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-8.jpg)
выполняемых операций
получение данных, построение битовых карт, обработка данных, операция над множествами, соединение, вложенный запрос
выполнение плана – обход дерева
Слайд 10Получение плана
EXPLAIN (ANALYZE, BUFFERS) SELECT …
https://postgrespro.ru/docs/postgrespro/9.6/using-explain
подходит только для локальной отладки
![Получение плана EXPLAIN (ANALYZE, BUFFERS) SELECT … https://postgrespro.ru/docs/postgrespro/9.6/using-explain подходит только для локальной отладки](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-9.jpg)
Слайд 11Получение плана
Модуль auto_explain
https://postgrespro.ru/docs/postgresql/9.6/auto-explain
анализирует все запросы подряд дольше XXXms
фиксирует для них планы выполнения
пишет
![Получение плана Модуль auto_explain https://postgrespro.ru/docs/postgresql/9.6/auto-explain анализирует все запросы подряд дольше XXXms фиксирует](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-10.jpg)
все это в лог сервера
Слайд 12Получение плана
Модуль auto_explain
![Получение плана Модуль auto_explain](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-11.jpg)
Слайд 13Получение плана
Модуль auto_explain
![Получение плана Модуль auto_explain](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-12.jpg)
Слайд 14Получение плана
Логи и план текстом – ненаглядно:
узел содержит сумму по ресурсам поддерева
время
![Получение плана Логи и план текстом – ненаглядно: узел содержит сумму по](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-13.jpg)
необходимо умножать на loops
… так кто же «самое слабое звено»?
Слайд 15Получение плана
Логи и план текстом – ненаглядно:
узел содержит сумму по ресурсам поддерева
время
![Получение плана Логи и план текстом – ненаглядно: узел содержит сумму по](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-14.jpg)
необходимо умножать на loops
… так кто же «самое слабое звено»?
«Понимание плана – это искусство, и чтобы овладеть им, нужен определённый опыт…»
Слайд 16Получение плана
Логи и план текстом – ненаглядно:
узел содержит сумму по ресурсам поддерева
время
![Получение плана Логи и план текстом – ненаглядно: узел содержит сумму по](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-15.jpg)
необходимо умножать на loops
… так кто же «самое слабое звено»?
Нужна хорошая визуализация!
Слайд 18Визуализация плана
explain.depesz.com
![Визуализация плана explain.depesz.com](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-17.jpg)
Слайд 19Визуализация плана
explain.depesz.com – pro
«собственное» время каждого узла
отклонение от статистически-плановых rows
количество повторов каждого
![Визуализация плана explain.depesz.com – pro «собственное» время каждого узла отклонение от статистически-плановых](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-18.jpg)
узла
архив планов (можно обмениваться ссылками)
Слайд 20Визуализация плана
explain.depesz.com – contra
требует copy&paste планов из лога
нет анализа ресурсов (buffers)
код на
![Визуализация плана explain.depesz.com – contra требует copy&paste планов из лога нет анализа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-19.jpg)
Perl, нет развития
ошибки анализа CTE/InitPlan :(
Слайд 21Визуализация плана
explain.depesz.com – ошибки анализа CTE Scan
![Визуализация плана explain.depesz.com – ошибки анализа CTE Scan](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-20.jpg)
Слайд 22Визуализация плана
explain.sbis.ru
ура! мы пишем свое!
Node.JS + Express + Twitter Bootstrap + D3.js
прототип
![Визуализация плана explain.sbis.ru ура! мы пишем свое! Node.JS + Express + Twitter](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-21.jpg)
за 2 недели
Слайд 23Визуализация плана
explain.sbis.ru
собственный парсер плана
корректный анализ CTE Scan
анализ распределения ресурсов (buffers)
наглядность, подсветка синтаксиса
![Визуализация плана explain.sbis.ru собственный парсер плана корректный анализ CTE Scan анализ распределения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-22.jpg)
Слайд 24Визуализация плана
explain.sbis.ru – полный план
![Визуализация плана explain.sbis.ru – полный план](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-23.jpg)
Слайд 25Визуализация плана
explain.sbis.ru – сокращенный план (шаблон)
![Визуализация плана explain.sbis.ru – сокращенный план (шаблон)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-24.jpg)
Слайд 26Визуализация плана
explain.sbis.ru – распределение затрат времени
![Визуализация плана explain.sbis.ru – распределение затрат времени](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-25.jpg)
Слайд 27Визуализация плана
explain.sbis.ru – распределение затрат времени
![Визуализация плана explain.sbis.ru – распределение затрат времени](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-26.jpg)
Слайд 28Визуализация плана
explain.sbis.ru – «грабли»
проблемы округления
0.001ms × (loops=1000) = 0.95ms .. 1.05ms
распределение ресурсов
![Визуализация плана explain.sbis.ru – «грабли» проблемы округления 0.001ms × (loops=1000) = 0.95ms](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-27.jpg)
CTE/InitPlan/SubPlan
+4 недели отладки :(
Слайд 29Визуализация плана
explain.sbis.ru – «грабли»
WITH cl AS (
TABLE pg_class
)
(TABLE cl LIMIT 1)
UNION ALL
(TABLE
![Визуализация плана explain.sbis.ru – «грабли» WITH cl AS ( TABLE pg_class )](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-28.jpg)
cl LIMIT 1 OFFSET 100);
Слайд 30Визуализация плана
explain.sbis.ru – «грабли»
![Визуализация плана explain.sbis.ru – «грабли»](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-29.jpg)
Слайд 31Визуализация плана
explain.sbis.ru – дерево выполнения
![Визуализация плана explain.sbis.ru – дерево выполнения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-30.jpg)
Слайд 32Визуализация плана
explain.sbis.ru – дерево выполнения
![Визуализация плана explain.sbis.ru – дерево выполнения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-31.jpg)
Слайд 33Визуализация плана
explain.sbis.ru – дерево выполнения
![Визуализация плана explain.sbis.ru – дерево выполнения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-32.jpg)
Слайд 34Визуализация плана
explain.sbis.ru
«Теперь, Нео, ты знаешь кунг-фу»
![Визуализация плана explain.sbis.ru «Теперь, Нео, ты знаешь кунг-фу»](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-33.jpg)
Слайд 36Консолидация логов
«Копипаста» – плохо
100+ серверов
1000+ разработчиков
![Консолидация логов «Копипаста» – плохо 100+ серверов 1000+ разработчиков](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-35.jpg)
Слайд 37коллектор
SSH port forward + psql
SSH connection (ключ)
tail -F
SELECT * FROM pg_stat_activity;
Консолидация
![коллектор SSH port forward + psql SSH connection (ключ) tail -F SELECT](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-36.jpg)
логов
SELECT * FROM pg_locks;
Слайд 38tail -F
Консолидация логов
COPY … FROM STDIN
![tail -F Консолидация логов COPY … FROM STDIN](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-37.jpg)
Слайд 39Консолидация логов
100+ серверов, 50Kqps, 100-150GB/день
секционирование по дням (ждем 10.0!)
очень-очень быстрый «потоковый» COPY
отказались
![Консолидация логов 100+ серверов, 50Kqps, 100-150GB/день секционирование по дням (ждем 10.0!) очень-очень](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-38.jpg)
от триггеров (почти)
Слайд 40Консолидация логов
Отказались от триггеров
нет ссылочной целостности (нет FK и их проверки)
агрегация и
![Консолидация логов Отказались от триггеров нет ссылочной целостности (нет FK и их](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-39.jpg)
хэширование на стороне коллектора
каждая таблица наполняется «своим» потоком
Слайд 41коллектор
COPY plan FROM STDIN
COPY query FROM STDIN
COPY error FROM STDIN
COPY planagg FROM
![коллектор COPY plan FROM STDIN COPY query FROM STDIN COPY error FROM](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-40.jpg)
Слайд 42Консолидация логов
«Потоковый» COPY
всегда открыт COPY-канал/пул на таблицу
«переоткрывается» раз в XXXms для закрытия
![Консолидация логов «Потоковый» COPY всегда открыт COPY-канал/пул на таблицу «переоткрывается» раз в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-41.jpg)
TX
отправляем запись в канал сразу при получении
никакой дополнительной буферизации, да-да
Слайд 43Консолидация логов
«Потоковый» COPY
таблицы-словари
триггер BEFORE INSERT
9.5+: INSERT … ON CONFLICT DO NOTHING
![Консолидация логов «Потоковый» COPY таблицы-словари триггер BEFORE INSERT 9.5+: INSERT … ON CONFLICT DO NOTHING](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-42.jpg)
Слайд 44Консолидация логов
«Потоковый» COPY
тогда: 4K write ops -> 1K write ops (в 4
![Консолидация логов «Потоковый» COPY тогда: 4K write ops -> 1K write ops](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-43.jpg)
раза!)
сейчас: 6K write ops ~100MB/s, 10TB/3мес
Слайд 46Понимаем проблемы
100+ серверов, 50Kqps, 100-150GB/день
миллионы планов за сутки
![Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день миллионы планов за сутки](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-45.jpg)
Слайд 47Понимаем проблемы
100+ серверов, 50Kqps, 100-150GB/день
миллионы планов за сутки
![Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день миллионы планов за сутки](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-46.jpg)
Слайд 48Понимаем проблемы
100+ серверов, 50Kqps, 100-150GB/день
миллионы планов за сутки
![Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день миллионы планов за сутки](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-47.jpg)
Слайд 49Понимаем проблемы
100+ серверов, 50Kqps, 100-150GB/день
кто? откуда этот запрос
где? что за сервер, база
как?
![Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день кто? откуда этот запрос где? что](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-48.jpg)
в чем проблема в плане
Слайд 50Понимаем проблемы
«Хозяин» у каждого запроса
SET application_name = ':'
страдаем от ограничения в 63
![Понимаем проблемы «Хозяин» у каждого запроса SET application_name = ' : '](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-49.jpg)
байта (тип name)
Слайд 51Понимаем проблемы
«Хозяин» у каждого запроса
log_line_prefix = ' %m [%p:%v] [%d] %r %a'
https://postgrespro.ru/docs/postgrespro/9.6/runtime-config-logging
![Понимаем проблемы «Хозяин» у каждого запроса log_line_prefix = ' %m [%p:%v] [%d] %r %a' https://postgrespro.ru/docs/postgrespro/9.6/runtime-config-logging](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-50.jpg)
Слайд 52Понимаем проблемы
«Хозяин» у каждого запроса
![Понимаем проблемы «Хозяин» у каждого запроса](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-51.jpg)
Слайд 53Понимаем проблемы
Модель анализа
экземпляр PostgreSQL (хост:порт), день
шаблон, приложение/метод, узел плана
![Понимаем проблемы Модель анализа экземпляр PostgreSQL (хост:порт), день шаблон, приложение/метод, узел плана](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-52.jpg)
Слайд 54Понимаем проблемы
От планов – к шаблонам
уменьшение количества анализируемых объектов
вычленение общих паттернов поведения
![Понимаем проблемы От планов – к шаблонам уменьшение количества анализируемых объектов вычленение общих паттернов поведения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-53.jpg)
Слайд 55Понимаем проблемы
Разрезы анализа планов
количество фактов по шаблону/методу
суммарное и среднее время
количество ресурсов (buffers
![Понимаем проблемы Разрезы анализа планов количество фактов по шаблону/методу суммарное и среднее](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-54.jpg)
hit/read)
таймлайны
Слайд 58Понимаем проблемы
Разрезы анализа узлов
Seq Scan, Index [Only] Scan, Bitmap (Index|Heap) Scan
количество фактов/шаблонов
![Понимаем проблемы Разрезы анализа узлов Seq Scan, Index [Only] Scan, Bitmap (Index|Heap)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/853262/slide-57.jpg)
по узлу
loops, rows, RRbF (суммарно и в среднем)