我在使用 Ubuntu、320 GB SSD、6 核和 16GB Ram 的服务器上工作,但是 Postgres 遇到了一些需要很长时间才能运行的查询以及并行查询,这大大增加了服务器负载。
一些 Postgres 配置:
max_connections = 150
shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 109MB
maintenance_work_mem = 1GB
checkpoint_completion_target = 0.7
wal_buffers = 16MB
effective_io_concurrency = 200
seq_page_cost = 1
random_page_cost = 1.1
cpu_index_tuple_cost = 0.030
cpu_operator_cost = 0.0150
cpu_tuple_cost = 0.06
#parallel_tuple_cost = 0.1 # same scale as above
#parallel_setup_cost = 1000.0 # same scale as above
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
max_worker_processes = 6
max_parallel_workers_per_gather = 3
max_parallel_workers = 6
服务器在 Linode 上,我得到一些信息:
#更大的bs
$ dd bs=16k count=10240 iflag=direct if=./test_file of=/dev/null;
已复制 167772160 字节(168 MB,160 MiB),1,01442 秒,165 MB/秒
#较小的bs
$ dd bs=2048 count=80000 iflag=direct if=./arquivo_teste of=/dev/null;
已复制 163840000 字节(164 MB,156 MiB),9,91975 秒,16,5 MB/秒
lsblk -o NAME,MOUNTPOINT,MODEL,ROTA
sda / QEMU HARDDISK 1
Linux myClientName 5.7.6-x86_64-linode136 #1 SMP PREEMPT Wed Jun 24 15:41:07 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
不确定 dd 测试是否会有所帮助,但我发现小 BS 测试和大 BS 测试之间的差异有多大很有趣。
如果我没看错 QEMU 是虚拟化系统,尽管 ROTA = 1,HD 可能仍然是 SSD
- 有什么方法可以确定我可以在 Postgres 服务器上拥有多少并行工作人员?
整个集群的并发并行worker数限制为
max_parallel_workers
,必须≤max_worker_processes
。每个查询的并行工作人员限制为max_parallel_workers_per_gather
.调整这些参数,你可以随心所欲地启动尽可能多的工人。请记住,一旦您使用的并行工作者数量超过了 CPU 和 I/O 可以处理的数量,性能就会下降。另外,不要忘记可能还有其他查询正在运行,所以不要过度分配资源。
不要忘记替代方法:也许可以重写或索引查询以更快。