阿列克谢·列索夫斯基(Alexei Lesovsky)2018年报告的解码“让我们关闭真空吗?!”
编者注:有关更改参数的任何建议应始终在其他报告中进行比较。
当PostgreSQL中出现问题时,通常会出现这样的调用,而主要的怀疑是 vacuum
(以下简称“真空”)。根据经验,许多人正在踩这种耙,我和我的Data Egret同事经常不得不对后果进行耙,因为那样会使一切变得更糟。但是,如果您注意真空本身,那么也许没有人会使用Postgres,但与此同时对他一无所知。毕竟,真空的历史是在很久以前开始的,在Internet上,您可以在邮件列表上找到许多有关真空的新旧帖子,其中包括冗长的讨论。尽管有关真空的主题在PostgreSQL的官方文档中有详细描述,但新的帖子和新的讨论将继续出现。也许这就是为什么许多神话,故事,恐怖故事和误解与真空有关的原因。同时,真空是PostgreSQL最重要的组件之一,他的工作直接影响了生产力。不可能在一个报告中绝对地说明有关真空的所有信息,但是我想揭示与真空有关的关键点,例如真空的内部结构,调优的主要方法,监视性能,监视以及以真空为主要内容时该怎么做。怀疑所有麻烦。好吧,当然,我想消除与真空相关的常见神话和误解。我想消除与真空相关的常见神话和误解。我想消除与真空相关的常见神话和误解。

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

, , , . , . , , , .

, , ?

: « , . - . , ».
? , . , , , – 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 . , , , , . . . - – . .
, . - ?
postgres代码中有单独的函数,用于收集有关表内数据分布的统计信息。这是一个独立的自动真空子系统。它从表中读取有限大小的样本数据。并在此基础上根据数据建立分布。然后,他将该信息保存在系统目录pg_statistic
或系统视图中pg_stats
。当计划者构建查询计划时,它会从该目录中读取信息。并在此基础上制定计划。然后他选择了最好的一个。