DecodificaciĂłn del informe de 2018 de Alexei Lesovsky "ÂżVamos a apagar el vacĂo?"
Nota del editor: cualquier recomendación para cambiar los parámetros siempre debe compararse en otros informes.
Tal llamada a menudo surge cuando surgen problemas en PostgreSQL, y el principal sospechoso es vacuum
(en adelante, simplemente "vacĂo"). Por experiencia, muchos están pisando este rastrillo, y mis colegas de Data Egret a menudo tienen que analizar las consecuencias, porque entonces todo empeora. Pero si prestas atenciĂłn al vacĂo en sĂ, entonces, tal vez, no existe esa persona que usarĂa Postgres, y al mismo tiempo no sabĂa nada de Ă©l. DespuĂ©s de todo, la historia del vacĂo comienza hace relativamente tiempo, y en Internet puede encontrar muchas publicaciones antiguas y nuevas sobre el vacĂo, voluminosas discusiones en las listas de correo. A pesar de que el tema del vacĂo se describe en detalle en la documentaciĂłn oficial de PostgreSQL, continuarán apareciendo nuevas publicaciones y nuevas discusiones. Quizás es por eso que muchos mitos, cuentos, historias de terror y conceptos errĂłneos están asociados con el vacĂo. Mientras tanto, el vacĂo es uno de los componentes más importantes de PostgreSQL,y su trabajo afecta directamente la productividad. Es imposible contar absolutamente todo sobre el vacĂo en un informe, pero me gustarĂa revelar puntos clave relacionados con el vacĂo, como su estructura interna, los principales enfoques para su ajuste, monitoreo del rendimiento, monitoreo y quĂ© hacer cuando el vacĂo es lo principal. sospechoso de todos los problemas. Bueno, y, por supuesto, quiero disipar mitos comunes y conceptos errĂłneos asociados con el vacĂo.Quiero disipar mitos comunes y conceptos errĂłneos asociados con el vacĂo.Quiero disipar mitos comunes y conceptos errĂłneos asociados con el vacĂo.

! . : , . , . , . , - , .

, , , . , . , , , .

, , ?

: « , . - . , ».
? , . , , , – 100 % ( ). , . - .

, . postgres’ . , . , . , . . - .

, . - , , , . . .

- / : « , ». , . - .

, , , iotop
, . - . . .
. . , .

? , - . . . .

- - : « . – autovacuum
. ».

, , , : , . . .
, .
- ( DBA) – , . , . , .
- , . . . .
- ,
shared buffers
, ( , ), . . - , shared buffers. - . . – .

. . : https://github.com/lesovsky/ConferenceStuff/tree/master/2016.highload
? pgbench
. pgbench . . , . . . , .

. , . , , , - . , Postgres, ( , ). , .

, MVCC.
MVCC (Multi-Version Concurrency Control) – "" , Postgres', . . .

? . . (snapshot).

: , . , ( COMMIT ROLLBACK).

COMMIT, , . , " ". : PostgreSQL.
. , . - , «delete», «update». .. "" — dead tuples
.

. – xmin
. , . . . insert, xmin .
, . xmax
, .
delete. . — xmax
, .
, "" . , xmax . — , Postgres , . - - , .. , .

, ? , , , .
. , . .

«delete», «update» , / . , , - .

, . .

, , , . .

:
- , , , "", , .
- shared buffers .
bloat
, .. — .

. ?
- -, .
- Postgres, . . . , , - , .
- . . .
- – . . . , .

- - . , Postgres . , . , .
- , .
- ,
. 32 , . 4294967296. , . , , ( ). .. to prevent wraparound vacuum
, . wraparound vacuum — . - , , . - . . . , . , .

- . Postgres , Postgres , , Pentium, - , . - . , , , , - . . .
- Postgres . . 9.6. , 9.6 , 9.6. ( , Postgres 12)

- . .

-, , .. — cost-based vacuum
. .
, : . , ( ) — . .
, . .
. vacuum_cost_page_hit
, vacuum_cost_page_miss
, vacuum_cost_page_dirty
, hit, miss, dirty.
Hit – , , shared buffers, . . . , .
Miss – shared buffers . . , . , shared buffers, (page cache) - . , .
Dirty – , , . .
. vacuum_cost_limit. .
vacuum_cost_delay. , cost limit . cost delay .
, , , . . .

