Серия «СУБД PostgreSQL»

Производительность PostgreSQL для разных ОС - часть 3

Взято с основного технического канала Postgres DBA

Продолжение цикла статей о статистическом анализе результатов нагрузочного тестирования СУБД PostgreSQL :

Часть 3 - Сценарий нагрузочного тестирования "Heavyweight"

Нужно выбирать

Нужно выбирать

Задача эксперимента

Необходимо провести количественный анализ влияния версии Linux на производительность СУБД для разных дистрибутивов Linux : OS-1 и OS-2 .

СУБД расположены на разных виртуальных машинах. Гипервизор - один. Конфигурация файловых систем - одинаковая. Ресурсы хоста - одинаковые.

Сценарий "Heavyweight"

Тестовый запрос состоит только из выражений SELECT с использованием JOIN ,ORDER BY и математических функций.

Все блоки использующиеся в запросе - находятся в распределенной области.

Для создания нагрузки используется pgbench.

Количество сессий к СУБД растет экспоненциально для каждого прохода теста.

Производительность СУБД

До 78 соединений - разница в производительности не более 3%

До 78 соединений - разница в производительности не более 3%

Резкий рост относительной разницы производительности после 76 соединений

Резкий рост относительной разницы производительности после 76 соединений

До 78 соединений - разница в производительности практически отсутствует.

При высокой нагрузке - OS-2 существенно производительнее.

Время выполнения тестового запроса

Явная аномалия в районе 78 соединений

Явная аномалия в районе 78 соединений

Имеется аномалия значений

Имеется аномалия значений

За исключением аномалии при 78 соединений, относительная разница времени выполнения не превышает 5%.

Итог

Для сценария "Heavyweight", при нагрузке свыше 78 сессий - производительность СУБД развернутой на ОС Linux версии OS-2 превосходит производительность СУБД развернутой на ОС Linux версии OS-1 более чем на 10%.

P.S. Аномальное значение при 78 сессиях нуждается в повторном эксперименте.

Показать полностью 5

Корреляционный анализ для определения причин деградации производительности СУБД PostgreSQL

математическая статистика в целом не подходит для общего анализа и сравнения производительности СУБД.

Эпиграф

Чем же может оказаться полезной математическая статистика или комментарий к комментарию.

Тренды на график метрики производительности СУБД

Тренды на график метрики производительности СУБД

Активные соединения и утилизация CPU

Активные соединения и утилизация CPU

Для сглаживания данных используется медианное сглаживание:

  • Долгая скользящая: 1 час(красная линия).

  • Короткая скользящая: 10 минут(синяя линия).

  • Активные соединения и утилизация CPU: стандартные метрики Zabbix.

Как видно из графика - имеет место деградация производительности СУБД:

  1. Количество активных сессий растет, но производительность падает

  2. Утилизация CPU растет , но производительность падает

Ситуация, принципиально отличается от описанной в казалось бы похожих кейсах:

  1. CPU Utilization = 100%. Это проблема СУБД?

  2. CPU Utilization = 100%. Это проблема СУБД?

Поэтому и решаться данный инцидент будет по другому.

Использование статистического анализа

1.Выделение трендов на графике производительности

Выполняется тривиально, дополнительных инструментов не требуется.

  • 13:00 - 13:28 : Горизонтальный тренд - высокая производительность

  • 13:28 - 13:47 : Деградация производительности

  • 13:57 - 14:05 : Горизонтальный тренд - низкая производительность. Нагрузка на СУБД уменьшилась.

13:00 - 13:28 : Горизонтальный тренд - высокая производительность

Статистические показатели производительности СУБД

Рис.1. Статистические показатели горизонтального тренда 13:00-13:28

Рис.1. Статистические показатели горизонтального тренда 13:00-13:28

Прямая корреляция между количество активных сессий и производительностью СУБД . Или другими словами - чем выше нагрузка на СУБД , тем выше производительность.

Статистические показатели ожиданий СУБД - корреляция ожиданий и производительности СУБД

Рис.2. Корреляционный анализ ожиданий и производительности 13:00-13:28

Рис.2. Корреляционный анализ ожиданий и производительности 13:00-13:28

Количество пользовательских запросов по которым имеются события ожидания СУБД - минимально.

13:28 - 13:47 : Деградация производительности

Статистические показатели производительности СУБД

Рис.3. Статистические показатели нисходящего тренда 13:28 - 13:47

Рис.3. Статистические показатели нисходящего тренда 13:28 - 13:47

