Массовая оптимизация запросов PostgreSQL – explain.sbis.ru

Содержание

Слайд 2

100+ проектов
10 центров разработки
более 1000 сотрудников в них

«Тензор» – это СБИС
миллион клиентов

100+ проектов 10 центров разработки более 1000 сотрудников в них «Тензор» – это СБИС миллион клиентов

Слайд 3

СБИС – data-centric application

Активно используем PostgreSQL
~400TB «рабочих» данных
«в продакшене» с 2008 года
уже

СБИС – data-centric application Активно используем PostgreSQL ~400TB «рабочих» данных «в продакшене»
более 250 серверов

Слайд 4

СБИС – data-centric application

SQL – декларативный язык
вы описываете, что хотите получить
СУБД лучше

СБИС – data-centric application SQL – декларативный язык вы описываете, что хотите
«знает», как это сделать:
какие индексы использовать, в каком порядке соединять таблицы, как накладывать условия…

Слайд 5

СБИС – data-centric application

SQL – декларативный язык
некоторые СУБД принимают «подсказки»
PostgreSQL – нет,

СБИС – data-centric application SQL – декларативный язык некоторые СУБД принимают «подсказки»
но…
всегда готов рассказать, как конкретно он выполняет ваш запрос

Слайд 6

СБИС – data-centric application

Классика: «А почему у нас тут выполнялось долго?»
алгоритмически неэффективный

СБИС – data-centric application Классика: «А почему у нас тут выполнялось долго?»
запрос/план
неактуальная статистика
«затык» по ресурсам (процессор, диск, память)
блокировки – для DML-запросов

Слайд 7

СБИС – data-centric application

Классика: «А почему у нас тут выполнялось долго?»
алгоритмически неэффективный

СБИС – data-centric application Классика: «А почему у нас тут выполнялось долго?»
запрос/план
неактуальная статистика
«затык» по ресурсам (процессор, диск, память)
«Нам нужен план!»

Слайд 8

Получение плана

Получение плана

Слайд 9

Получение плана

План запроса – дерево в текстовом представлении
каждый элемент – одна из

Получение плана План запроса – дерево в текстовом представлении каждый элемент –
выполняемых операций
получение данных, построение битовых карт, обработка данных, операция над множествами, соединение, вложенный запрос
выполнение плана – обход дерева

Слайд 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 подходит только для локальной отладки

Слайд 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 фиксирует
все это в лог сервера

Слайд 12

Получение плана

Модуль auto_explain

Получение плана Модуль auto_explain

Слайд 13

Получение плана

Модуль auto_explain

Получение плана Модуль auto_explain

Слайд 14

Получение плана

Логи и план текстом – ненаглядно:
узел содержит сумму по ресурсам поддерева
время

Получение плана Логи и план текстом – ненаглядно: узел содержит сумму по
необходимо умножать на loops
… так кто же «самое слабое звено»?

Слайд 15

Получение плана

Логи и план текстом – ненаглядно:
узел содержит сумму по ресурсам поддерева
время

Получение плана Логи и план текстом – ненаглядно: узел содержит сумму по
необходимо умножать на loops
… так кто же «самое слабое звено»?
«Понимание плана – это искусство, и чтобы овладеть им, нужен определённый опыт…»

Слайд 16

Получение плана

Логи и план текстом – ненаглядно:
узел содержит сумму по ресурсам поддерева
время

Получение плана Логи и план текстом – ненаглядно: узел содержит сумму по
необходимо умножать на loops
… так кто же «самое слабое звено»?
Нужна хорошая визуализация!

Слайд 17

Визуализация плана

Визуализация плана

Слайд 18

Визуализация плана

explain.depesz.com

Визуализация плана explain.depesz.com

Слайд 19

Визуализация плана

explain.depesz.com – pro
«собственное» время каждого узла
отклонение от статистически-плановых rows
количество повторов каждого

Визуализация плана explain.depesz.com – pro «собственное» время каждого узла отклонение от статистически-плановых
узла
архив планов (можно обмениваться ссылками)

