Рекомендации по поиску проблем и тонкой настройке PostgreSQL
pg_stat_database
datname
- имя базы данных или NULL для общих объектов,numbackends
- количество подключений к базе данных или NULL для общих объектов (текущее значение),xact_commit
- количество зафиксированных транзакций (нарастающим итогом),xact_rollback
- количество отменённых транзакций (нарастающим итогом),blks_read
- количество блоков, прочитанных с диска (нарастающим итогом),blks_hit
- количество блоков, найденных в кэше (нарастающим итогом),tup_returned
- количество строк, возвращённых запросом (нарастающим итогом),tup_fetched
- количество строк, переданных по сети (нарастающим итогом),tup_inserted
- количество вставленных строк (нарастающим итогом),tup_updated
- количество обновлённых строк (нарастающим итогом),tup_deleted
- количество удалённых строк (нарастающим итогом),conflicts
- количество запросов, отменённых из-за конфликта при восстановлении базы данных (нарастающим итогом, только для запасных серверов),temp_files
- количество созданных временных файлов (нарастающим итогом),temp_bytes
- объём данных, записанных во временные файлы (нарастающим итогом),deadlocks
- количество взаимоблокировок (нарастающим итогом),blk_read_time
- время, потраченное на чтение блоков данных (нарастающим итогом, если включена опцияtrack_io_timing
или 0),blk_write_time
- время, потраченное на запись блоков данных (нарастающим итогом, если включена опцияtrack_io_timing
или 0),stats_reset
- отметка времени последнего сброса статистики.
blks_hit, blks_read
При соотношении данных, прочитанных из кэша к общему объёму прочитанных данных blks_hit / (blks_hit + blks_read)
ниже 0.8 стоит увеличить размер shared_buffers
в файле конфигурации postgresql.conf
.
xact_commit, xact_rollback
При низком соотношений подтверждённых транзакций к их общему количеству xact_commit / (xact_rollback + xact_commit)
стоит проанализировать отменённые транзакции в журнале PostgreSQL.
deadlocks
Если взаимоблокировки происходят часто, то имеются ошибки в проектировании приложения. Для поиска проблем можно включить опцию в log_lock_waits
в файле конфигурации postgresql.conf
.
temp_files, temp_bytes
При частом создании временных файлов и/или большом их размере стоит включить опцию log_temp_files
для обнаружения запросов, приведших к созданию временных файлов. Можно также увеличить размер work_mem
в файле конфигурации postgresql.conf
.
pg_stat_all_tables, pg_stat_user_tables и g_stat_sys_tables
relname
- имя таблицы,seq_scan
- количество последовательных сканирований таблицы,seq_tup_read
- количество строк, прочитанных при последовательном сканировании,idx_scan
- количество сканированией таблицы с использованием индекса,idx_tup_fetch
- количество строк, прочитанных при сканировании с использованием индекса,n_tup_ins
- количество вставленных строк,n_tup_upd
- количество обновлённых строк, включая обновлённые на месте,n_tup_del
- количество удалённых строк,n_tup_hot_upd
- количество строк, обновлённых на месте,n_live_tup
- расчётное количество живых строк,n_dead_tup
- расчётное количество мёртвых строк,n_mod_since_analyze
- расчётное количество изменённых строк после операции анализа таблицы,n_ins_since_vacuum
- расчётное количество вставленных строк после операции сжатия таблицы,last_vacuum
- отметка времени последней операции ручного сжатия, исключая полный,last_autovacuum
- отметка времени последней операции автоматического сжатия,last_analyze
- отметка времени последней операции ручного сжатия,last_autoanalyze
- отметка времени последней операции автоматического сжатия,vacuum_count
- количество ручных операций сжатия, исключая полный,autovacuum_count
- количество автоматических операций сжатия,analyze_count
- количество ручных операций анализа,autoanalyze_count
- количество автоматических операций анализа.
n_tup_upd, n_tup_hot_upd
При обновлении строк PostgreSQL создаёт копию строки с новыми данными, а прежнюю строку помечает как устаревшую. Устаревшие версии строк могут использоваться внутри ещё не зафиксированных транзакций с уровнем REPEATABLE READ
. Когда устаревшая строка более не используется ни в одной транзакции, занимаемое ей место можно отметить как свободное и записать на это место новую строку. Для экономии места на диске PostgreSQL периодически выполняет процедуру автоматического сжатия таблицы (так называемый VACUUM), собирая данные из нескольких разрежённых страниц в одну и уменьшая размер файлов на диске за счёт освободившихся страниц.
Если копия строки с новыми данными создаётся в другой странице, то нужно обновить индекс так, чтобы он указывал на новую страницу. Если копия строки была создана в пределах той же страницы и значения в столбцах, по которым поддерживаются индексвы, не менялись, то обновлять индекс не обязательно.
Если соотношение строк, обновлённых в пределах страницы, к обновлённым строкам n_tup_hot_upd / n_tup_upd
низкое, то стоит уменьшить процент заполнения страниц таблицы при помощи запросов следующиего вида:
ALTER TABLE mytable SET (fillfactor = 70);
Это запрос повлияет только на заполнение новых страниц таблицы. Чтобы во всех страницах таблицы появилось свободное место, которое позволило бы чаще обновлять данные внутри страницы, можно воспользоваться запросом:
VACUUM FULL mytable;