pgbench
pgbench — запустить тест производительности PostgreSQL
Синтаксис
pgbench -i [параметр...] [dbname]
pgbench [параметр...] [dbname]
Описание
pgbench — это простая программа для запуска тестов производительности PostgreSQL. Она многократно выполняет одну последовательность команд, возможно в параллельных сеансах базы данных, а затем вычисляет среднюю скорость транзакций (число транзакций в секунду). По умолчанию pgbench тестирует сценарий, примерно соответствующий TPC-B, который состоит из пяти команд SELECT, UPDATE и INSERT в одной транзакции. Однако вы можете легко протестировать и другие сценарии, написав собственные скрипты транзакций.
Типичный вывод pgbench выглядит так:
transaction type: <builtin: TPC-B (sort of)> scaling factor: 10 query mode: simple number of clients: 10 number of threads: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 85.184871 (including connections establishing) tps = 85.296346 (excluding connections establishing)
В первых шести строках выводятся значения некоторых самых важных параметров. В следующей строке показывается количество выполненных и запланированных транзакций (это будет произведение числа клиентов и числа транзакций для одного клиента); эти количества будут равны, если только выполнение не завершится досрочно. (В режиме -T выводится только число фактически выполненных транзакций.) В последних двух строках показывается число транзакций в секунду, подсчитанное с учётом и без учёта времени установления подключения к серверу.
Для запускаемого по умолчанию теста типа TPC-B требуется предварительно подготовить определённые таблицы. Чтобы создать и наполнить эти таблицы, следует запустить pgbench с ключом -i (инициализировать). (Если вы применяете нестандартный скрипт, это не требуется, но тем не менее нужно подготовить конфигурацию, нужную вашему тесту.) Запуск инициализации выглядит так:
pgbench -i [другие-параметры]имя_базы
где имя_базы — имя уже существующей базы, в которой будет проводиться тест. (Чтобы указать, как подключиться к серверу баз данных, вы также можете добавить параметры -h, -p и/или -U.)
Внимание
pgbench -i создаёт четыре таблицы pgbench_accounts, pgbench_branches, pgbench_history и pgbench_tellers, предварительно уничтожая существующие таблицы с этими именами. Если вы вдруг используете эти имена в своей базе данных, обязательно переключитесь на другую базу!
С «коэффициентом масштаба», по умолчанию равным 1, эти таблицы изначально содержат такое количество строк:
table # of rows --------------------------------- pgbench_branches 1 pgbench_tellers 10 pgbench_accounts 100000 pgbench_history 0
Эти числа можно (и в большинстве случаев даже нужно) увеличить, воспользовавшись параметром -s (коэффициент масштаба). При этом также может быть полезен ключ -F (фактор заполнения).
Подготовив требуемую конфигурацию, можно запустить тест производительности командой без -i, то есть:
pgbench [параметры]имя_базы
Практически во всех случаях, чтобы получить полезные результаты, необходимо передать какие-либо дополнительные параметры. Наиболее важные параметры: -c (число клиентов), -t (число транзакций), -T (длительность) и -f (файл со скриптом). Полный список параметров приведён ниже.
Параметры
Следующий список разделён на три подраздела: одни параметры используются при инициализации базы данных, другие при проведении тестирования, а третьи в обоих случаях.
Параметры инициализации
pgbench принимает следующие аргументы командной строки для инициализации:
dbnameУказывает имя базы, в которой будет проводиться тест. Если имя не задано, то используется значение переменной окружения
PGDATABASE. Если и переменная не задана, то в качестве имени базы будет взято имя пользователя, под которым осуществляется подключение.-i--initializeТребуется для вызова режима инициализации.
-Iэтапы_инициализации--init-steps=этапы_инициализацииВыполнять только выбранные из всех обычных подготовительных этапов. В параметре
этапы_инициализацииотдельные символы для каждого этапа выбирают, какие этапы должны выполняться. Все этапы выполняются в определённом порядке. Список этапов по умолчанию:dtgvp. Полный перечень подготовительных этапов:d(Drop, удалить)Удалить все существующие таблицы pgbench.
t(create Tables, создать таблицы)Создать таблицы, используемые стандартным сценарием pgbench, а именно:
pgbench_accounts,pgbench_branches,pgbench_historyиpgbench_tellers.gилиG(Generate data, сгенерировать данные на стороне клиента или на стороне сервера)Сгенерировать данные и загрузить их в стандартные таблицы, заменив все уже существующие данные.
С ключом
g(выбирающим генерирование данных на стороне клиента), данные формируются в клиентском кодеpgbench, а затем передаются на сервер. При этом соединение клиент/сервер нагружается командойCOPY. Когда с ключомgгенерируются данные для таблицыpgbench_accounts, после каждых 100000 строк выдаётся сообщение о прогрессе.С ключом
G(выбирающим генерирование данных на стороне сервера), клиентский кодpgbenchпередаёт на сервер только небольшие запросы, а собственно формированием данных занимается сервер. В этом случае сетевое соединение не нагружается, но возрастает нагрузка на сервер. При генерировании данных с ключомGникакие сообщения о ходе операции не выдаются.По умолчанию при инициализации базы данные генерируются на стороне клиента (то есть подразумевается ключ
g).v(Vacuum, очистка)Вызывать
VACUUMдля стандартных таблиц.p(create Primary keys, создать первичные ключи)Создать первичные ключи в стандартных таблицах.
f(create Foreign keys, создать внешние ключи)Создать ограничения внешних ключей между стандартными таблицами. (Заметьте, что это действие по умолчанию не выполняется.)
-Fфактор_заполнения--fillfactor=фактор_заполненияСоздать таблицы
pgbench_accounts,pgbench_tellersиpgbench_branchesс заданным фактором заполнения. Значение по умолчанию — 100.-n--no-vacuumНе выполнять очистку во время инициализации. (Этот параметр выключает этап инициализации
v, даже если он был указан в-I.)-q--quietПереключить вывод в немногословный режим, когда выводится только одно сообщение о прогрессе в 5 секунд. В режиме по умолчанию одно сообщение выводится на каждые 100000 строк, при этом за секунду обычно выводится довольно много строк (особенно на хорошем оборудовании).
Этот параметр не оказывает влияния, если в
-Iвыбран вариантG.-sкоэффициент_масштаба--scale=коэффициент_масштабаУмножить число генерируемых строк на заданный коэффициент. Например, с ключом
-s 100в таблицуpgbench_accountsбудут записаны 10 000 000 строк. Значение по умолчанию — 1. При коэффициенте, равном 20 000 или больше, столбцы, содержащие идентификаторы счетов (столбцыaid), перейдут к большим целым числам (типуbigint), чтобы в них могли уместиться все возможные значения идентификаторов.--foreign-keysСоздать ограничения внешних ключей между стандартными таблицами. (Этот ключ добавляет этап
fк последовательности подготовительных этапов, если он отсутствует.)--index-tablespace=табл_пространство_индексовСоздать индексы в указанном табличном пространстве, а не в пространстве по умолчанию.
--partition-method=ИМЯСоздать секционированную таблицу
pgbench_accounts, применив методИМЯ(это может бытьrangeилиhash). Для использования этого параметра необходимо, чтобы было задано ненулевое значение--partitions. Если этот параметр не указывается, подразумевается методrange.--partitions=ЧИСЛОСоздать секционированную таблицу
pgbench_accountsс заданнымЧИСЛОМсекций примерно равного размера в соответствии с масштабированным количеством счетов. По умолчанию подразумевается число0, то есть таблица не секционируется.--tablespace=табличное_пространствоСоздать таблицы в указанном табличном пространстве, а не в пространстве по умолчанию.
--unlogged-tablesСоздать все таблицы как нежурналируемые, а не как постоянные таблицы.
Параметры тестирования производительности
pgbench принимает следующие аргументы командной строки для тестирования производительности:
-bимя_скрипта[@вес]--builtin=имя_скрипта[@вес]Добавляет в список скриптов, которые будут выполняться, указанный встроенный скрипт. В число встроенных скриптов входят
tpcb-like,simple-updateиselect-only. Также принимаются однозначные начала их имён. Со специальным именемlistпрограмма выводит список встроенных скриптов и немедленно завершается.Дополнительно можно задать целочисленный вес после
@, меняющий вероятность выбора этого скрипта относительно других. По умолчанию вес считается равным 1. Подробности следуют ниже.-cклиенты--client=клиентыЧисло имитируемых клиентов, то есть число одновременных сеансов базы данных. Значение по умолчанию — 1.
-C--connectУстанавливать новое подключение для каждой транзакции вместо одного для каждого клиента. Это полезно для оценивания издержек подключений.
-d--debugВыводить отладочные сообщения.
-Dимя_переменной=значение--define=имя_переменной=значениеОпределить переменную для пользовательского скрипта (см. ниже). Параметр
-Dможет добавляться неоднократно.-fимя_файла[@вес]--file=имя_файла[@вес]Добавить в список выполняемых скриптов скрипт транзакции из файла
имя_файла.Дополнительно можно задать целочисленный вес после
@, меняющий вероятность выбора этого скрипта относительно других. По умолчанию вес считается равным 1. (Если вам нужно передать имя скрипта, содержащее символ@, добавьте к такому имени вес, чтобы исключить неоднозначность прочтения, напримерfilen@me@1.) Подробности следуют ниже.-jпотоки--jobs=потокиЧисло рабочих потоков в pgbench. Использовать нескольких потоков может быть полезно на многопроцессорных компьютерах. Клиенты распределяются по доступным потокам равномерно, насколько это возможно. Значение по умолчанию — 1.
-l--logЗаписать информацию о каждой транзакции в файл протокола. Подробности описаны ниже.
-Lпредел--latency-limit=пределТранзакции, продолжающиеся дольше указанного
предела(в миллисекундах), подсчитываются и отмечаются отдельно, как опаздывающие.В режиме ограничения скорости (
--rate=...) транзакции, которые отстают от графика более чем на заданныйпредел(в мс) и поэтому никак не могут уложиться в отведённый интервал, не передаются серверу вовсе. Они подсчитываются и отмечаются отдельно как пропущенные.-Mрежим_запросов--protocol=режим_запросовПротокол, выбираемый для передачи запросов на сервер:
simple: использовать простой протокол запросов.extended: использовать расширенный протокол запросов.prepared: использовать расширенный протокол запросов с подготовленными операторами.
В режиме
preparedpgbench повторно использует результат разбора запроса, начиная со второй итерации, и поэтому работает быстрее, чем в других режимах.По умолчанию выбирается простой протокол запросов. (За подробностями обратитесь к Главе 52.)
-n--no-vacuumНе производить очистку таблиц перед запуском теста. Этот параметр необходим, если вы применяете собственный сценарий, не затрагивающий стандартные таблицы
pgbench_accounts,pgbench_branches,pgbench_historyиpgbench_tellers.-N--skip-some-updatesЗапустить встроенный упрощённый скрипт simple-update. Краткий вариант записи
-b simple-update.-Pсек--progress=секВыводить отчёт о прогрессе через заданное число секунд (
сек). Выдаваемый отчёт включает время, прошедшее с момента запуска, скорость (в TPS) с момента предыдущего отчёта, а также среднее время ожидания транзакций и стандартное отклонение. В режиме ограничения скорости (-R) время ожидания вычисляется относительно назначенного времени запуска транзакции, а не фактического времени её начала, так что оно включает и среднее время отставания от графика.-r--report-latenciesВыводить по завершении тестировании средняя время ожидания операторов (время выполнения с точки зрения клиента) для каждой команды. Подробности описаны ниже.
-Rскорость передачи--rate=скорость передачиВыполнять транзакции, ориентируясь на заданную скорость, а не максимально быстро (по умолчанию). Скорость задаётся в транзакциях в секунду. Если заданная скорость превышает максимально возможную, это ограничение скорости не повлияет на результаты.
Для получения нужной скорости транзакции запускаются со случайными задержками, имеющими распределение Пуассона. При этом запланированное время запуска отсчитывается от начального времени, а не от завершения предыдущей транзакции. Это означает, что если какие-то транзакции отстанут от изначально рассчитанного времени завершения, всё же возможно, что последующие нагонят график.
В режиме ограничения скорости время ожидания транзакций, выводимое по итогам тестирования, вычисляется, исходя из запланированного времени запуска, так что в него входит время, которое очередная транзакция должна была ждать завершения предыдущей транзакции. Это время называется временем отклонения от графика, и его среднее и максимальное значения выводятся отдельно. Время ожидания транзакций с момента их фактического запуска, то есть время, потраченное на выполнение транзакций в базе данных, можно получить, если вычесть время отклонения от графика из времени ожидания транзакций.
Если ограничение
--latency-limitзадаётся вместе с--rate, транзакция может заведомо не вписываться в отведённое ей время, если предыдущая транзакция завершится слишком поздно, так как ожидаемое время окончания транзакции отсчитывается от времени запуска по графику. Такие транзакции не передаются серверу, а пропускаются и подсчитываются отдельно.Большое значение отклонения от графика свидетельствует о том, что система не успевает выполнять транзакции с заданной скоростью и выбранным числом клиентов и потоков. Когда среднее время ожидания транзакции превышает запланированный интервал между транзакциями, каждая последующая транзакция будет отставать от графика, и чем дольше будет выполняться тестирование, тем больше будет отставание. Когда это наблюдается, нужно уменьшить скорость транзакций.
-sкоэффициент_масштаба--scale=коэффициент_масштабаПоказать заданный коэффициент масштаба в выводе pgbench. Для встроенных тестов это не требуется; корректный коэффициент масштаба будет получен в результате подсчёта строк в таблице
pgbench_branches. Однако при использовании только нестандартных тестов (запускаемых с ключом-f) без этого параметра в качестве коэффициента масштаба будет выводиться 1.-S--select-onlyЗапустить встроенный скрипт select-only (только выборка). Краткий вариант записи
-b select-only.-tтранзакции--transactions=транзакцииЧисло транзакций, которые будут выполняться каждым клиентом (по умолчанию 10).
-Tсекунды--time=секундыВыполнять тест с ограничением по времени (в секундах), а не по числу транзакций для каждого клиента. Параметры
-tи-Tявляются взаимоисключающими.-v--vacuum-allОчищать все четыре стандартные таблицы перед запуском теста. Без параметров
-nи-vpgbench будет очищать от старых записей таблицыpgbench_tellersиpgbench_branches, а также опустошатьpgbench_history.--aggregate-interval=секундыДлительность интервала агрегации (в секундах). Может использоваться только с ключом
-l. С данным параметром в протокол выводится сводка по интервалам, как описано ниже.--log-prefix=префиксЗадать префикс имён файлов для файлов протоколов, создаваемых с ключом
--log. Префикс по умолчанию —pgbench_log.--progress-timestampПри отображении прогресса (с параметром
-P) выводить текущее время (в формате Unix), а не количество секунд от начала запуска. Время задаётся в секундах с точностью до миллисекунд. Это помогает сравнивать журналы, записываемые разными средствами.--random-seed=затравкаУстановить затравку для генератора случайных чисел. Инициализирует генератор случайных чисел, который затем выдаёт последовательность начальных состояний отдельных генераторов для каждого потока.
затравкаможет принимать следующие значения:time(по умолчанию, затравка базируется на текущем времени),rand(задействовать надёжный генератор случайных чисел или выдать ошибку, если он отсутствует) или беззнаковое десятичное число. Генератор случайных чисел может вызываться явно из скрипта pgbench (функциямиrandom...) или неявно (например, для планирования выполнения транзакций с ключом--rate). В случае установки значения явным образом оно выводится в терминале. Любое значение, допустимое в качествезатравки, можно также задать в переменной окруженияPGBENCH_RANDOM_SEED. Чтобы заданная затравка применялась во всех возможных случаях использования, задайте этот параметр первым или установите переменную окружения.Явное указание определённой затравки позволяет точно воспроизвести выполнение
pgbenchв части использования случайных чисел. Так как случайное состояние поддерживается внутри потока, это означает, что выполнениеpgbenchпри одинаковых запусках повторится в точности, если один поток используется одним клиентом и отсутствуют внешние зависимости или зависимости от данных. Со статистической точки зрения точное воспроизведение выполнения нежелательно, так как это может скрыть вариативность производительности или показать завышенную скорость, например из-за попадания в одни и те же страницы данных. Однако это может быть очень полезно для отладки, например, для повторения редкого сценария, приводящего к ошибке. Используйте данную возможность обдуманно.--sampling-rate=скорость передачиЧастота выборки для записи данных в протокол, изменяя которую можно уменьшить объём протокола. При указании этого параметра в протокол выводится информация только о заданном проценте транзакций. Со значением 1.0 в нём будут отмечаться все транзакции, а с 0.05 только 5%.
Обрабатывая протокол, не забудьте учесть частоту выборки. Например, вычисляя скорость (TPS), вам нужно будет соответственно умножить содержащиеся в нём числа (например, с частотой выборки 0.01 вы получите только 1/100 фактической скорости).
--show-script=имя_скриптаВывести код встроенного скрипта
имя_скриптав stderr и сразу завершиться.
Общие параметры
Программа pgbench также принимает общие аргументы командой строки, определяющие параметры подключения:
-hкомпьютер--host=компьютерАдрес сервера баз данных
-pпорт--port=портНомер порта сервера баз данных
-Uимя_пользователя--username=имя_пользователяИмя пользователя для подключения
-V--versionВывести версию pgbench и завершиться.
-?--helpВывести справку об аргументах командной строки pgbench и завершиться.
Код завершения
В случае успешного выполнения возвращается код 0. Код завершения 1 указывает на статичные проблемы, например, ошибки в параметрах командной строки. При возникновении ошибок во время выполнения, например при обращении к базе данных или выполнении скрипта, выдаётся код завершения 2. В последнем случае pgbench выведет частичные результаты.
Переменные окружения
PGDATABASEPGHOSTPGPORTPGUSERПараметры подключения по умолчанию.
Как и большинство других утилит PostgreSQL, приложение также использует переменные окружения, поддерживаемые libpq (см. Раздел 33.14).
Переменная окружения PG_COLOR выбирает вариант использования цвета в диагностических сообщениях. Возможные значения: always (всегда), auto (автоматически) и never (никогда).
Примечания
Каково содержание «транзакции», которую выполняет pgbench?
Программа pgbench выполняет тестовые скрипты, выбирая их случайным образом из заданного списка. Это могут быть как встроенные скрипты, задаваемые аргументами -b, так и пользовательские, задаваемые аргументами -f. Для каждого скрипта можно задать относительный вес после @, чтобы скорректировать вероятность его выбора. По умолчанию вес считается равным 1. Скрипты с весом 0 игнорируются.
Стандартный встроенный скрипт (также вызываемый с ключом -b tpcb-like) выдаёт семь команд в транзакции со случайно выбранными aid, tid, bid и delta. Его сценарий написан по мотивам теста производительности TPC-B, но это не собственно TPC-B, потому он называется так.
BEGIN;UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;SELECT abalance FROM pgbench_accounts WHERE aid = :aid;UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);END;
При выборе встроенного скрипта simple-update (или указании -N) шаги 4 и 5 исключаются из транзакции. Это позволяет избежать конкуренции при обращении к этим таблицам, но тест становится ещё менее похожим на TPC-B.
При выборе встроенного теста select-only (или указании -S) выполняется только SELECT.
Пользовательские скрипты
Программа pgbench поддерживает запуск пользовательских сценариев оценки производительности, позволяя заменять стандартный скрипт транзакции (описанный выше) скриптом, считываемым из файла (с параметром -f). В этом случае «транзакцией