Автоочистка PostgreSQL приводит к значительному снижению производительности

Наша база данных Postgres (размещенная в Google Cloud SQL с 1 процессором, 3,7 ГБ ОЗУ, см. Ниже) состоит в основном из одной большой таблицы размером ~ 90 ГБ с примерно 60 миллионами строк. Шаблон использования состоит почти исключительно из добавлений и нескольких индексированных операций чтения в конце таблицы. Время от времени удаляются несколько пользователей, удаляя небольшой процент строк, разбросанных по таблице.

Все это работает нормально, но каждые несколько месяцев в этой таблице запускается автоочистка, что существенно влияет на производительность нашего сервиса в течение ~ 8 часов:

  • Использование хранилища увеличивается на ~ 1 ГБ на время автоочистки (несколько часов), затем медленно возвращается к предыдущему значению (может в конечном итоге упасть ниже этого значения из-за страниц, освобождающих автоочистку)
  • Загрузка ЦП базы данных подскакивает с 10% до ~ 20%.
  • Число операций чтения / записи на диск увеличивается с почти нуля до ~ 50 в секунду.
  • Память базы данных немного увеличивается, но остается ниже 2 ГБ
  • Байты транзакций в секунду и входящие / исходящие байты также практически не изменяются, как и следовало ожидать.

Это приводит к увеличению 95-го процентиля задержки нашего сервиса с ~ 100 мс до ~ 0,5-1 с во время автоочистки, что, в свою очередь, запускает наш мониторинг. Служба обслуживает около десяти запросов в секунду, причем каждый запрос состоит из нескольких простых операций чтения / записи БД, которые обычно имеют задержку в 2-3 мс каждый.

Вот несколько снимков экрана мониторинга, иллюстрирующих проблему:

Использование ЦП  Использование хранилища Использование памяти  Операции чтения / записи  Задержка

Конфигурация БД довольно ванильная:

Конфигурация БД

Запись в журнале, документирующая этот процесс автоочистки, гласит:

system usage: CPU 470.10s/358.74u sec elapsed 38004.58 sec
avg read rate: 2.491 MB/s, avg write rate: 2.247 MB/s
buffer usage: 8480213 hits, 12117505 misses, 10930449 dirtied
tuples: 5959839 removed, 57732135 remain, 4574 are dead but not yet removable
pages: 0 removed, 6482261 remain, 0 skipped due to pins, 0 skipped frozen
automatic vacuum of table "XXX": index scans: 1

Есть предложения, что мы могли бы настроить, чтобы уменьшить влияние будущих автоочисток на наш сервис? Или мы что-то не так делаем?


person MrMage    schedule 22.02.2019    source источник


Ответы (1)


Если вы можете увеличить autovacuum_vacuum_cost_delay, ваш автоочистка будет работать медленнее и будет менее агрессивной.

Однако, как правило, лучший способ ускорить работу - установить autovacuum_vacuum_cost_limit равным 2000 или около того. Потом быстрее заканчивается.

Вы также можете попробовать запланировать VACUUM стола самостоятельно в те моменты, когда это наименее больно.

Но, честно говоря, если одного безобидного автопылесоса достаточно, чтобы помешать вашей работе, вам понадобится большая пропускная способность ввода-вывода.

person Laurenz Albe    schedule 22.02.2019
comment
Спасибо, увеличение autovacuum_vacuum_cost_delay и уменьшение autovacuum_vacuum_cost_limit помогло улучшить производительность службы, но, конечно, autovacuum занимает больше времени (но это нормально). Я подозреваю, что ограничение Google ~ 3 тыс. Операций ввода-вывода в секунду и ограничение пропускной способности 50 МБ / с (см. cloud.google .com / compute / docs / disks / performance) для постоянного диска 100 ГБ здесь виноваты. - person MrMage; 25.02.2019
comment
Еще больше откладывать автовакуум - опасный путь. Вы были предупреждены! Я бы выложил деньги за большую пропускную способность хранилища. - person Laurenz Albe; 25.02.2019
comment
Я фактически увеличил частоту автовакуумов (уменьшил масштабный коэффициент с 0,2 до 0,01), уменьшив их скорость. Таким образом, у каждого отдельного автовакуума должно быть меньше работы. - person MrMage; 25.02.2019
comment
Это заставит автоочистку работать постоянно. Вам следует следить за тем, выполняется ли это, и не увеличивается ли вздутие живота. - person Laurenz Albe; 25.02.2019
comment
Как можно запланировать ВАКУУМ на GCP @LaurenzAlbe? - person Tobias; 16.12.2019
comment
Без понятия. Обычно вы позволяете автоочистке делать работу - она ​​автоматически планирует операции. - person Laurenz Albe; 16.12.2019