Skip to content

Возможности

Усредненный сбор статистики запросов

Проблема: При сборе метрик запросов хочется получать информацию о времени выполнения, используемых буферах, количестве строк и других характеристиках. Эта информация обычно собирается во время выполнения команды 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 и позволяет исключать из кластера последовательное количество сегментов с конца списка.

Ограничения:

  • Удаление сегментов возможно только с конца списка
  • Исключение сегментов должно происходить без пропусков
  • При удалении сегментов данные автоматически перераспределяются на оставшиеся сегменты кластера