Сильная обратная корреляция - чем выше нагрузка на СУБД тем ниже производительность. Явный признак инцидента производительности СУБД

Статистические показатели ожиданий СУБД - корреляция ожиданий и производительности СУБД

Рис.4. Корреляционный анализ ожиданий и производительности СУБД нисходящего тренда 13:28 - 13:47

Рис.4. Корреляционный анализ ожиданий и производительности СУБД нисходящего тренда 13:28 - 13:47

Как видно из таблицы - количество ожиданий кардинально увеличилось. Явный признак - имеются серьезные проблемы с производительностью СУБД.

2.Определение наиболее значимой причины деградации производительности СУБД

Из Рис.4 видно, что наибольшая обратная корреляция между событиями ожидания и снижением производительности СУБД имеется для события LWLock / BufferMapping

Рис.5. Ожидание LWLock / BufferMapping

Рис.5. Ожидание LWLock / BufferMapping

Как видно - количество ожиданий менее чем за 20 минут - весьма существенно.

Итак, первый результат

Первой( но конечно не единственной) причиной деградации производительности СУБД в период 13:28 - 13:47 является - большое количество ожиданий LWLock / BufferMapping при выполнении пользовательских запросов.

Чуть подробнее об ожидании BufferMapping

Ожидание при связывании блока данных с буфером в пуле буферов.

Postgres Pro Enterprise : Документация: 16: 27.2. Система накопительной статистики : Компания Postgres Professional

LWLock - buffer_mapping

This event occurs when a session is waiting to associate a data block with a buffer in the shared buffer pool.

Context

The shared buffer pool is an PostgreSQL memory area that holds all pages that are or were being used by processes. When a process needs a page, it reads the page into the shared buffer pool. The shared_buffers parameter sets the shared buffer size and reserves a memory area to store the table and index pages. If you change this parameter, make sure to restart the database. For more information, see Shared Buffer Area.

The buffer_mapping wait event occurs in the following scenarios:

  • A process searches the buffer table for a page and acquires a shared buffer mapping lock.

  • A process loads a page into the buffer pool and acquires an exclusive buffer mapping lock.

  • A process removes a page from the pool and acquires an exclusive buffer mapping lock.

LWLock - buffer_mapping | Redrock Postgres Documentation (rockdata.net)

3. Определение запросов с максимальным количество ожиданий

Рис.6. Запросы с ожиданием LWLock / BufferMapping c количество более 100.

Рис.6. Запросы с ожиданием LWLock / BufferMapping c количество более 100.

Далее, дело техники, используя утилиту pgpro_pwr по queryid, находим проблемный запрос за период 13:30 - 13:50(снимки pgpro_pwr формируются каждые 10 минут).

Запрос передается разработчикам , для анализа .

Дальнейшие события ожидания анализируются схожим образом. Если отсортировать таблицу Рис.4. по количеству пользовательских запросов(более 100) , то можно и нужно сформировать список проблемных запросов для передачи группе разработки на оптимизацию и доработку.

Рис.7. Список ожиданий отсортированный по количеству пользовательских запросов.

Рис.7. Список ожиданий отсортированный по количеству пользовательских запросов.

Итог

Статистический анализ производительности СУБД позволяет подтвердить наличие деградации производительности не дожидаясь деградации на уровне приложения.

Корреляционный анализ ожиданий и производительности СУБД позволяет быстрее определить корневую причину снижения производительности СУБД и определить список проблемных пользовательских запросов.

P.S.

В настоящее время ведутся работы по разработке и тестированию новой версии инструментария по мониторингу и анализу производительности СУБД PostgreSQL - "Орешник".

Методология статистического анализа производительности СУБД PostgreSQL будет довольно существенно дополнена и доработана.

Показать полностью 9

Производительность PostgreSQL для разных ОС - часть 2

Взято с основного технического канала Postgres DBA

Продолжение цикла статей о статистическом анализе результатов нагрузочного тестирования СУБД PostgreSQL :

Часть 2 - Сценарий нагрузочного тестирования "OLTP"

Выбирай сердцем

Выбирай сердцем

Задача эксперимента

Необходимо провести количественный анализ влияния версии Linux на производительность СУБД для разных дистрибутивов Linux : OS-1 и OS-2 .

СУБД расположены на разных виртуальных машинах. Гипервизор - один. Конфигурация файловых систем - одинаковая. Ресурсы хоста - одинаковые.

Сценарий "OLTP"

Тестовый запрос состоит только из выражений SELECT - UPDATE.

