Поделиться через


Устранение неполадок с высоким уровнем использования операций ввода-вывода в секунду для База данных Azure для PostgreSQL — гибкий сервер

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для PostgreSQL — гибкий сервер

В этой статье показано, как быстро определить первопричину использования операций ввода-вывода (входных и выходных операций в секунду) и обеспечить исправление действий для управления использованием операций ввода-вывода при использовании гибкого сервера База данных Azure для PostgreSQL.

Вы узнаете, как выполнять следующие задачи:

  • Сведения об устранении неполадок для выявления и получения рекомендаций по устранению основных причин.
  • Используйте средства для определения высокого уровня использования входных и выходных данных (операций ввода-вывода), таких как метрики Azure, хранилище запросов и pg_stat_statements.
  • Определите первопричины, такие как длительные запросы, время контрольных точек, разрушительный процесс управляющей программы автовакума и высокий уровень использования хранилища.
  • Разрешение высокого уровня использования операций ввода-вывода с помощью средства анализа, настройки параметров сервера, связанных с контрольными точками, и настройки управляющей программы автовакума.

Руководства по устранению неполадок

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

Средства для выявления высокого уровня использования операций ввода-вывода

Рассмотрим следующие средства, чтобы определить высокий уровень использования операций ввода-вывода.

Метрики Azure

Метрики Azure — это хорошая отправная точка для проверки использования операций ввода-вывода для определенной даты и периода. Метрики предоставляют сведения о времени, в течение которого загрузка ввода-вывода высока. Сравните графики операций ввода-вывода в секунду, операций ввода-вывода чтения, пропускной способности чтения и пропускной способности записи, чтобы узнать время, когда рабочая нагрузка вызывает высокую загрузку операций ввода-вывода. Для упреждающего мониторинга настройте оповещения для метрик. Пошаговые инструкции см. в статье Метрики Azure.

Хранилище запросов

Функция хранилище запросов автоматически фиксирует журнал запросов и статистики среды выполнения и сохраняет их для проверки. Он срезает данные по времени, чтобы увидеть временные шаблоны использования. Данные для всех пользователей, баз данных и запросов хранятся в базе данных с именем azure_sys в гибком экземпляре сервера База данных Azure для PostgreSQL. Пошаговые инструкции см. в статье "Мониторинг производительности с помощью хранилище запросов".

Используйте следующую инструкцию для просмотра пяти первых инструкций SQL, использующих ввод-вывод:

select * from query_store.qs_view qv where is_system_query is FALSE
order by blk_read_time + blk_write_time  desc limit 5;

Расширение pg_stat_statements

Расширение pg_stat_statements помогает определить запросы, использующие ввод-вывод на сервере.

Используйте следующую инструкцию для просмотра пяти первых инструкций SQL, использующих ввод-вывод:

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY blk_read_time + blk_write_time desc
LIMIT 5;

Примечание.

При использовании хранилища запросов или pg_stat_statements для заполнения столбцов blk_read_time и blk_write_time необходимо включить параметр track_io_timingсервера. Дополнительные сведения о track_io_timingпараметрах сервера см. в разделе "Параметры сервера".

Определение первопричин

Если уровни потребления операций ввода-вывода в целом высоки, это могут быть первопричины:

Продолжительные транзакции

Длительные транзакции могут использовать операции ввода-вывода, что может привести к высокой загрузке операций ввода-вывода.

Следующий запрос помогает определить подключения, которые выполняются в течение длительного времени:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Время контрольной точки

Высокий уровень ввода-вывода также можно увидеть в сценариях, когда контрольная точка происходит слишком часто. Один из способов определить это заключается в проверке файла журнала гибкого сервера База данных Azure для PostgreSQL для следующего текста журнала: "LOG: контрольные точки происходят слишком часто".

Вы также можете исследовать с помощью подхода, в котором сохраняются периодические моментальные снимки pg_stat_bgwriter с меткой времени. Используя сохраненные моментальные снимки, можно вычислить средний интервал контрольной точки, количество запрошенных контрольных точек и количество контрольных точек.

