Найти в Дзене
Postgres DBA

Сценарий №4.1 "HeavyWeight": IO + CPU utilization , нехватка shared_buffer.

Корреляционный анализ ожиданий при проведении тестового нагрузочного тестирование по сценарию "HeavyWeight" - повышенная утилизация CPU. Уточнить характерные признаки недостаточного размера shared_buffer при повышенной утилизации CPU и большом объеме чтений данных . Виртуальная машина cat /proc/cpuinfo processor       : 0 model name      : Intel Xeon Processor (Skylake, IBRS, no TSX) cpu MHz         : 2693.670 processor       : 1 model name      : Intel Xeon Processor (Skylake, IBRS, no TSX) cpu MHz         : 2693.670 Тестовый запрос SELECT SUM( gcd( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) * lcm( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) * power(gcd( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) , lcm( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ))) INTO current_result FROM pgbench_accounts  ; План выполнения тестового запроса                                QUERY PLAN ------------
Оглавление
Предельные нагрузки, лучше не превышать.
Предельные нагрузки, лучше не превышать.

Постановка задачи

Корреляционный анализ ожиданий при проведении тестового нагрузочного тестирование по сценарию "HeavyWeight" - повышенная утилизация CPU.

Уточнить характерные признаки недостаточного размера shared_buffer при повышенной утилизации CPU и большом объеме чтений данных .

Реализация теста

Виртуальная машина

cat /proc/cpuinfo
processor       : 0
model name      : Intel Xeon Processor (Skylake, IBRS, no TSX)
cpu MHz         : 2693.670
processor       : 1
model name      : Intel Xeon Processor (Skylake, IBRS, no TSX)
cpu MHz         : 2693.670

Тестовый запрос

SELECT
SUM(
gcd( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) *
lcm( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric )
*
power(gcd( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) ,
lcm( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric )))
INTO current_result
FROM pgbench_accounts  ;

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

                               QUERY PLAN
---------------------------------------------------------------------------------------------
Aggregate  (cost=232786.90..232786.91 rows=1 width=32) (actual time=14435.176..14435.177 rows=1 loops=1)
   Buffers: shared hit=16235 read=16552
   I/O Timings: shared read=973.889
   ->  Seq Scan on pgbench_accounts  (cost=0.00..52786.99 rows=1999999 width=4) (actual time=0.039..3764.889 rows=2000000 loops=1)
         Buffers: shared hit=16235 read=16552
         I/O Timings: shared read=973.889
Planning:
   Buffers: shared hit=63
Planning Time: 15.128 ms
Execution Time: 14435.289 ms

Нагрузка в ходе выполнения теста

Длительность итерации = 10 минут.

Рост нагрузки - экспоненциально.

Ось X - номер тестовой итерации. Ось Y - количество сессий (--clints в pgbench)
Ось X - номер тестовой итерации. Ось Y - количество сессий (--clints в pgbench)

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

Ось X - номер тестовой итерации. Ось Y - значение операционной скорости тестового запроса.
Ось X - номер тестовой итерации. Ось Y - значение операционной скорости тестового запроса.

Тест был принудительно завершен после потери работоспособности СУБД после выполнении итерации №16.

Ось X - номер тестовой итерации. Ось Y - среднее время выполнения тестового запроса
Ось X - номер тестовой итерации. Ось Y - среднее время выполнения тестового запроса

Операционная скорость и ожидания СУБД в ходе выполнения теста

Время выполнения с итерации №6 до итерации №16.

Периодичность сбора данных = 1 минута.

Операционная скорость

Ось X - точка времени. Ось Y - значение операционной скорости СУБД.
Ось X - точка времени. Ось Y - значение операционной скорости СУБД.

Ожидания СУБД

Ось X - точка времени. Ось Y - ожидания СУБД.
Ось X - точка времени. Ось Y - ожидания СУБД.

Линия регрессии операционной скорости и ожиданий СУБД

Углы наклона линии регрессии и процентное отношение линии регрессии
Углы наклона линии регрессии и процентное отношение линии регрессии

Коэффициенты корреляции

Коэффициенты корреляции между операционной скоростью и ожиданиями.
Коэффициенты корреляции между операционной скоростью и ожиданиями.

Ожидания типа IO, IPC , LWLock

Ось X - точка времени. Ось Y - ожидания типа IO
Ось X - точка времени. Ось Y - ожидания типа IO
Ось X - точка времени. Ось Y - ожидания типа IPC
Ось X - точка времени. Ось Y - ожидания типа IPC
Ось X - точка времени. Ось Y - ожидания типа LWLock
Ось X - точка времени. Ось Y - ожидания типа LWLock

События ожиданий (wait_event) по тестовому запросу

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

Столбцы таблицы:

  • timestamp : точка времени сбора статистических данных уровня SQL.
  • datname : База данных, в которой выполнялся SQL запрос.
  • rolname : Роль, под которой выполнялся SQL запрос.
  • CALLS : Количество выполнений запроса .
  • WAITINGS : Количество ожиданий типа IO , LWLock .
  • WAITINGS TO CALLS : количество ожиданий на одно выполнение.
  • WAIT_EVENTS : события ожидания wait_event , возникающие при выполнении SQL запроса .
  • SQL : текст SQL запроса (не приведен).

События ожидания возникающие при выполнении SQL запроса:

  • DataFileRead : Ожидание чтения из файла данных отношения.
  • BufferIO : Ожидание завершения буферного ввода/вывода.
  • BufferMapping : Ожидание при связывании блока данных с буфером в пуле буферов.

Итог

Характерным признаком недостаточного размера общей области памяти shared_buffers является корреляция между снижением операционной скорости и ростом ожиданий BufferMapping/BufferIO.