Все блоки использующиеся в запросе - находятся в распределенной области.

Для создания нагрузки используется pgbench.

Количество сессий к СУБД растет экспоненциально для каждого прохода теста.

Производительность СУБД

Разница производительности от 5-9%

Разница производительности от 5-9%

Относительная разница производительности OS-1 и OS-2

Относительная разница производительности OS-1 и OS-2

Время выполнения тестового запроса

Разница времени выполнения тестового запроса от -5% до 7%

Разница времени выполнения тестового запроса от -5% до 7%

Относительная разница времени выполнения тестового запроса

Относительная разница времени выполнения тестового запроса

Итог

Для сценария "OLTP", при нагрузке до 111 сессий - производительность СУБД развернутой на ОС Linux версии OS-1 превосходит производительность СУБД развернутой на ОС Linux версии OS-2 на 5-9% .

Показать полностью 5

Производительность PostgreSQL для разных ОС - часть 1

Взято с основного технического канала Postgres DBA

Продолжение цикла статей о статистическом анализе результатов нагрузочного тестирования СУБД PostgreSQL :

Часть 1 - сценарий нагрузочного тестирования "Select only"

Какой Linux выбрать ?

Какой Linux выбрать ?

Задача эксперимента

Необходимо провести количественный анализ влияния версии Linux на производительность СУБД для разных дистрибутивов Linux : OS-1 и OS-2 .

СУБД расположены на разных виртуальных машинах. Гипервизор - один. Конфигурация файловых систем - одинаковая. Ресурсы хоста - одинаковые.

Сценарий "Select only"

Тестовые запрос состоит только из выражения SELECT.

Все блоки использующиеся в запросе - находятся в распределенной области.

Для создания нагрузки используется pgbench.

Количество сессий к СУБД растет экспоненциально для каждого прохода теста.

Производительность СУБД

Разница производительности от 10 до 13%

Разница производительности от 10 до 13%

Относительная разница производительности OS-1 и OS-2

Относительная разница производительности OS-1 и OS-2

Время выполнения тестового запроса

Разница времени выполнения тестового запроса до 7%

Разница времени выполнения тестового запроса до 7%

Относительная разница времени выполнения тестового запроса

Относительная разница времени выполнения тестового запроса

Итог

Для сценария "Select only", при нагрузке до 111 сессий - производительность СУБД развернутой на ОС Linux версии OS-1 превосходит производительность СУБД развернутой на ОС Linux версии OS-2 не менее чем на 10% .

Показать полностью 5

Сравнение производительности PostgreSQL

Взято с основного технического канала Postgres DBA

Обе хороши, но различия все таки есть

Обе хороши, но различия все таки есть

Предисловие

Статья не о сравнении ОС, задача статьи - тестирование методологии сравнения производительности СУБД.


Задача

Имеется 2 виртуальных машины с развернутой СУБД PostgreSQL.

Версия СУБД - одинаковая.

ОС - одинаковая. Гипервизор - один.

Различие - системный диск HDD vs. SSD.

Необходимо количественно определить влияние расположения файлов ОС на производительность СУБД. Т.е. определить разницу в накладных расходах для создания серверного процесса для нового соединения .


Реализация эксперимента - сценарии нагрузки

Для оценки производительности и среднего времени выполнения тестового запроса используются 3 сценария нагрузки:

  1. Select only (условный сценарий WEB): нагрузка в виде запроса .

  2. TPC-B (условный сценарий OLTP): Нагрузка в виде транзакции состоящей из UPDATE-SELECT

  3. Heavyweight (условный сценарий DSS): Нагрузка в виде тяжелого запроса SELECT..JOIN..ORDER BY + вычислительная нагрузка

  • Индекс производительности СУБД(CPI) : операционная скорость

  • Время выполнения тестового запроса: скользящая медиана с периодом 1 час.

  • Максимальная нагрузка: 100 одновременных запросов.

  • Рост нагрузки: экспоненциально, с коэффициентом 0.2

Результаты эксперимента

Select only

Производительность СУБД

Разница производительности не превышает 1%

Разница производительности не превышает 1%

Время выполнения тестового запроса

Разница времени выполнения не превышает 3.5%

Разница времени выполнения не превышает 3.5%

Итог по сценарию Select only :

Производительность СУБД - практически не отличается.

TPC-B

Производительность СУБД

Разница производительности не превышает 1.5%

Разница производительности не превышает 1.5%

Время выполнения тестового запроса

Разница времени выполнения не превышает 2.5%

