Возможности
Усредненный сбор статистики запросов
Проблема: При сборе метрик запросов хочется получать информацию о времени выполнения, используемых буферах, количестве строк и других характеристиках. Эта информация обычно собирается во время выполнения команды EXPLAIN с включенными дополнительными опциями ANALYZE, COSTS, BUFFERS, TIMING. Однако включение этих опций для каждого запроса значительно увеличивает время выполнения запросов.
Решение: При сборе метрик всех запросов не требуется высокоточная статистика - достаточно приблизительной оценки сложности запросов и выявления проблемных.
Для решения этой задачи в сервер добавлена возможность:
- Собирать метрики только для ограниченного количества строк (например, 1000)
- Экстраполировать метрики на общее количество возвращаемых данных
- Использовать новый флаг сбора усредненной статистики
INSTRUMENT_SPEED_TIMER = 1 << 23
Мониторинг блокировок
Для получения информации о всех блокировках в сервере через плагины добавлен новый хук в сервер.
Ограничение: Поскольку данный хук вызывается достаточно часто, задержки в его обработке могут значительно влиять на общую производительность сервера, поэтому необходимо соблюдать осторожность в обработке.
typedef LockAcquireResult (*LockAcquireExtended_hook_type) (const LOCKTAG *locktag,
LOCKMODE lockmode,
bool sessionLock,
bool dontWait,
bool reportMemoryError,
LOCALLOCK **locallockp);
extern PGDLLIMPORT LockAcquireExtended_hook_type LockAcquireExtended_hook;
Сбор блокирующих запросов
В GP6 из GP7 портирована функциональность позволяющая получить список запросов (pids) вызывающих блокировку текущего.
// Получить массив блокирующих процессов и их число
extern int32_t* metric_pg_blocking_pids(int32_t lockPid, int32_t* returnSize);
// Освободить выделенный массив
extern void metric_free_pg_blocking_pids(int32_t *data);
Уменьшение количества сегментов
Проблема: В GreenPlum существует утилита gpexpand, позволяющая добавлять дополнительные сегменты в работающий кластер. Однако обратная процедура уменьшения количества сегментов была недоступна.
Решение: В сервер добавлена утилита gpshrink, которая работает аналогично gpexpand и позволяет исключать из кластера последовательное количество сегментов с конца списка.
Ограничения:
- Удаление сегментов возможно только с конца списка
- Исключение сегментов должно происходить без пропусков
- При удалении сегментов данные автоматически перераспределяются на оставшиеся сегменты кластера