You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何降低PostgreSQL多轮HammerDB TPCC性能测试的结果偏差?

问题描述

使用HammerDB-v4.3的schema_tpcc.tcl、test_tpcc.tcl脚本开展多轮PostgreSQL TPCC性能测试,预期多轮测试间的性能偏差低于2%,但实际NOPM值偏差远超预期,以下为可行的降偏差优化方案。


参考背景信息

硬件配置

Architecture        x86_64
CPU op-mode(s)      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              256
On-line CPU(s) list: 0-255
Thread(s) per core:  2
Core(s) per socket:  64
Socket(s):           2
NUMA node(s):        8
L1d cache:           32K
L1i cache:           32K 
L2 cache:            512K
L3 cache:            16384K
OS: RHEL8.4
RAM SIZE:512G
SSD:1TB

postgresql.conf配置

autovacuum_max_workers = 16
autovacuum_vacuum_cost_limit = 3000
checkpoint_completion_target = 0.9
checkpoint_timeout = '15min'
cpu_tuple_cost = 0.03
effective_cache_size = '350GB'
listen_addresses = '*'
maintenance_work_mem = '2GB'
max_connections = 1000
max_wal_size = '128GB'
random_page_cost = 1.1
shared_buffers = '128GB'
wal_buffers = '1GB'
work_mem = '128MB'
random_page_cost = 1.1
effective_io_concurrency = 200 

HammerDB schema.tcl脚本

#!/bin/tclsh
dbset db pg
diset connection pg_host localhost
diset connection pg_port 5432
diset tpcc pg_count_ware 400
diset tpcc pg_num_vu 50
print dict
buildschema
waittocomplete

测试执行规则与实测数据

测试从1VU开始逐步上调虚拟用户数,依次为1、2、4等,实测数据如下:

Virtual UsersTrail-1(NOPM)Trail-2(NOPM)%diff
1299390929136.52%
1405614295254086.42%
19263601649957421.45%
23062164470188212.91%

优化方案

系统层优化

  • 关闭NUMA自动调度并绑核:执行echo 0 > /proc/sys/kernel/numa_balancing关闭NUMA自动平衡,使用numactl将PostgreSQL进程和HammerDB压测进程分别绑定到不同的固定NUMA节点,避免跨NUMA访问带来的性能波动。
  • 关闭CPU节能特性:执行cpupower frequency-set -g performance将CPU调速器设为性能模式,在BIOS中关闭睿频、C-State节能选项,避免CPU频率随机波动。
  • 清理无关进程:测试前停止crond、firewalld、irqbalance等所有无关后台服务,避免后台任务抢占系统资源。
  • 调整SSD IO策略:将SSD的IO调度器改为none模式:echo none > /sys/block/[你的SSD设备名]/queue/scheduler,关闭磁盘写入缓存的volatile特性,避免写入延迟随机波动。

数据库层优化

  • 控制测试期间的后台任务:测试过程中临时关闭autovacuum(autovacuum = off),如果需要保留则将autovacuum_naptime设为大于单轮测试总时长,避免自动vacuum随机触发抢占资源。
  • 统一每轮测试的初始状态:每轮测试前手动执行CHECKPOINT命令,将checkpoint_timeout临时设为大于单轮测试时长,避免测试过程中触发checkpoint带来的性能抖动。
  • 保证数据状态一致:每轮测试结束后要么重建TPCC测试库,要么执行VACUUM FULL ANALYZE,保证每轮测试的索引碎片率、数据分布完全一致。
  • 清空缓存重置状态:每轮测试结束后重启PostgreSQL实例,执行echo 3 > /proc/sys/vm/drop_caches清空操作系统页缓存,保证每轮测试的缓存初始状态完全一致。

压测流程优化

  • 增加预热阶段:每轮调整VU数后先预热5-10分钟,等数据库CPU、内存、IO负载完全稳定后再开始统计NOPM,避免初始阶段的波动影响结果。
  • 统一测试时长:每轮测试的统计时长统一设为30分钟以上,抹平短时间内的随机波动。
  • 压测进程绑核:将HammerDB的压测进程绑定到和PostgreSQL不同的CPU核心上,避免压测工具本身占用数据库的计算资源。
  • 高VU场景校验:192、230等高VU场景下先排查是否存在锁等待、连接溢出、WAL写入瓶颈,根据情况调整数据库相关参数,避免性能瓶颈随机触发。

内容的提问来源于stack exchange,提问作者researcher HPC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:45:04