Разница времени выполнения не превышает 2.5%

Итог по сценарию TPC-B

Производительность СУБД - практически не отличается.

Heavyweight

Производительность СУБД

Проявляется разница в производительности

Проявляется разница в производительности

  • До 54 соединений: разница производительности не превышает 3%

  • 65 - 93: Производительность ВМ2 выше до 17%

  • 111 соединений: резкая деградация производительности . Производительность ВМ2 на 21%

Время выполнения тестового запроса

Заметна разница времени выполнения тестового запроса

Заметна разница времени выполнения тестового запроса

  • До 45 соединений: разница времени выполнения не превышает 2%

  • с 54-111 соединений: Время выполнения тестового на ВМ2 увеличивается до 9%

  • 111 соединений: резкое увеличение времени выполнения тестового запроса. Время выполнения тестового на ВМ2 больше на 22%

Итог по сценарию Heavyweight

При сравнительно небольших нагрузках (до 45-54 соединений) производительность ВМ1 и ВМ2 не отличается.

При высоких нагрузках (54 и более) производительность ВМ2 выше. Однако и время выполнения тестового запросы тоже выше.

Общий итог

1.Только при использовании разных сценариев нагрузки можно получить полную картину производительности СУБД .

2. Для ОС использованной в тесте , при невысокой нагрузке на СУБД, расположение системного диска на HDD или SSD - несущественно .

Показать полностью 6
0

О проблеме использования mean_exec_time при анализе производительности PostgreSQL

Взято с основного технического канала Postgres DBA

В реальной эксплуатации - применимо с существенными ограничениями.

В реальной эксплуатации - применимо с существенными ограничениями.

Проблема

Имеется 2 виртуальные машины в облачном хранилище - версия СУБД одинаковая, гипервизор один , других ВМ в гипервизоре - нет.


Производительность СУБД

Разница в производительности СУБД не превышает 2.5%

Разница в производительности СУБД не превышает 2.5%

Среднее время выполнения тестового запроса

Разница непрерывно растет и достигает 80%

Разница непрерывно растет и достигает 80%

В результате - производительность СУБД практически не отличается , а среднее время выполнения тестового запроса отличается кардинально. Как такое возможно ?

Причина

Использование при расчета значение mean_exec_time среднего арифметического .

Среднее арифметическое не всегда является идеальным показателем. Например, если ваши данные содержат очень высокие или низкие значения, они могут сильно исказить среднее. В таких случаях рассмотрите использование других статистических мер.

Как найти среднее арифметическое

Для иллюстрации проблемы был проведен простой эксперимент

Серия запусков тестового запроса с фиксацией времени выполнения и искусственным выбросом(замедление выполнения) .

Результаты

Всего 1(один) выброс

Всего 1(один) выброс

  1. id duration

  2. 37 4602

  3. 38 14581

  4. 39 4610

  5. 40 4569

  6. 41 4685

  7. 42 4666

  8. 43 4680

  9. 44 4621

  10. 45 4637

mean_exec_time = 5651.6708999

Достаточно всего одного выброса , что бы значение метрики весьма существенно изменилось .

Решение проблемы

Использование в качестве среднего значение - медианы

Медиана — это значение, которое делит упорядоченный набор данных на две равные части. Другими словами, половина значений в наборе данных меньше медианы, а другая половина — больше. Медиана является центральным значением в наборе данных.

Медиана в статистике: как найти центральное значение | Хакнем Школа | Дзен

В данном эксперименте медиана = 4637 . Данное значение вполне соответствует значению подсказываемому здравым смыслом при анализе результатов наблюдений.

Единичный выброс не влияет на значение медианы

Единичный выброс не влияет на значение медианы

Итог

Разница между значением длительности выполнения тестового запроса и mean_exec_time для штатной работы СУБД составляет от 17 до 19%.

Разница между значением длительности выполнения тестового запроса и медианой для штатной работы СУБД составляет от -1.5 до 1%.

Какое значение использовать для усреднения показателей - очевидно.

В дальнейшем, при анализе производительности, метрика mean_exec_time ( представления типа pg_stat_statments/pgpro_stats) исключается из показателей производительности СУБД.

При проведении анализа производительности СУБД нет задачи оценить стабильность работы( облачная инфраструктура в принципе нестабильна и подвержена существенным влияниям внешних факторов), есть задача оценить производительность СУБД.

Показать полностью 5

Оценка производительности PostgreSQL - одного сценария НЕДОСТАТОЧНО