Нарушение процесса управляющей программы автовакума

Выполните следующий запрос, чтобы отслеживать автовакум:

SELECT schemaname, relname, n_dead_tup, n_live_tup, autovacuum_count, last_vacuum, last_autovacuum, last_autoanalyze, autovacuum_count, autoanalyze_count FROM pg_stat_all_tables WHERE n_live_tup > 0;

Запрос используется для проверки частоты очистки таблиц в базе данных.

  • last_autovacuum: дата и время последнего автовакума, запущенного в таблице.
  • autovacuum_count: количество раз, когда таблица была вакуумирована.
  • autoanalyze_count: количество раз, когда таблица была проанализирована.

Устранение проблем с высоким уровнем использования операций ввода-вывода

Чтобы устранить высокий уровень использования операций ввода-вывода, можно использовать любой из следующих трех методов.

Команда EXPLAIN ANALYZE

После идентификации запроса, который потребляет высокий уровень ввода-вывода, используйте EXPLAIN ANALYZE для дальнейшего изучения запроса и его настройки. Дополнительные сведения о команде EXPLAIN ANALYZE см. в плане EXPLAIN.

Завершение длительных транзакций

Вы можете рассмотреть возможность убийства длительной транзакции в качестве варианта.

Чтобы завершить идентификатор процесса сеанса (PID), необходимо определить идентификатор PID с помощью следующего запроса:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Вы также можете фильтровать по другим свойствам, таким как usename (имя пользователя) или datname (имя базы данных).

После того как у вас есть piD сеанса, его можно завершить с помощью следующего запроса:

SELECT pg_terminate_backend(pid);

Настройка параметров сервера

Если вы видите, что контрольная точка происходит слишком часто, увеличьте max_wal_size параметр сервера до тех пор, пока большинство контрольных точек не будут вызваны временем, а не запрашиваются. В конечном итоге 90 процентов или более должны быть основаны на времени, и интервал между двумя контрольными точками должен быть близок к checkpoint_timeout значению, заданному на сервере.

  • max_wal_size: пиковые рабочие часы являются хорошим временем, чтобы прибыть в max_wal_size значение. Чтобы прибыть к значению, сделайте следующее:

    1. Выполните следующий запрос, чтобы получить текущий WAL LSN, а затем запишите результат:

      select pg_current_wal_lsn();
      
    2. Подождите checkpoint_timeout несколько секунд. Выполните следующий запрос, чтобы получить текущий WAL LSN, а затем запишите результат:

      select pg_current_wal_lsn();
      
    3. Выполните следующий запрос, который использует два результата, чтобы проверить разницу в гигабайтах (ГБ):

      select round (pg_wal_lsn_diff ('LSN value when run second time', 'LSN value when run first time')/1024/1024/1024,2) WAL_CHANGE_GB;
      
  • checkpoint_completion_target: рекомендуется задать значение 0,9. Например, значение 0,9 в течение checkpoint_timeout 5 минут указывает, что целевой объект для завершения контрольной точки составляет 270 секунд (0,9*300 секунд). Значение 0,9 обеспечивает достаточно согласованную нагрузку ввода-вывода. Агрессивное значение checkpoint_completion_target может привести к увеличению нагрузки ввода-вывода на сервер.

  • checkpoint_timeout: можно увеличить checkpoint_timeout значение из значения по умолчанию, заданного на сервере. При увеличении значения следует учитывать, что увеличение также увеличит время аварийного восстановления.

Настройка autovacuum для уменьшения сбоев

Дополнительные сведения о мониторинге и настройке в сценариях, когда автовакум слишком разрушительный, просмотрите настройку autovacuum.

Увеличьте размер хранилища

Увеличение хранилища помогает при добавлении дополнительных операций ввода-вывода в секунду на сервер. Дополнительные сведения о хранилище и связанных операций ввода-вывода в секунду см . в параметрах вычислений и хранилища.