🚀 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{测试时间(秒)}
🏁 十五、总结
完整流程:
-
建表 + 数据 + 索引
-
配 JMeter JDBC
-
写 SQL
-
自动生成参数(JSR223)
-
阶梯加压
-
记录 TPS
-
找瓶颈
-
出报告