Взято с основного технического канала Postgres DBA

До финиша дойдут не все...

До финиша дойдут не все...

Проблема

ВМ с гораздо большими вычислительными ресурсами показывает скорость ниже , чем более скромная ВМ .

Причина

По умолчанию pgbench тестирует сценарий, примерно соответствующий TPC-B, который состоит из пяти команд SELECT, UPDATE и INSERT в одной транзакции.

Postgres Pro Enterprise : Документация: 16: pgbench : Компания Postgres Professional

Для тестирования использовался именно этот сценарий .

Конфигурация виртуальных машин

ВМ-1

Postgres Pro (enterprise certified) 15.8.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Soft 11.4.0-1), 64-bit

CPU = 8

RAM = 15

OC = RED 7.3

ВМ-2

Postgres Pro (enterprise certified) 14.11.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit

CPU = 24

RAM = 189

ОС = Astra Linux (Smolensk) 1.6

Итоги теста по сценарию TPC-B

Производительность ВМ-1 существенно выше ВМ-2

Производительность ВМ-1 существенно выше ВМ-2

Т.е. по итогам данного теста получается - СУБД развёрнутая по шаблону ВМ-1 будет существенно производительнее ?

Что будет , если архитектор примет решение о выборе версии СУБД и запланирует ресурсы инфраструктуры на основании только данного теста ?

Решение проблемы

Одного теста для анализа производительности СУБД и ВМ - недостаточно.

Как было указано в документации:

Однако вы можете легко протестировать и другие сценарии, написав собственные скрипты транзакций.

Что и было сделано.

Для продолжения тестов, был подготовлен сценарий требующий серьезных вычислительных ресурсов - SELECT ... JOIN

Результат тестирования тяжелого запроса

ВМ-2 СУЩЕСТВЕННО производительнее чем ВМ-1

ВМ-2 СУЩЕСТВЕННО производительнее чем ВМ-1

Все встало на свои места.

ВМ-1 даже не хватило ресурсов при количестве одновременных запросов свыше 160. При этом производительности ВМ-2 существенно выше производительности ВМ-1.

Итог

  1. Нельзя принимать архитектурных решений на основании результатов одного только сценария нагрузочного тестирования

2. Для оценки производительности архитектурного решения по конкретной СУБД необходим комплекс разных сценариев нагрузочного тестирования.

Как минимум:

-Select only: оценка скорости чтения данных из СУБД

-Standard: оценка производительности СУБД в условиях конкуренции за блокировки.

-Heavyweight: оценка производительности СУБД при выполнении тяжелых вычислительных и ресурсоемких операций.

Показать полностью 2

CPU Utilization = 100%. Это проблема СУБД?

Взято с основного технического канала Postgres DBA

Продолжение материала CPU Utilization = 100%. Это проблема СУБД?

Ресурс должен работать !

Ресурс должен работать !

Просто цифры полученные по ходу стресс тестирования СУБД

ВМ-1

CPU Utilization

ВМ-1 : Максимальная утилизация CPU = 99% . Средняя = 81%

ВМ-1 : Максимальная утилизация CPU = 99% . Средняя = 81%

Commited transactions

ВМ-1 : Максимальное значение 18 550 . Среднее значение = 12 810

ВМ-1 : Максимальное значение 18 550 . Среднее значение = 12 810

ВМ-2

CPU Utilization

ВМ-2 : Максимальная утилизация CPU = 28%. Средняя = 14%

ВМ-2 : Максимальная утилизация CPU = 28%. Средняя = 14%

Commited transactions

ВМ-2 : Максимальное значение = 4 470 . Среднее значение = 3 320

ВМ-2 : Максимальное значение = 4 470 . Среднее значение = 3 320

Итог

При данной нагрузке и данном сценарии тестирования - мониторить утилизацию CPU не имеет никакого смысла.

ВМ-1 утилизация близка к предельной, но при этом количество зафиксированных транзакций в среднем в 4 раза выше.

Что подтверждает ранее сделанные выводы

Выводы

Мониторить утилизацию CPU отдельно — не имеет смысла. Мониторить надо производительность СУБД, в первую очередь.

Рост утилизации CPU — не инцидент. Снижение производительности СУБД и рост утилизации CPU — инцидент.

Высокая утилизация CPU и рост производительности СУБД — показывает эффективное использование предоставленных ресурсов. Низкая утилизация CPU и низкая производительность СУБД в рабочее время — зря потраченные средства.

Показать полностью 4
Отличная работа, все прочитано!