Skip to content

PostgreSQL 基准测试最佳实践

基准测试工具介绍

pgbench

pgbench 是 PostgreSQL 自带的基准测试工具,主要用于测试 OLTP 场景性能:

bash
# 初始化测试数据库
pgbench -i -s 10 postgres

# 运行简单测试(10个客户端,1000个事务)
pgbench -c 10 -j 2 -t 1000 postgres

sysbench

sysbench 支持多种数据库和测试场景,包括 CPU、内存、文件 I/O 和数据库性能测试:

bash
# 安装 sysbench
sudo apt-get install sysbench

# 准备测试数据
sysbench --db-driver=pgsql --pgsql-host=localhost --pgsql-port=5432 --pgsql-user=postgres --pgsql-password=password --pgsql-db=test --table-size=1000000 --tables=10 oltp_read_write prepare

# 运行测试
sysbench --db-driver=pgsql --pgsql-host=localhost --pgsql-port=5432 --pgsql-user=postgres --pgsql-password=password --pgsql-db=test --table-size=1000000 --tables=10 --threads=16 --time=60 oltp_read_write run

TPC-C

TPC-C 是行业标准的 OLTP 基准测试,模拟零售订单处理系统:

bash
# 安装 TPC-C 测试工具(以 HammerDB 为例)
wget https://github.com/TPC-Council/HammerDB/releases/download/v4.9/HammerDB-4.9-Linux.tar.gz
tar -xzf HammerDB-4.9-Linux.tar.gz

# 运行 HammerDB GUI 或 CLI 进行测试
./hammerdb-4.9/hammerdb-cli

测试环境准备

硬件配置要求

  1. 测试服务器:与生产环境配置相似或相同
  2. 网络环境:独立的测试网络,避免外部干扰
  3. 存储配置:使用与生产环境相同的存储类型(HDD/SSD/NVMe)
  4. 操作系统:与生产环境相同的操作系统版本

软件环境准备

bash
# 安装 PostgreSQL
sudo apt-get install postgresql-15

# 关闭不必要的服务
sudo systemctl stop nginx apache2

# 优化操作系统参数
sudo sysctl -p /etc/sysctl.d/postgresql.conf

数据库初始配置

sql
-- 基础性能配置
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET work_mem = '64MB';
ALTER SYSTEM SET maintenance_work_mem = '1GB';
ALTER SYSTEM SET effective_cache_size = '12GB';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET wal_buffers = '16MB';

-- 重启数据库使配置生效
SELECT pg_reload_conf();

测试场景设计

1. OLTP 场景

  • 简单查询测试:单表简单查询性能
  • 复杂查询测试:多表连接、子查询等复杂查询
  • 混合负载测试:读写混合场景(如 TPC-C)
  • 高并发测试:模拟大量并发连接

2. OLAP 场景

  • 数据仓库测试:大表扫描、聚合查询
  • 分析查询测试:复杂分析函数、窗口函数
  • 批量加载测试:大量数据导入性能

3. 特殊场景

  • 备份恢复测试:数据库备份和恢复速度
  • 高可用切换测试:主备切换性能影响
  • 升级迁移测试:版本升级性能变化

测试执行流程

1. 测试前准备

bash
# 清理系统缓存
sudo sync && sudo echo 3 > /proc/sys/vm/drop_caches

# 重启数据库服务
sudo systemctl restart postgresql

# 等待数据库稳定
sleep 30

2. 测试执行

bash
# 运行 pgbench 测试脚本
#!/bin/bash

test_name="oltp_read_write"
clients=(10 20 40 80 160)

for c in "${clients[@]}"; do
  pgbench -c $c -j 4 -t 10000 -P 5 -U postgres -d testdb -o ${test_name}_${c}.out
  sleep 60
  sudo sync && sudo echo 3 > /proc/sys/vm/drop_caches
done

3. 测试后处理

