Kho*_*zid 5 postgresql performance maintenance postgresql-9.6 postgresql-performance
我们有一个与世界断开连接的服务器。它是一款高端系统,具有 48GB 内存和 500GB SSD 硬盘,16 核 CPU。我们正在尝试做一个pg_restore
少于 10 个表的简单数据库转储,没有二进制数据或 blob,只有简单的文本(注释系统)。但是一张表大约有200GB的数据,所以它很大。
这个数据库没有其他工作。仅此维护任务。鉴于上述配置,为此目的的最佳设置是什么?PGSQL 的文档对我帮助不大。我的具体问题是关于 wal 设置。
如果我们可以使用整个服务器来做一个pg_restore
,并且这个服务器上除了 PG 之外没有其他东西,我们应该使用什么设置?这就是我们现在所拥有的:
maintenance_work_mem = 1500MB
fsync = off
synchronous_commit = off
wal_level = minimal
full_page_writes = off
wal_buffers = 64MB
#----- checkpoint_segments = 512
#----- max_wal_size = (3 * checkpoint_segments) * 16MB
#-- min_wal_size = 100MB # 80MB is the default
max_wal_size = 24576MB # based on 512 checkpoint_segments
max_wal_senders = 0
wal_keep_segments = 0
archive_mode = off
autovacuum = off
Run Code Online (Sandbox Code Playgroud)
注意使用top,我们发现内存不是问题。CPU 核心数飙升至 100 左右,然后下降。这是一个密集的写入过程,所以这是有道理的。欢迎任何关于如何min_wal_size
设置的简单易懂的指导——请注意,现在已经为我们评论了。
我想您只想测试转储的恢复是否有效,仅此而已,这意味着您可以进行一些不安全的配置更改。让我们首先从您的设置开始。
这些是一个很好的选择:
fsync = off
synchronous_commit = off
full_page_writes = off
wal_level = minimal
autovacuum = off
Run Code Online (Sandbox Code Playgroud)
这三个仅在您使用复制时才重要,并且因为您已经设置wal_level
为最小值,所以您没有使用它,因此它们并不重要:
wal_keep_segments = 0
archive_mode = off
max_wal_senders = 0
Run Code Online (Sandbox Code Playgroud)
你有很多 RAM,但不会用于任何用途,我会进一步增加这个:
maintenance_work_mem = 3GB
Run Code Online (Sandbox Code Playgroud)
我会保留wal_buffers
默认值:
wal_buffers = -1
Run Code Online (Sandbox Code Playgroud)
和凹凸shared_buffers
(wall_buffers
将自动计算):
shared_buffers: 4GB
Run Code Online (Sandbox Code Playgroud)
您应该集中精力的是在恢复过程中不要设置检查点或尽可能少地设置检查点。max_wal_size
检查点由和控制checkpoint_timeout
。首先碰到checkpoint_timeout
类似的东西20h
,这样在恢复时就不会发生定时检查点:
checkpoint_timeout = 20h
Run Code Online (Sandbox Code Playgroud)
然后您可以设置max_wal_size
为磁盘空间允许的尽可能高的值。如果你恢复的数据库是200GB
并且你的磁盘500GB
,你应该安全地设置为max_wal_size
,100GB
因为Postgres可以存储最多两个wals检查点(即2x max_wal_size
):
max_wal_size = 100GB
Run Code Online (Sandbox Code Playgroud)
min_wal_size
对于你的情况来说并不重要,但你可以将其增加到 10GB
min_wal_size = 10GB
Run Code Online (Sandbox Code Playgroud)
我还建议您使用pg_restore
with--jobs=NUM
其中 NUM 可能是 CPU 核心的数量,但这也取决于您的速度SSD
,因此您可以使用此参数。
除了 Postgres 设置之外,如果可能的话,我还建议您向该磁盘添加一个额外的SATA
驱动器(7200RPM
没问题)和符号链接目录。这是 Postgres 保存 WAL 的目录,因为它们是追加写入的,所以对它们来说足够快了。它将减少 的负载,但也意味着您将能够增加更多(取决于磁盘的大小)。pg_wal
SATA
SATA
SSD
max_wal_size
SATA
最后,不要忘记在恢复转储后将您的设置恢复为正常值。
归档时间: |
|
查看次数: |
4836 次 |
最近记录: |