Налаштування PostgreSQL VACUUM і Autovacuum для оптимізації

Коли таблиці розростаються, запити сповільнюються і сервіс починає «підгальмовувати». Ми налаштовуємо автоочищення та режими очищення під профіль вашого навантаження — під ключ: від інвентаризації баз до регламенту обслуговування. На виході роздуття скорочується в рази, а обслуговування перестає вимагати ручного втручання.
Часті запитання

Чому налаштування autovacuum у PostgreSQL не встигає за навантаженням

Першим симптомом майже ніколи не буває відмова — спочатку зростає час відгуку на піках.

Таблиці розростаються швидше, ніж їх встигає обробити фонове очищення: мертві версії рядків залишаються в сторінках, місце під них не повертається в обіг, і кожен запит читає помітно більше сторінок, ніж у них корисних даних.

Окремо тривожно, що зовні це виглядає як штатна робота — індекси використовуються, плани запитів не змінюються, а деградація накопичується місяцями.

Заводські пороги розраховані на інший профіль навантаження. Поріг у п'яту частину від розміру таблиці для великої таблиці означає, що очищення увімкнеться після десятків мільйонів змінених рядків — а на цей момент змін набігає ще стільки ж.

Обмеження кількості паралельних воркерів призводить до того, що один важкий прохід тримає чергу і решта таблиць чекають; затримки між проходами за замовчуванням занадто великі для бази з постійним записом.

У підсумку фонове очищення не встигає не через помилку налаштування, а через те, що параметри ніхто не перераховував під реальний потік змін.

Далі підключається зворотний зв'язок: чим сильніше роздування таблиць, тим довше триває очищення, тим рідше воно завершується і тим швидше зростає база.

Планове обслуговування перетворюється на аварійне — ручний запуск очищення в робочі години, блокування, деградація на час проходу, ризик упертися у вільне місце на диску.

Розбираємо, як це закривається: як рахувати пороги під фактичний профіль запису і як повернути обслуговуванню регулярність.

Що дає кероване очищення таблиць: ефект у цифрах

Роздування та обсяг зберігання

Поріг спрацьовування за замовчуванням прив'язаний до частки таблиці, тому на великій таблиці autovacuum чекає, поки наберуться мільйони мертвих рядків, — і файли зростають швидше, ніж очищення встигає їх повертати.

Ми опускаємо поріг до прийнятної кількості рядків, додаємо запас вільного місця на сторінках під майбутні версії рядків і задаємо окремі правила для «гарячих» таблиць замість одного глобального.

За системними лічильниками видно, що частка мертвих рядків скорочується в рази, а розмір відношення перестає зростати між циклами очищення.

Відгук і стійкість

Звичайна картина під навантаженням — довге очищення витягує дисковий ввід-вивід і тримає блокування саме тоді, коли надходять пікові запити: час відповіді зростає стрибками, а черга запитів накопичується.

Ми обмежуємо інтенсивність очищення, розподіляємо його по воркерах і виводимо важкі прогони у вікна низького навантаження, залишаючи автозапуск увімкненим для решти таблиць.

У результаті пікові запити перестають упиратися в очищення, відгук залишається передбачуваним, а ручні аварійні прогони за розкладом зникають як клас відмов.

Режими VACUUM: порівняння підходів і оптимізація розкладу

Мертві рядки накопичуються за будь-якого режиму — різниця в тому, хто і коли запускає очищення. Нижче чотири робочі альтернативи та умови, за яких кожна з них доречна.

Варіант Коли підходить Обмеження
Порогове автоочищення Рівний потік змін, таблиці передбачуваного розміру Поріг за часткою від розміру спрацьовує пізно: між проходами накопичуються мертві рядки
Ручне очищення за вікном Пакетні завантаження, нічні розрахунки, масові оновлення Потрібен зовнішній планувальник; потрапляння вікна в пік трафіку дає зростання затримок
Очищення за секціями Партиціоновані журнали та події з відсіканням старих секцій Прохід по батьківській таблиці секції не очищає — обслуговувати потрібно кожну
Відкладена заморозка Таблиці з рідкими оновленнями та старими версіями рядків Запуск не прив'язаний до вікна обслуговування, прохід іде по всій таблиці

Як вибрати режим під профіль навантаження

Дивіться на частку мертвих рядків до живих, швидкість зростання лічильника транзакцій і наявність вікна із просіданням трафіку.

Глобальні пороги задають поведінку за замовчуванням, але для гарячих таблиць їх перевизначають на рівні самої таблиці — велика таблиця перестає чекати загальної черги автоочищення і не накопичує мертві рядки між рідкими проходами.

Обмеження: блокування, реплікація, відставання копій

