Наша база данных 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
Есть предложения, что мы могли бы настроить, чтобы уменьшить влияние будущих автоочисток на наш сервис? Или мы что-то не так делаем?