pg_test_timing
Эта страница переведена при помощи нейросети GigaChat.
pg_test_timing
— измеряет временные затраты.
Синтаксис
pg_test_timing [option ...]
Описание
pg_test_timing
— утилита, которая определяет временные затраты на получение временных меток в системе и проверяет, не происходит ли откат системного времени назад. Если получение времени на системе происходит медленно, это может снизить точность результатов команды EXPLAIN ANALYZE
.
Параметры
Для утилиты pg_test_timing
существуют следующие параметры командной строки:
-d duration
--duration=duration
- Задает длительность теста в секундах. Более продолжительное тестирование позволяет получить немного более точные результаты и повышает вероятность обнаружения сбоев системных часов. По умолчанию тест выполняется в течение 3 секунд.
-V
--version
- Выводит версию
pg_test_timing
и завершается.
-?
--help
- Показывает справку о параметрах командной строки утилиты
pg_test_timing
и завершается.
Использование
Интерпретация результатов
Хорошая производительность системы проявляется в том, что более 90% отдельных вызовов времени занимают менее одной микросекунды. При этом средняя задержка одного цикла будет еще ниже — менее 100 наносекунд. Пример с процессора Intel i7-860, использующего источник времени TSC, демонстрирует отличную производительность:
Testing timing overhead for 3 seconds.
Per loop time including overhead: 35.96 ns
Histogram of timing durations:
< us % of total count
1 96.40465 80435604
2 3.59518 2999652
4 0.00015 126
8 0.00002 13
16 0.00000 2
Обратите внимание: время одного цикла измеряется в наносекундах, а гистограмма отображает значения в микросекундах. Циклы могут иметь более высокое разрешение по времени, чем отдельные вызовы таймера.
Измерение временных затрат исполнителя
Когда запрос исполняется с помощью EXPLAIN ANALYZE
, PostgreSQL замеряет не только общее время, но и время отдельных операций. Временные затраты на эти операции в системе могут быть проверены путем подсчета строк с помощью программы psql
:
CREATE TABLE t AS SELECT * FROM generate_series(1,100000);
\timing
SELECT COUNT(*) FROM t;
EXPLAIN ANALYZE SELECT COUNT(*) FROM t;
На системе i7-860 обычный SELECT COUNT(*)
выполняется за 9.8 мс, а тот же запрос с EXPLAIN ANALYZE
— за 16.6 мс, при этом обрабатывается около 100 000 строк. Разница в 6.8 мс говорит о том, что временные затраты составляют примерно 68 наносекунд на строку — вдвое больше, чем показал pg_test_timing
. Несмотря на такую небольшую величину, общее время запроса возрастает почти на 70%. В более сложных и длительных запросах этот эффект будет менее заметен.
Изменение источников времени
Некоторые современные Linux-системы позволяют переключать источник времени, используемый для получения временных меток. Ниже пример, показывающий, как производительность может снизиться при смене быстрого таймера TSC на медленный источник времени acpi_pm
:
# cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
# echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource
# pg_test_timing
Per loop time including overhead: 722.92 ns
Histogram of timing durations:
< us % of total count
1 90.23734 27694571
2 9.75277 2993204
4 0.00981 3010
8 0.00007 22
16 0.00000 1
32 0.00000 1
Аппаратное обеспечение часов и точность измерения времени
Получение точной информации о времени на компьютерах зависит от используемых аппаратных часов различной степени точности. С некоторым оборудованием операционные системы способны практически напрямую передавать приложениям значение системного времени. В других случаях системное время получается с микросхемы, которая генерирует синхронизирующие прерывания — регулярные импульсы с фиксированной частотой. В любом случае, ядро операционной системы предоставляет абстрагированный источник синхронизации, скрывающий детали реализации. Однако точность и скорость работы этого источника напрямую зависят от используемого оборудования.
Неточность в замерах времени может приводить к нестабильности системы. Поэтому любые изменения, касающиеся настройки источника времени, требуют предварительного тестирования. В некоторых ОС по умолчанию приоритет может отдаваться стабильности, а не максимальной точности. Особенно важно учитывать этот момент при работе в виртуальной среде — там возможны дополнительные сложности с имитацией аппаратных таймеров. Производители средств виртуализации часто рекомендуют определенные параметры для операционных систем.
Счетчик временных меток (TSC, Time Stamp Counter) — один из самых точных доступных источников времени в современных процессорах. Если он поддерживается операционной системой и работает стабильно, TSC является предпочтительным методом отслеживания времени. Тем не менее, существуют сценарии, в которых использование TSC приводит к ошибкам. На старом оборудовании частота счетчика может зависеть от температуры процессора, из-за чего измерения становятся ненадежными. Также на ранних многоядерных системах возможны расхождения значений TSC между ядрами, что в некоторых случаях может даже привести к откату времени назад — ситуация, на которую ориентирована проверка соответствующего инструмента. Кроме того, даже новые системы могут некорректно работать с TSC при агрессивных настройках энергосбережения.
Современные операционные системы умеют обнаруживать известные проблемы с TSC и при необходимости автоматически переключаются на более медленные, но стабильные источники. Если TSC не используется по умолчанию, на это обычно есть объективные причины. Однако стоит учитывать, что не все ОС способны корректно распознать возможные риски или могут разрешить использование TSC даже в неподходящих условиях.
Если TSC недоступен или его использование нежелательно, предпочтение отдается высокоточному таймеру событий (HPET). Этот таймер программируется с шагом до 100 наносекунд, однако в реальности системные часы могут не отображать такую высокую точность.
Еще один возможный вариант — таймер управления питанием (PM), предоставляемый через интерфейс ACPI. В Linux он известен как acpi_pm
и обеспечивает точность до 300 наносекунд в наилучших условиях.
На старых ПК можно встретить устаревшие типы таймеров, такие как:
- PIT (8254 Programmable Interval Timer);
- RTC (Real-Time Clock);
- APIC (Advanced Programmable Interrupt Controller);
- Cyclone Timer.
Они обеспечивают разрешение времени на уровне миллисекунд и не подходят для задач, требующих высокой точности.
Смотрите также
EXPLAIN