Очищення не блокує читання та запис, але конфліктує зі зміною структури таблиці та індексів. Паралельно воно пише в журнал попереднього запису: на репліках зростає потік змін, і копія може відставати на важких проходах.

Темп обмежують затримками вартості, а повні проходи та відкладену заморозку виносять у вікно низького навантаження, щоб обслуговування не збіглося зі звітами чи вивантаженнями.

Порядок робіт: від інвентаризації баз до регламенту обслуговування

Роботу будуємо від факту, а не від типового набору параметрів: спочатку знімаємо стан бази, потім змінюємо конфігурацію. Шість етапів нижче дають перевірюваний артефакт на кожному кроці, тому рішення про включення в робочий контур ухвалюється до правок, а не після.

Підготовка та безпечний пілот

  1. Знімаємо статистику очищення: скільки мертвих рядків накопичилося по таблицях, як часто проходить автоочищення, де лічильник мертвих рядків зростає найшвидше.
  2. Збираємо профіль навантаження і зростання таблиць: пікові години запису й оновлення, добовий і тижневий приріст, довгі транзакції, які утримують знімок і заважають очищенню.
  3. Проєктуємо пороги та вікна: окремі коефіцієнти для великих і активних таблиць, розклад примусового очищення в міжпікові інтервали, ліміт навантаження на дискову підсистему.
  4. Відпрацьовуємо схему на копії: розгортаємо копію бази, відтворюємо реальне навантаження, дивимося поведінку очищення під конкурентним записом і заміряємо тривалість блокувань.

Як перевіряємо результат

  • Проводимо контрольні заміри до і після: частка мертвих рядків, час важких запитів, розмір файлів, частота аварійного очищення.
  • Передаємо регламент: карта таблиць із порогами, правила перегляду при зростанні даних, набір запитів для самоперевірки та порядок дій при аномаліях.

Конфігурації, схеми вікон і регламенти обслуговування на виході

Ми передаємо не набір разових команд, а робочу конфігурацію: правила, за якими база підтримує себе, і процедури для випадків, коли автоочищення не справляється.

Усе лежить у репозиторії конфігурації та в документації — налаштування відтворюються на стенді й у проді без розбіжностей.

Що налаштовуємо в базі

  • Пороги автоочищення за групами таблиць: для гарячих частка змінених рядків спрацьовує раніше, для великих архівів інтервали розширені, щоб планове очищення не витісняло термінове.
  • Схема вікон обслуговування: важкі операції лише в години низького навантаження, з обмеженням тривалості та прив'язкою до чергувань.
  • Перелік винятків: таблиці та великі архіви з окремим сценарієм — разові вставки, партиції під відсікання, дані лише для читання.
  • Контрольні запити й оповіщення: частка мертвих рядків, давність останнього очищення, наближення до граничного лічильника транзакцій, швидкість зростання файлів.

Що залишається у вашої команди

  • Порядок планового обслуговування: хто відкриває вікно, що перевіряється до і після, де фіксується результат.
  • Регламент ескалації: за якими показниками черговий піднімає задачу, кому передає і що встигає зробити до відкату.
  • Доступи та журнал ручних операцій: окремі облікові записи для обслуговування, обмеження і слід виконання.
  • Документація з обґрунтуванням кожного порога — при зростанні даних правила перераховуються, а не підбираються заново.

Кейс: роздування скоротили втричі без зупинки сервісу

Вступні дані та обмеження проєкту

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

Роздування зростало швидше, ніж очищення встигало його підбирати, — частка мертвих рядків у найгарячіших таблицях наблизилася до 40%, а обсяг зберігання розрісся майже втричі проти корисних даних. Вікна простою не було: сервіс працює цілодобово, зупиняти базу заради ручного очищення ми не могли.

Друге обмеження — аварійні прогони очищення. Їх запускали вручну, коли роздування перевалювало за критичну позначку; кожен прогон просідав відгук і тримав інженерів у напрузі.

Результат і що змінилося в обслуговуванні

Пороги спрацьовування та вартість очищення перерахували під профіль запису конкретних таблиць, а перехід робили на працюючій базі: спочатку прогін нових налаштувань на репліці, звірка планів і навантаження, потім плавне перемикання без вікна простою.

Частка мертвих рядків упала з 38% до 11%, обсяг зберігання скоротився втричі, відгук на піку став рівнішим — просідання на очищенні перестали бути помітні в метриках.

Число аварійних прогонів знизилося з кількох на місяць до одного-двох на квартал, і то з планових причин.

Обслуговування перейшло з режиму «гасимо пожежу» в спостереження: роздування, частота очищень і вік найстаріших транзакцій тепер на панелі метрик, а пороги переглядаються при зміні профілю запису.

