如何降低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 Users | Trail-1(NOPM) | Trail-2(NOPM) | %diff |
|---|---|---|---|
| 12 | 99390 | 92913 | 6.52% |
| 140 | 561429 | 525408 | 6.42% |
| 192 | 636016 | 499574 | 21.45% |
| 230 | 621644 | 701882 | 12.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
相关产品推荐
相关产品推荐