Слайд 20

Визуализация плана

explain.depesz.com – contra
требует copy&paste планов из лога
нет анализа ресурсов (buffers)
код на

Визуализация плана explain.depesz.com – contra требует copy&paste планов из лога нет анализа
Perl, нет развития
ошибки анализа CTE/InitPlan :(

Слайд 21

Визуализация плана

explain.depesz.com – ошибки анализа CTE Scan

Визуализация плана explain.depesz.com – ошибки анализа CTE Scan

Слайд 22

Визуализация плана

explain.sbis.ru
ура! мы пишем свое!
Node.JS + Express + Twitter Bootstrap + D3.js
прототип

Визуализация плана explain.sbis.ru ура! мы пишем свое! Node.JS + Express + Twitter
за 2 недели

Слайд 23

Визуализация плана

explain.sbis.ru
собственный парсер плана
корректный анализ CTE Scan
анализ распределения ресурсов (buffers)
наглядность, подсветка синтаксиса

Визуализация плана explain.sbis.ru собственный парсер плана корректный анализ CTE Scan анализ распределения

Слайд 24

Визуализация плана

explain.sbis.ru – полный план

Визуализация плана explain.sbis.ru – полный план

Слайд 25

Визуализация плана

explain.sbis.ru – сокращенный план (шаблон)

Визуализация плана explain.sbis.ru – сокращенный план (шаблон)

Слайд 26

Визуализация плана

explain.sbis.ru – распределение затрат времени

Визуализация плана explain.sbis.ru – распределение затрат времени

Слайд 27

Визуализация плана

explain.sbis.ru – распределение затрат времени

Визуализация плана explain.sbis.ru – распределение затрат времени

Слайд 28

Визуализация плана

explain.sbis.ru – «грабли»
проблемы округления
0.001ms × (loops=1000) = 0.95ms .. 1.05ms
распределение ресурсов

Визуализация плана explain.sbis.ru – «грабли» проблемы округления 0.001ms × (loops=1000) = 0.95ms
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 )
cl LIMIT 1 OFFSET 100);

Слайд 30

Визуализация плана

explain.sbis.ru – «грабли»

Визуализация плана explain.sbis.ru – «грабли»

Слайд 31

Визуализация плана

explain.sbis.ru – дерево выполнения

Визуализация плана explain.sbis.ru – дерево выполнения

Слайд 32

Визуализация плана

explain.sbis.ru – дерево выполнения

Визуализация плана explain.sbis.ru – дерево выполнения

Слайд 33

Визуализация плана

explain.sbis.ru – дерево выполнения

Визуализация плана explain.sbis.ru – дерево выполнения

Слайд 34

Визуализация плана

explain.sbis.ru
«Теперь, Нео, ты знаешь кунг-фу»

Визуализация плана explain.sbis.ru «Теперь, Нео, ты знаешь кунг-фу»

Слайд 35

Консолидация логов

Консолидация логов

Слайд 36

Консолидация логов

«Копипаста» – плохо
100+ серверов
1000+ разработчиков

Консолидация логов «Копипаста» – плохо 100+ серверов 1000+ разработчиков

Слайд 37

коллектор

SSH port forward + psql

SSH connection (ключ)

tail -F

SELECT * FROM pg_stat_activity;

Консолидация

коллектор SSH port forward + psql SSH connection (ключ) tail -F SELECT
логов

SELECT * FROM pg_locks;

Слайд 38

tail -F

Консолидация логов

COPY … FROM STDIN

tail -F Консолидация логов COPY … FROM STDIN

Слайд 39

Консолидация логов

100+ серверов, 50Kqps, 100-150GB/день
секционирование по дням (ждем 10.0!)
очень-очень быстрый «потоковый» COPY
отказались

Консолидация логов 100+ серверов, 50Kqps, 100-150GB/день секционирование по дням (ждем 10.0!) очень-очень
от триггеров (почти)

Слайд 40

Консолидация логов

Отказались от триггеров
нет ссылочной целостности (нет FK и их проверки)
агрегация и

