[特殊字符] PostgreSQL 数据库压力测试完整流程(JMeter版)

🚀 PostgreSQL 数据库压力测试完整流程(JMeter版)

使用 PostgreSQL + Apache JMeter


🧱 一、测试目标

本次压测用于验证:

  • ✔ 最大 TPS(吞吐量)

  • ✔ 系统瓶颈(CPU / DB / IO)

  • ✔ 响应时间稳定性

  • ✔ 并发极限


🧱 二、数据库准备

1️⃣ 建表

复制代码
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INT,
    amount NUMERIC,
    created_at TIMESTAMP DEFAULT NOW()
);

2️⃣ 初始化数据

复制代码
INSERT INTO orders (user_id, amount)
SELECT floor(random()*1000), random()*100
FROM generate_series(1, 100000);

3️⃣ 建索引

复制代码
CREATE INDEX idx_orders_user_id ON orders(user_id);

⚙️ 三、JMeter准备

  • 安装 Apache JMeter

  • 添加 PostgreSQL JDBC 驱动(放 /lib

    postgresql-42.x.x.jar


🧪 四、测试结构

复制代码
Test Plan
 ├── Thread Group
 │    ├── JDBC Connection Configuration
 │    ├── JSR223 PreProcessor(自动参数生成)
 │    ├── JDBC Request
 │    ├── Aggregate Report

🔗 五、数据库连接配置

复制代码
Variable Name: pgdb
JDBC URL: jdbc:postgresql://localhost:5432/testdb
Driver: org.postgresql.Driver
Username: postgres
Password: xxx
Max Connections: 50~200

🧵 六、压测模型(阶梯式)

阶段 线程数 时间
1 10 3 min
2 30 3 min
3 50 5 min
4 80 5 min
5 120 5 min

🧾 七、SQL测试场景

🔵 查询

复制代码
SELECT * FROM orders WHERE user_id = ?;

🟢 插入

复制代码
INSERT INTO orders (user_id, amount)
VALUES (?, ?);

🟡 混合

复制代码
SELECT amount FROM orders WHERE id = ?;
UPDATE orders SET amount = amount + 1 WHERE id = ?;

⚙️ 八、自动参数生成(核心)

在 JDBC Request 上添加:

👉 JSR223 PreProcessor(Groovy)

复制代码
int userId = (int)(Math.random() * 10000)
double amount = Math.round(Math.random() * 100 * 100.0) / 100.0

vars.put("user_id", String.valueOf(userId))
vars.put("amount", String.valueOf(amount))

🧾 JDBC 参数配置

INSERT:

复制代码
${user_id}, ${amount}

参数类型:

复制代码
INTEGER, DOUBLE

🎯 九、JDBC Request 设置

SQL类型 设置
SELECT Select Statement
INSERT Update Statement
UPDATE Update Statement

📊 十、执行压测

复制代码
jmeter -n -t test.jmx -l result.jtl

📈 十一、生成报告

复制代码
jmeter -g result.jtl -o report

📊 十二、核心指标

  • TPS(吞吐量)

  • 平均响应时间

  • 95线延迟

  • 错误率


🔥 十三、找性能极限方法

逐步加压:

  • TPS增长 → 正常

  • TPS停止增长 → 达瓶颈

  • 延迟暴涨 → 临界点

  • Error出现 → 超载


🧠 十四、TPS公式

TPS = \frac{\text{总请求数}}{\text{测试时间(秒)}


🏁 十五、总结

完整流程:

  1. 建表 + 数据 + 索引

  2. 配 JMeter JDBC

  3. 写 SQL

  4. 自动生成参数(JSR223)

  5. 阶梯加压

  6. 记录 TPS

  7. 找瓶颈

  8. 出报告

相关推荐
2301_813599552 小时前
SQL如何提取两个表的交集_INTERSECT与INNER JOIN结合
jvm·数据库·python
m0_674294642 小时前
mysql如何处理索引基数过低情况_mysql索引选择性分析
jvm·数据库·python
qq_342295822 小时前
c++怎么获取文件的压缩比例信息_Windows压缩卷特性【详解】
jvm·数据库·python
weixin_458580122 小时前
CSS如何控制列表间距_使用padding-left与盒模型
jvm·数据库·python
m0_617881422 小时前
Tailwind CSS如何实现固定定位布局_使用fixed与z-index控制CSS层级
jvm·数据库·python
m0_674294642 小时前
Cgo 中正确处理 const char- 类型回调参数的实践方法
jvm·数据库·python
justjinji2 小时前
Chart.js 4 中实现基于数据极值的垂直线性渐变填充
jvm·数据库·python
小菜同学爱学习3 小时前
夯实基础!MySQL数据类型进阶、约束详解与报错排查
开发语言·数据库·sql·mysql
桌面运维家3 小时前
IDV云桌面vDisk机房课表联动部署方案
大数据·服务器·数据库