Некоторое время назад руководитель задал мне вопрос: «Какой MPP-кластер лучше с точки зрения разработчика: Arenadata 6 или Cloudberry?» Я рассказал про версии PostgreSQL, лежащие в основе этих кластеров, - 9 и 14 соответственно. Еще сказал, что для детального анализа производительности желательно развернуть кластеры на серверах, заполнить их данными и выполнить побольше разных запросов.
Мой ответ руководителю не понравился, пришлось выдумывать методику первичного анализа производительности кластеров «на берегу», до разворачивания на серверах. Оказалось, что интересные данные о производительности кластеров можно получить и на персональном компьютере.
Методика проведения экспериментов
Для проведения экспериментов на виртуальные машины были установлены MPP-кластеры:
1. Arenadata DB 6.27 из репозитория:
https://github.com/arenadata/gpdb
по инструкции:
https://github.com/arenadata/gpdb/blob/adb-6.x/README.linux.md
2. Cloudberry Database 1.6 из репозитория:
https://github.com/cloudberrydb/cloudberrydb
по инструкции:
https://cloudberry.apache.org/docs/cbdb-linux-compile
Настройки виртуальных машин – одинаковые:
оперативная память: 16 Гб,
процессоры: 4.
Конфигурации кластеров – одинаковые:
вариант конфигурации: Single-Node,
количество сегментов: 3,
зеркалирование сегментов: да.
Версии PostgreSQL в кластерах:
select version();PostgreSQL 9.4.26 (Greenplum Database 6.27.1_arenadata59+dev.1.gcbb3338b74 build dev) on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit compiled on …PostgreSQL 14.4 (Cloudberry Database 1.6.0+dev.641.ge36838cea1 build dev) on x8 6_64-pc-linux-gnu, compiled by gcc (Ubuntu 10.5.0-1ubuntu1~22.04) 10.5.0, 64-bit compiled on …В кластеры с помощью PXF (Platform Extension Framework) была загружена БД «Авиаперевозки»:
https://postgrespro.ru/education/demodb
Характеристики базы данных: 8 таблиц, общий объем 1.5 Gb и 22 млн строк.
Таблицы в кластерах были распределены (distributed by) по первичным ключам.
В кластерах были выполнены запросы двух видов:
соединения таблиц,
запросы из курса «QPT. Оптимизация запросов» фирмы «PostgresPro»:
https://postgrespro.ru/education/courses/QPT
Замеры времени выполнения запросов выполнялись с помощью команды explain analyze. Для исключения влияния кеширования данных на замеры времени каждый замер выполнялся 3 раза и считалось среднее время.
Анализ производительности соединений
Сначала были выполнены запросы, для которых в первую очередь предназначены MPP-кластеры, - соединения таблиц. Запросы были подобраны максимально разнообразные:
соединения больших и маленьких таблиц,
соединения разного количества таблиц,
запросы с операциями Redistribute Motion в планах выполнения и без них,
запросы с использованием spill-файлов и без использования этих файлов.
Различия в производительности этих запросов на кластерах Arenadata 6 или Cloudberry оказались минимальными. Это можно объяснить тем, что оба MPP-кластера недалеко ушли от своего общего предка – «ванильного» Greenplum-а.
Выполнение запросов из курса «Оптимизация запросов»
В серии экспериментов по курсу оптимизации были обнаружены запросы, время выполнения которых на кластере Cloudberry было заметно меньше, чем на Arenadata 6:
Таблица 1. Запросы с различными временами выполнения на кластерах (мс)
Запрос | Arenadata DB 6.27 | Cloudberry Database 1.6 |
Поиск по диапазону | 201 | 81 |
Агрегирование 1 | 287 | 169 |
Агрегирование 2 | 198 | 97 |
Агрегирование 3 | 206 | 56 |
Агрегирование 4 | 165 | 85 |
Антисоединение | 9 | 5 |
-- Поиск по диапазону
explain analyze select * from bookings where book_ref > '000900' and book_ref < '000939';
-- Агрегирование 1
explain analyze select count(*) from bookings;
-- Агрегирование 2
explain analyze select sum(total_amount) from bookings where book_ref < '400000';
-- Агрегирование 3
explain analyze select count(book_ref) from bookings where book_ref <= '400000';
-- Агрегирование 4
explain analyze select count(*) from bookings where total_amount < 20000 and book_date::timestamp with time zone > '2017-07-15 18:00:00+03'::timestamp;
-- Антисоединение
explain analyze select * from aircrafts a where a.model like 'аэробус%'
and not exists (select * from seats s where s.aircraft_code = a.aircraft_code);
Выводы
Эксперименты показали, что версия PostgreSQL, лежащего в основе MPP-кластера, не оказывает существенного влияния на производительность соединений таблиц. Arenadata DB 6.27 с ядром PostgreSQL 9.4 и Cloudberry Database 1.6 с ядром PostgreSQL 14.4 показали приблизительно одинаковые времена выполнения этого типа запросов.
Выявлено несколько типов запросов, которые в Cloudberry Database 1.6 выполняются эффективнее, чем в Arenadata DB 6.27: поиск по диапазону, агрегирование, антисоединение.
Количество разнообразных MPP-кластеров постоянно растет: Arenadata DB, Cloudberry Database, Yandex.Cloud Greenplum, Greengage... Встает непростая задача выбора кластеров для конкретных проектов. Анализ производительности – одна из составляющих выбора. Поэтому важно совершенствовать методику анализа производительности запросов MPP-кластеров.