Чим порогові політики відрізняються від розкладу за вікнами?

Порогові політики спираються на кількість змінених рядків: частка мертвих рядків у таблиці перевищує заданий відсоток — збирання запускається, не чекаючи календарної дати.

Це дає реакцію на сплески: пакетне видалення або масова заливка одразу піднімають лічильник, і застарілі версії рядків не встигають роздути файли.

Зворотний бік — непередбачуваність за навантаженням. На великій таблиці відсотковий поріг досягається рідко й пізно, на малій — збирання йде майже безперервно.

Піки вводу-виводу припадають на моменти, коли система й без того зайнята, а узгодити їх із резервним копіюванням та оновленням не можна: розкладу просто немає.

Планові вікна обслуговування знімають цю невизначеність. Запуск чищення прив'язаний до нічного інтервалу, інженер заздалегідь знає, коли база витратить ресурси на збирання сміття, і поєднує це з іншими регламентними роботами.

Ціна — запізнення: між вікнами таблиця накопичує мертві рядки, і сплеск у невдалий момент встигає надути файли швидше, ніж прийде розклад.

Гібридна схема очищення бере реактивність порогів і передбачуваність вікон: фонове чищення йде за розкладом, для таблиць із високим записом знижуються пороги й виставляється агресивніший режим, а заморозка та переіндексація залишаються у вікні.

Для баз, які вже обслуговуються вручну, це робочий варіант: ручний запуск зберігається як точка контролю, а пороги страхують від пропущеного вікна.

Автоочищення під навантаженням: блокування, великі таблиці, перевірка

Автоочищення вмикається саме і на навантаженій базі регулярно упирається в блокування, великі таблиці та нестачу часу на прохід. Нижче — відповіді на сумніви, які найчастіше звучать перед зміною цих налаштувань.

Усі вони про експлуатацію без простою: що можна правити на живій базі, а що потребує вікна.

Очищення заблокує таблиці та покладе сервіс?

Штатний прохід бере слабке блокування і не заважає ні читанню, ні запису. Монопольне тримають лише повне перезбирання таблиці та перебудування індексів — їх виносимо у вікно обслуговування.

Чи можна змінювати параметри без перезапуску?

Пороги та затримки задаються для конкретної таблиці й набирають чинності для наступних проходів — перезапуск не потрібен. Налаштування загального пулу пам'яті застосовуються при старті, їх плануємо заздалегідь.

Що робити з великими таблицями та архівами?

На таблиці в сотні гігабайт частка змінених рядків довго не доходить до порога, і вона залишається необробленою. Розбиваємо її на розділи за часом, пороги задаємо окремо, а старі архіви обслуговуємо своїм регламентом поза автоочищенням.

Як переконатися, що обробка йде?

Дивимося системні представлення та журнал: час останнього проходу, число мертвих рядків, лічильники заморозки. За ними налаштовуємо оповіщення — про застій дізнаємося до того, як виросте файл.

База обслуговується роками, усе запущено — з чого почати?

З обстеження: де накопичується мертве, які довгі транзакції тримають очищення, де лічильник ідентифікаторів близький до межі. Зміни проганяємо на копії і лише потім переносимо в робочий контур.

Обговоримо задачу: зберемо профіль навантаження та план робіт

Щоб оцінка спиралася на факти, а не на припущення, нам потрібні вихідні дані по вашій базі. Зібрати їх можна за один прохід по системних представленнях і журналах — на цій основі ми порахуємо обсяг робіт і порядок змін.

  • статистика очищення: скільки мертвих рядків накопичується, які таблиці випадають з обробки, як часто спрацьовує автоочищення і де воно не встигає за записом;
  • динаміка зростання таблиць та індексів — скільки обсягу додається за добу і на яких об'єктах зростання випереджає очищення;
  • вікна навантаження: коли пік запису, в які години можна запускати важкі операції без впливу на користувачів;
  • обмеження щодо простоїв: допустима тривалість недоступності, наявність реплік і можливість перемикання на них;
  • уже застосовані налаштування — змінені пороги автоочищення, ручні розклади, обхідні правила, які хтось уводив раніше;
  • параметри сервера та версія гілки: обсяг пам'яті, число ядер, тип диска, конфігурація журналу транзакцій;
  • історія інцидентів: коли востаннє розростався журнал або просідала швидкість запитів після масового оновлення.

Опишіть задачу та додайте те, що є, — повернемося з оцінкою та планом робіт. У плані буде видно, що змінюємо в порогах, що переносимо в регулярний регламент і на яких контрольних замірах підтверджуємо результат.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139