Мониторинг производительности
-
Включите сбор данных по нагрузке на подсистему ввода-вывода.
postgres@monman_db=# ALTER SYSTEM SET track_io_timing TO on;ALTER SYSTEMПерезагрузите конфигурацию.
postgres@monman_db=# SELECT pg_reload_conf();pg_reload_conf----------------t(1 row)Параметр
track_io_timingвключен — теперь планировщик собирает статистику времени операций ввода-вывода. -
Подготовьте таблицы для проведения нагрузочного тестирования утилитой
pgbench.postgres@monman_db=# \! pgbench -i monman_dbРазбор команды
\!— метакоманда psql, которая передает следующую команду оболочке ОС;pgbench -i monman_db— инициализация базы данныхmonman_dbтаблицамиpgbench: создание таблиц и заполнение тестовыми данными.
dropping old tables...NOTICE: table "pgbench_accounts" does not exist, skippingNOTICE: table "pgbench_branches" does not exist, skippingNOTICE: table "pgbench_history" does not exist, skippingNOTICE: table "pgbench_tellers" does not exist, skippingcreating tables...generating data (client-side)...100000 of 100000 tuples (100%) done (elapsed 0.18 s, remaining 0.00 s)vacuuming...creating primary keys...done in 0.38 s (drop tables 0.01 s, create tables 0.02 s, client-side generate 0.25 s, vacuum 0.03 s, primary keys 0.07 s).Проверьте созданные таблицы.
postgres@monman_db=# \dList of relationsSchema | Name | Type | Owner--------+------------------+----------+----------public | fatab | table | postgrespublic | fatab_id_seq | sequence | postgrespublic | pgbench_accounts | table | postgrespublic | pgbench_branches | table | postgrespublic | pgbench_history | table | postgrespublic | pgbench_tellers | table | postgres(6 rows)В схеме
publicпоявились таблицыpgbench_accounts,pgbench_branches,pgbench_historyиpgbench_tellers— готовые к нагрузочному тестированию. -
Сбросьте накопленную кумулятивную статистику.
postgres@monman_db=# SELECT pg_stat_reset();pg_stat_reset---------------(1 row)postgres@monman_db=# SELECT pg_stat_reset_shared('bgwriter');pg_stat_reset_shared----------------------(1 row)Сброс статистики позволяет собрать чистые метрики без влияния предыдущих операций.
-
Запустите нагрузочное тестирование на 30 секунд.
postgres@monman_db=# \! pgbench -T30 monman_dbРазбор команды
\!— метакоманда psql для выполнения команды оболочки ОС;pgbench -T30 monman_db— запуск нагрузочного тестирования базыmonman_dbна длительность 30 секунд.
pgbench (15.5)starting vacuum...end.transaction type: <builtin: TPC-B (sort of)> scaling factor: 1query mode: simplenumber of clients: 1number of threads: 1maximum number of tries: 1duration: 30 snumber of transactions actually processed: 9985number of failed transactions: 0 (0.000%)latency average = 3.003 msinitial connection time = 21.177 mstps = 333.035253 (without initial connection time)За 30 секунд было выполнено 9985 транзакций без ошибок — средняя производительность составила 333 TPS при задержке 3 мс на транзакцию.
-
Получите собранную статистику по строкам таблицы
pgbench_tellers.postgres@monman_db=# SELECT * FROM pg_stat_all_tables WHERE relid = 'pgbench_tellers'::regclass \gxРазбор команды
SELECT * FROM pg_stat_all_tables— выборка всех полей из представления статистики таблиц;WHERE relid = 'pgbench_tellers'::regclass— фильтрация по OID таблицы; приведение::regclassпреобразует текстовое имя в OID;\gx— метакоманда psql, выводящая результат в расширенном виде (одно поле на строку).
-[ RECORD 1 ]-----------+------------------------------relid | 16485schemaname | publicrelname | pgbench_tellersseq_scan | 9985seq_tup_read | 99850idx_scan | 0idx_tup_fetch | 0n_tup_ins | 0n_tup_upd | 9985n_tup_del | 0n_tup_hot_upd | 9985n_live_tup | 10n_dead_tup | 0n_mod_since_analyze | 0n_ins_since_vacuum | 0last_vacuum | 2024-11-11 09:05:49.584207+03last_autovacuum | 2024-11-11 09:07:02.217142+03last_analyzelast_autoanalyze | 2024-11-11 09:07:02.217678+03vacuum_count | 1autovacuum_count | 2analyze_count | 0autoanalyze_count | 2За время тестирования над таблицей было выполнено 9985 последовательных сканирований (
seq_scan) и 9985 обновлений строк (n_tup_upd). Все 9985 обновлений были HOT-обновлениями (n_tup_hot_upd), что означает обновление на месте без создания новых версий для индексов. Количество мертвых строк (n_dead_tup) равно 0 — автоочистка успешно обработала таблицу. -
Получите статистику по вводу-выводу для этой же таблицы.
postgres@monman_db=# SELECT * FROM pg_statio_all_tables WHERE relid = 'pgbench_tellers'::regclass \gxРазбор команды
SELECT * FROM pg_statio_all_tables— выборка статистики ввода-вывода для всех таблиц;WHERE relid = 'pgbench_tellers'::regclass— фильтрация по OID таблицы;\gx— вывод в расширенном формате.
-[ RECORD 1 ]-----+----------------relid | 16445schemaname | publicrelname | pgbench_tellersheap_blks_read | 0heap_blks_hit | 29981idx_blks_read | 1idx_blks_hit | 3toast_blks_read |toast_blks_hit |tidx_blks_read |tidx_blks_hit |Страницы с данными таблицы (
heap_blks_read = 0) не считывались с диска — все 29981 обращение были удовлетворены из кеша (heap_blks_hit). Это означает, что данные таблицы полностью помещались в буферный кеш. -
Получите статистику по всей БД.
postgres@monman_db=# SELECT * FROM pg_stat_database WHERE datname = 'monman_db' \gx-[ RECORD 1 ]-----------------+------------------------------datid | 16441datname | monman_dbnumbackends | 1xact_commit | 10091xact_rollback | 2blks_read | 373blks_hit | 165602tup_returned | 160090tup_fetched | 22585tup_inserted | 9991tup_updated | 29976tup_deleted | 0conflicts | 0temp_files | 0temp_bytes | 0deadlocks | 0checksum_failures | 0checksum_last_failure |blk_read_time | 6.067blk_write_time | 0session_time | 1178339.251active_time | 22034.291idle_in_transaction_time | 4911.254sessions | 2sessions_abandoned | 0sessions_fatal | 0sessions_killed | 0stats_reset | 2024-11-11 08:58:34.874476+03За сессию было зафиксировано 10091 транзакция (
xact_commit) и 2 отката (xact_rollback). Соотношение попаданий в кеш (blks_hit = 165602) к чтениям с диска (blks_read = 373) высокое — кэш эффективно обслуживал запросы. -
Измените все строки таблицы
fatabи снова получите из кумулятивной статистики количество измененных строк в БД.Выполните массовое обновление.
postgres@monman_db=# UPDATE fatab SET nme = 0;UPDATE 100000Проверьте актуальное значение счетчика обновленных строк.
postgres@monman_db=# SELECT tup_updated FROM pg_stat_database WHERE datname = 'monman_db';tup_updated-------------129979(1 row)Новое значение счетчика
tup_updatedравно 129979. Прежнее значение было 29979 — разница ровно 100000, что соответствует количеству измененных строк в таблицеfatab.
Самопроверка
Вопрос 1
Что означает значение heap_blks_read = 0?
Вопрос 2
В сеансе psql выполнены команды:
postgres@monman_db=# SELECT tup_updated FROM pg_stat_database WHERE datname = 'monman_db';
tup_updated
-------------
29979
(1 row)
postgres@monman_db=# UPDATE fatab SET nme = 0;
UPDATE 100000
postgres@monman_db=# SELECT tup_updated FROM pg_stat_database WHERE datname = 'monman_db';
tup_updated
-------------
129979
(1 row)
Почему значение tup_updated увеличилось ровно на 100000?
Вопрос 3
Какие представления относятся к кумулятивной статистике?