-, . - , , .
- , 32 , . , , autovacuum_max_workers 10-15 % .
- autovacuum_naptime. , . 60 . . , 1 . , . , – . . . . , .
- – , vacuum_cost_limit, , , . , vacuum_cost_limit .

-, , . , . – .
. autovacuum_vacuum_scale_factor. scale factor . - scale_factor 0.2, . . 20 %.
autovacuum_vacuum_threshold. - – 50 . , , .

, - 20 %. , autovacuum_vacuum_threshold , , 1-2-5 %.

, autovacuum_vacuum_scale_factor . . , 1 % — . autovacuum_vacuum_scale_factor 0. autovacuum_vacuum_threshold, . . , , . autovacuum_vacuum_scale_factor , autovacuum_vacuum_threshold.

, . 4-5 , HDD , . HDD . , , . , , , .
SSD . SSD . , .
SSD . , . , (, ), . – , .
NVMe , , . I/O . , . , - – - . , IO, , .

- . vacuum_cost_delay vacuum_cost_limit. . . . . . . – . .
, . , , .

vacuum_cost_delay = 0
vacuum_cost_page_hit = 0
vacuum_cost_page_miss = 5
vacuum_cost_page_dirty = 5
vacuum_cost_limit = 200
--
autovacuum_max_workers = 10
autovacuum_naptime = 1s
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_delay = 5ms
autovacuum_vacuum_cost_limit = -1
SSD , . , , .
: SSD.

. - , - "" , .
, storage parameters
. tablespaces
, . , .

, — , , , Postgres. , , pgcompacttable pg_repack.
bloat
.
, , . – , ( ). .

, . - .
Postgres , , .
pg_stat_activity
. , (view
) , , .
, , , . . . pg_stat_atctivity ().

, , . , prevent wraparound
. (autovacuum_max_workers
)– .
– . , , , . — . .

, , pg_stat_progress_vacuum
9.6. .
, , . pg_stat_activity
, , , , pg_stat_progress_vacuum
.

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/vacuum_activity.sql
, , , . , 50 % . 3 , 3 .
— : , . , .

:
- . .
- . cost-based, cost-.
- – . , , .
! ! . 9.6 , . , , , . - ? , - ?
. 9.6 freeze-, . postgres’ , wraparound vacuum. , . , , . , , . , 9.5 . , . , .
, buffer cache, read?
, autovacuum worker , buffer-. 32 , -. , .
?
, , buffer cache, page cache, , . . , page cache, shared buffers .
, ! , . , . time . 5 1 , . . , 5 100 % CPU, storage. .
– . – . CPU, - . – ? Ubuntu. Ubuntu powersave
. . ., , 3,4 GHz, – 1,2. . performance . . , , , , , , . , , .
. , , . . - , . - bloat - , . .
! , . : . - autovacuum_vacuum_scale_factor autovacuum_vacuum_threshold . , , , . , naptime , analyze. Postgres . pg_class reltuples
.
. .
.
dead tuples community , 2ndQuadrant. – . analyze reltuples .
, . – . . , «idle in transactions», , . - . , . . , .
, ?
, MVCC . - , .
reltuples?
. .
( ) . , . : update, insert . . : , . tuples. .
, . . , . . reltuples . , , , , . . . - – . .
, . - ?
Hay funciones separadas en el cĂłdigo de postgres que recopilan estadĂsticas sobre la distribuciĂłn de datos dentro de las tablas. Este es un subsistema de vacĂo automático separado. Lee datos de muestra de tamaño limitado de la tabla. Y sobre la base de esto construye la distribuciĂłn de acuerdo con los datos. Y guarda esta informaciĂłn en el catálogo del sistema pg_statistic
o en la vista del sistema pg_stats
. Y cuando el planificador crea planes de consulta, lee informaciĂłn de este directorio. Y sobre su base hace planes. Y luego elige el mejor.