bash
# 收集系统性能数据
mpstat -P ALL 1 60 > mpstat.out
iostat -xmt 1 60 > iostat.out
vmstat 1 60 > vmstat.out

# 收集数据库性能数据
psql -U postgres -d testdb -c "SELECT * FROM pg_stat_database;" > pg_stat_database.out
psql -U postgres -d testdb -c "SELECT * FROM pg_stat_bgwriter;" > pg_stat_bgwriter.out

测试结果分析

关键指标解读

指标名称含义单位理想值
TPS每秒事务数事务/秒越高越好
QPS每秒查询数查询/秒越高越好
响应时间事务平均响应时间毫秒越低越好
吞吐量数据处理能力MB/秒越高越好
资源利用率CPU、内存、I/O 使用率%合理范围内

结果可视化

bash
# 使用 gnuplot 绘制 TPS 曲线
gnuplot << EOF
set terminal png size 800,600
set output 'tps.png'
set title 'TPS 随并发数变化'
set xlabel '并发客户端数'
set ylabel 'TPS'
plot 'tps_data.txt' using 1:2 with linespoints title 'TPS'
EOF

瓶颈分析

  1. CPU 瓶颈:CPU 利用率接近 100%
  2. 内存瓶颈:大量 page fault,内存使用率高
  3. I/O 瓶颈:磁盘使用率高,等待时间长
  4. 网络瓶颈:网络带宽接近饱和
  5. 数据库瓶颈:锁等待、连接数限制、参数配置不合理

最佳实践与注意事项

测试设计最佳实践

  1. 测试环境与生产环境一致:确保测试结果具有参考价值
  2. 测试场景覆盖全面:包括正常负载和峰值负载
  3. 测试数据量足够大:至少达到生产环境数据量的 10%
  4. 测试时间足够长:每个测试至少运行 30 分钟
  5. 多次测试取平均值:减少随机因素影响

测试执行最佳实践

  1. 测试前清理缓存:确保每次测试环境一致
  2. 监控全面:同时监控系统和数据库性能
  3. 逐步增加负载:从低并发到高并发逐步测试
  4. 测试间隔足够:让系统恢复到稳定状态
  5. 记录详细配置:包括硬件、软件和参数配置

结果分析最佳实践

  1. 关注瓶颈指标:重点分析性能瓶颈
  2. 对比基准数据:与历史数据或行业标准对比
  3. 分析趋势变化:关注性能随负载变化的趋势
  4. 提出优化建议:根据测试结果提出具体优化方案
  5. 生成详细报告:包括测试目的、环境、过程、结果和建议

常见问题(FAQ)

Q1:如何选择合适的基准测试工具?

A1:根据测试场景选择合适的工具:

  • 简单 OLTP 测试:使用 pgbench
  • 复杂多场景测试:使用 sysbench
  • 行业标准测试:使用 TPC-C/TPC-H
  • 自定义场景测试:开发自定义测试脚本

Q2:测试数据量应该多大?

A2:建议测试数据量至少达到生产环境的 10%,最好与生产环境相当。数据量太小会导致缓存命中率过高,无法反映真实生产环境性能。

Q3:如何避免测试结果波动?

A3:

  • 确保测试环境稳定,关闭不必要的服务
  • 每次测试前清理系统缓存
  • 多次测试取平均值
  • 延长测试时间,减少随机因素影响
  • 保持测试参数一致

Q4:如何分析测试结果中的瓶颈?

A4:

  • 查看系统资源利用率:CPU、内存、I/O、网络
  • 分析数据库性能指标:锁等待、连接数、缓存命中率
  • 查看执行计划:确认查询是否高效
  • 使用性能分析工具:如 pg_stat_statements、pgBadger

Q5:基准测试结果可以直接用于生产环境吗?

A5:基准测试结果可以作为参考,但不能直接用于生产环境。因为真实生产环境的负载更加复杂,包括数据分布、查询模式、并发特性等都可能与基准测试不同。建议结合基准测试结果和实际生产环境监控数据进行优化。