Monitorings

PostgreSQL "Checkpoints Are Occurring Too Frequently": ko tas nozīmē un kā to novērst

Žurnāla rinda izskatās nekaitīga, bet bieži kontrolpunkti nozīmē papildu ierakstus diskā, ar pilnu lapu attēliem uzpūstu WAL un lēnākas replikas. Lūk, kā to izlasīt un pareizi izvēlēties max_wal_size.

· 11 min lasīšanai · AG Data komanda

Ja PostgreSQL žurnālā parādās "checkpoints are occurring too frequently", serveris jums saka, ka WAL aizpilda max_wal_size ātrāk, nekā beidzas checkpoint_timeout. Dažas šādas rindas liela pakešdarba laikā ir normālas. Ja tās parādās ik pēc dažām minūtēm parastā slodzē, serveris veic daudz vairāk kontrolpunktu darba, nekā vajag, un lielā, noslogotā datubāzē tas maksā reālu I/O, WAL apjomu un repliku joslas platumu.

Kā ziņojums izskatās

LOG:  checkpoints are occurring too frequently (12 seconds apart)
HINT:  Consider increasing the configuration parameter "max_wal_size".

Tas ir LOG ziņojums, nevis kļūda, tāpēc nekas neapstājas. PostgreSQL pirmkodā checkpointer to raksta, ja kontrolpunkts pieprasīts WAL apjoma dēļ un sākās mazāk nekā checkpoint_warning sekundes (pēc noklusējuma 30s) pēc iepriekšējā. Iestatījums checkpoint_warning = 0 to izslēdz, bet tas tikai paslēpj simptomu un neko nemaina.

Kāpēc notiek kontrolpunkti

WAL konfigurācijas nodaļa apraksta divus automātiskus izraisītājus, atkarībā no tā, kurš iestājas pirmais:

Kontrolpunktus var pieprasīt arī tieši, piemēram, ar komandu CHECKPOINT vai bāzes rezerves kopijas sākumā. Mierīgā serverī uzvar taimeris, un kontrolpunkti ir vienmērīgi. Rakstīšanas noslogotā serverī 1 GB WAL var rasties dažās sekundēs, tāpēc izmēra izraisītājs nostrādā atkal un atkal, un parādās brīdinājums.

Kāpēc bieži kontrolpunkti kaitē

Kompromiss ir atkopšanās pēc avārijas: lielāks attālums starp kontrolpunktiem nozīmē vairāk WAL, kas jāatskaņo pēc avārijas. Tāpēc risinājums ir "pietiekami liels", nevis "pēc iespējas lielāks".

Apstipriniet to ar statistiku un žurnāliem

Pārbaudiet, cik kontrolpunktu bija pieprasīti, nevis laika izraisīti. PostgreSQL 17 kolonnas pārcēla no pg_stat_bgwriter uz pg_stat_checkpointer:

-- PostgreSQL 17 un jaunākas versijas
SELECT num_timed, num_requested,
       round(100.0 * num_requested / nullif(num_timed + num_requested, 0), 1) AS pct_requested,
       write_time, sync_time, buffers_written, stats_reset
FROM pg_stat_checkpointer;

-- PostgreSQL 16 un vecākas versijas
SELECT checkpoints_timed, checkpoints_req, stats_reset
FROM pg_stat_bgwriter;

Ja kopš stats_reset pieprasītie kontrolpunkti skaidri dominē, max_wal_size ir par mazu jūsu rakstīšanas apjomam. Ņemiet vērā, ka pieprasīto skaitītājā ietilpst arī manuālas CHECKPOINT komandas un bāzes rezerves kopijas, tāpēc nakts rezerves kopēšana pati pievieno dažus.

Kopš PostgreSQL 15 log_checkpoints pēc noklusējuma ir ieslēgts. Katrs kontrolpunkts žurnālā ieraksta rindu checkpoint starting: ar iemeslu (wal, time, immediate, force...) un rindu checkpoint complete: ar ierakstīto buferu skaitu, ierakstīšanas un sinhronizācijas laiku, kā arī distance un estimate kB. Virkne rindu checkpoint starting: wal stāsta to pašu, ko brīdinājums, tikai ar skaitļiem.

Kā izvēlēties max_wal_size

Neminiet. Izmēriet, cik WAL serveris uzraksta viena checkpoint_timeout laikā maksimālās slodzes brīdī:

-- 1. pierakstiet pašreizējo WAL pozīciju maksimālās slodzes laikā
SELECT pg_current_wal_lsn();            -- piem., 3A/1F000000

-- 2. pēc tieši checkpoint_timeout (pēc noklusējuma 5 minūtēm) izmēriet attālumu
SELECT pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '3A/1F000000'));

-- pilno lapu attēlu daļa WAL (PostgreSQL 14+)
SELECT wal_records, wal_fpi, pg_size_pretty(wal_bytes) FROM pg_stat_wal;

Tad iestatiet max_wal_size ar labu rezervi virs šī skaitļa, lai maksimuma laikā lielāko daļu kontrolpunktu izraisītu laiks un izmēra robežu sasniegtu tikai neparasti lēcieni. Gan max_wal_size, gan checkpoint_timeout var pārlādēt, restartēšana nav vajadzīga:

ALTER SYSTEM SET max_wal_size = '16GB';
SELECT pg_reload_conf();
SHOW max_wal_size;

16GB šeit ir piemērs, nevis ieteikums. Pēc izmaiņām vērojiet pg_stat_checkpointer un kontrolpunktu žurnāla rindas visu biznesa ciklu. Dažas komandas arī palielina checkpoint_timeout līdz 15 vai 30 minūtēm, lai vēl vairāk samazinātu pilnu lapu attēlus; tas pagarina atkopšanos pēc avārijas, tāpēc lemiet to kopā ar atkopšanas laika mērķi.

max_wal_size ir mīkstā robeža. Dokumentācija skaidri saka, ka WAL var to pārsniegt smagā slodzē, ja nedarbojas archive_command, ir liels wal_keep_size vai atpaliek replikācijas slots. Pirms palielināšanas pārliecinieties, ka pg_wal ir vieta jaunajai vērtībai un krietnai rezervei, citādi žurnāla brīdinājumu nomainīsiet pret dīkstāvi, kas aprakstīta rakstā PostgreSQL disks pilns: pg_wal.

Kas mainās lielās datubāzēs

Ko nedarīt

Galvenās atziņas

PostgreSQL Kontrolpunkti WAL Veiktspēja
Sadarbība ar mums

Kontrolpunkti bremzē noslogotu PostgreSQL serveri?

Mēs pielāgojam kontrolpunktus un WAL lielās PostgreSQL datubāzēs: mērām reālo WAL apjomu, izvēlamies max_wal_size un pg_wal izmēru un saskaņojam replikas un arhivēšanu.

Sazināties Vairāk no emuāra