pg_test_timing#

pg_test_timing

pg_test_timing

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, отдельные операции также замеряются, а также показывается сводка. Задержку вашей системы можно проверить, подсчитав строки с помощью программы psql:

CREATE TABLE t AS SELECT * FROM generate_series(1,100000);
\timing
SELECT COUNT(*) FROM t;
EXPLAIN ANALYZE SELECT COUNT(*) FROM t;

Система i7-860 выполняет запрос на подсчет за 9,8 мс, в то время как версия с использованием EXPLAIN ANALYZE занимает 16,6 мс, обрабатывая немного более 100 000 строк. Разница в 6,8 мс означает, что издержки на каждую строку составляют 68 нс, примерно в два раза больше, чем оценивалось pg_test_timing. Даже такое относительно небольшое количество издержек делает полностью отсчитываемый оператор подсчета почти на 70% дольше. При более значительных запросах издержки на замер времени были бы менее критичными.

Изменение источников времени

На некоторых новых системах Linux можно в любое время изменить источник синхронизации, используемый для сбора данных о времени. Второй пример показывает возможное замедление при переключении на более медленный источник времени 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     27.84870    1155682
     2     72.05956    2990371
     4      0.07810       3241
     8      0.01357        563
    16      0.00007          3

В этой конфигурации пример EXPLAIN ANALYZE выше занимает 115,9 мс. Это 1061 нс издержек на замер времени, снова небольшое кратное тому, что измеряется непосредственно этой утилитой. Такое количество времени издержек означает, что фактический запрос занимает только крошечную долю учтенного времени, большая часть времени тратится на издержки. В этой конфигурации любые общие EXPLAIN ANALYZE, включающие множество операций с временем, будут значительно завышены из-за издержек на замер времени.

FreeBSD также позволяет изменять источник времени на лету и регистрирует информацию о выбранном таймере при загрузке:

# dmesg | grep "Timecounter"
Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounters tick every 10.000 msec
Timecounter "TSC" frequency 2531787134 Hz quality 800
# sysctl kern.timecounter.hardware=TSC
kern.timecounter.hardware: ACPI-fast -> TSC

Другие системы могут позволять устанавливать источник времени только при загрузке. На старых Linux системах настройка ядра "clock" - это единственный способ сделать такое изменение. И даже на некоторых более новых системах, единственный вариант, который вы увидите для источника времени - это "jiffies". Jiffies - это старая реализация программных часов Linux, которая может иметь хорошее разрешение, когда она поддерживается достаточно быстрым аппаратным таймером, как в этом примере:

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
jiffies
$ dmesg | grep time.c
time.c: Using 3.579545 MHz WALL PM GTOD PIT/TSC timer.
time.c: Detected 2400.153 MHz processor.
$ pg_test_timing
Testing timing overhead for 3 seconds.
Per timing duration including loop overhead: 97.75 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

Аппаратные средства часов и точность синхронизации

Сбор точной информации о времени обычно выполняется на компьютерах с использованием аппаратных часов с различной точностью. С некоторым аппаратным обеспечением операционные системы могут передавать время системных часов практически непосредственно программам. Системные часы также могут быть получены из микросхемы, которая просто предоставляет прерывания времени, периодические сигналы через известные временные интервалы. В любом случае, ядра операционных систем предоставляют источник времени, который скрывает эти детали. Однако точность этого источника времени и скорость возвращения результатов зависят от аппаратного обеспечения.

Неточное ведение времени может привести к нестабильности системы. Очень тщательно тестируйте любые изменения источника времени. По умолчанию операционные системы иногда настраиваются на обеспечение надежности в ущерб точности. Если вы используете виртуальную машину, изучите рекомендуемые источники времени, совместимые с ней. Виртуальное оборудование сталкивается с дополнительными трудностями при эмуляции таймеров, и часто поставщики рекомендуют отдельные настройки для каждой операционной системы.

Источник времени Time Stamp Counter (TSC) является наиболее точным из доступных на современных процессорах текущего поколения. Это предпочтительный способ отслеживания системного времени, когда он поддерживается операционной системой и TSC-часы надежны. Существует несколько способов, которые могут привести к недостоверности TSC в качестве точного источника времени. У старых систем может быть TSC-часы, которые меняются в зависимости от температуры процессора, что делает их непригодными для использования в качестве источника времени. Попытка использовать TSC на некоторых старых многоядерных процессорах может давать несогласованное время на нескольких ядрах. Это может привести к перемотке времени назад, проблему, на которую проверяется данная программа. И даже самые новые системы могут не обеспечивать точное TSC-время при очень агрессивных конфигурациях энергосбережения.

Более новые операционные системы могут проверять известные проблемы с TSC и переключаться на более медленный, более стабильный источник времени, когда они обнаруживаются. Если ваша система поддерживает TSC, но по умолчанию не использует его, это может быть отключено по хорошей причине. Кроме того, некоторые операционные системы могут некорректно обнаруживать все возможные проблемы или разрешать использование TSC даже в ситуациях, когда известно, что он неточен.

Высокоточный таймер событий (HPET) является предпочтительным таймером на системах, где он доступен и TSC не является точным. Сам чип таймера может быть настроен для обеспечения разрешения до 100 наносекунд, но вы можете не увидеть такую точность в системных часах.

Расширенный интерфейс конфигурации и управления питанием (ACPI) предоставляет таймер управления питанием (PM), который в Linux называется acpi_pm. Часы, полученные из acpi_pm, обеспечивают разрешение не более 300 наносекунд.

Таймеры, используемые на старом оборудовании ПК, включают программный интервальный таймер 8254 (PIT), часы реального времени (RTC), расширенный программный прерывающий контроллер (APIC) таймер и таймер Cyclone. Эти таймеры стремятся к разрешению в миллисекундах.

См. также

EXPLAIN