Консолидация логов Отказались от триггеров нет ссылочной целостности (нет FK и их
хэширование на стороне коллектора
каждая таблица наполняется «своим» потоком

Слайд 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
STDIN

Консолидация логов

Слайд 42

Консолидация логов

«Потоковый» COPY
всегда открыт COPY-канал/пул на таблицу
«переоткрывается» раз в XXXms для закрытия

Консолидация логов «Потоковый» COPY всегда открыт COPY-канал/пул на таблицу «переоткрывается» раз в
TX
отправляем запись в канал сразу при получении
никакой дополнительной буферизации, да-да

Слайд 43

Консолидация логов

«Потоковый» COPY
таблицы-словари
триггер BEFORE INSERT
9.5+: INSERT … ON CONFLICT DO NOTHING

Консолидация логов «Потоковый» COPY таблицы-словари триггер BEFORE INSERT 9.5+: INSERT … ON CONFLICT DO NOTHING

Слайд 44

Консолидация логов

«Потоковый» COPY
тогда: 4K write ops -> 1K write ops (в 4

Консолидация логов «Потоковый» COPY тогда: 4K write ops -> 1K write ops
раза!)
сейчас: 6K write ops ~100MB/s, 10TB/3мес

Слайд 45

Понимаем проблемы

Понимаем проблемы

Слайд 46

Понимаем проблемы

100+ серверов, 50Kqps, 100-150GB/день
миллионы планов за сутки

Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день миллионы планов за сутки

Слайд 47

Понимаем проблемы

100+ серверов, 50Kqps, 100-150GB/день
миллионы планов за сутки

Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день миллионы планов за сутки

Слайд 48

Понимаем проблемы

100+ серверов, 50Kqps, 100-150GB/день
миллионы планов за сутки

Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день миллионы планов за сутки

Слайд 49

Понимаем проблемы

100+ серверов, 50Kqps, 100-150GB/день
кто? откуда этот запрос
где? что за сервер, база
как?

Понимаем проблемы 100+ серверов, 50Kqps, 100-150GB/день кто? откуда этот запрос где? что
в чем проблема в плане

Слайд 50

Понимаем проблемы

«Хозяин» у каждого запроса
SET application_name = ':'
страдаем от ограничения в 63

Понимаем проблемы «Хозяин» у каждого запроса SET application_name = ' : '
байта (тип 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

Слайд 52

Понимаем проблемы

«Хозяин» у каждого запроса

Понимаем проблемы «Хозяин» у каждого запроса

Слайд 53

Понимаем проблемы

Модель анализа
экземпляр PostgreSQL (хост:порт), день
шаблон, приложение/метод, узел плана

Понимаем проблемы Модель анализа экземпляр PostgreSQL (хост:порт), день шаблон, приложение/метод, узел плана

Слайд 54

Понимаем проблемы

От планов – к шаблонам
уменьшение количества анализируемых объектов
вычленение общих паттернов поведения

Понимаем проблемы От планов – к шаблонам уменьшение количества анализируемых объектов вычленение общих паттернов поведения

Слайд 55

Понимаем проблемы

Разрезы анализа планов
количество фактов по шаблону/методу
суммарное и среднее время
количество ресурсов (buffers

Понимаем проблемы Разрезы анализа планов количество фактов по шаблону/методу суммарное и среднее
hit/read)
таймлайны

Слайд 56

Понимаем проблемы

Понимаем проблемы

Слайд 57

Понимаем проблемы

Понимаем проблемы

Слайд 58

Понимаем проблемы

Разрезы анализа узлов
Seq Scan, Index [Only] Scan, Bitmap (Index|Heap) Scan
количество фактов/шаблонов

Понимаем проблемы Разрезы анализа узлов Seq Scan, Index [Only] Scan, Bitmap (Index|Heap)
по узлу
loops, rows, RRbF (суммарно и в среднем)

Слайд 59

Понимаем проблемы

Понимаем проблемы

Слайд 60

… и устраняем причины

… и устраняем причины