Skip to content

项目实战:Kingbase 迁移后性能压测 ​

用到的技术栈:Apache JMeter 5.6.3(命令行 -n 模式)+ Kingbase 8 JDBC + kbbench 初始化工具 一句话机制:国产数据库迁移后「能不能上线」不能靠厂商测试数字,只能靠统一口径下的自有 JDBC 压测——用 JMeter 连接池压出吞吐/时延曲线,把瓶颈与 SLA 达标情况落到可量化的通过率上。

业务背景(已脱敏) ​

  • 场景:系统后端数据库由 PostgreSQL(开源)迁移至 Kingbase(人大金仓 V8)后,需压测验证迁移未引入性能退化、确认具备上线条件。
  • 规模:5 个压测场景、累计约 590 万请求样本;20 并发稳定吞吐约 1.3 万次/秒,整体错误率约 0.003%。
  • 约束:压测机为 Linux 服务器、只能无 GUI 命令行模式;国产库需使用专用 JDBC 驱动;测试表需先用 kbbench 初始化。

架构 / 关键设计 ​

链路:JMeter 每线程循环执行 ① 主键等值查询(Prepared Select)→ ② 主键定点更新(Prepared Update)两条 JDBC 采样器,读写 1:1 混合;单连接池 + DurationAssertion(本例 200ms)作 SLA 断言。

场景矩阵(并发/时长/原型):

场景并发时长目的
verify110s连通性 / 功能验证
mixed_101060s标准压测(日常量级)
mixed_202060s加压(峰值量级)
mixed_505060s极限(容量上限)
longrun_2020300s长稳(稳定性 / 泄漏)

关键实现:参数全部经 -Jxxx 命令行传入,用 Shell 脚本 run_batch.sh 按「场景名|并发|时长」批量顺序执行;场景间 sleep 让连接池冷却,避免相互干扰。

主要结论 ​

  • 吞吐随并发先线性放大、后逼近上限:1→10→20 并发吞吐约 680→6,600→12,200 次/秒;20→50 并发仅 +6%,已接近当前配置吞吐上限。
  • 高并发下瓶颈是连接池而非数据库:JMX 中 poolMax=20 写死,50 线程共享最多 20 条连接 → 多余请求排队,表现为时延走高而吞吐不涨(50 并发平均时延由 ~1.6ms 升至 ~3.7ms)。
  • 写路径是延迟主构成:读 SELECT 约 0.4ms 级、写 UPDATE 约 2.5–5ms;高并发时写延迟劣化最明显(锁竞争 + 连接排队)。
  • 长稳无忧:20 并发 5 分钟全程吞吐稳定、无性能劣化与泄漏迹象。
  • 功能层面全部通过:唯一异常为 20 次瞬时响应超时(耗时略超 SLA 且集中在同一瞬间),非数据库功能性错误,判定为偶发抖动。

踩过的坑 & 解决 ​

坑现象解决
连接池固定写死高并发吞吐封顶、只在排队poolMax 与线程数对齐,用 -JpoolMax=$threads 参数化
断言口径不清瞬时超时难以定性明确「响应码 200 但超 SLA」也算失败,并把瞬时超时与系统性故障区分开
环境残留干扰前序场景影响后序场景间 sleep 5s 冷却连接池
漏监控 DB 侧吞吐瓶颈难定位在 CPU/IO/锁补 sar/vmstat/慢查询,把吞吐时延与资源关联
5 分钟长稳偏短慢泄漏可能漏检生产预演延长到 30min–1h,并盯连接池/内存曲线
缺端到端覆盖只验证了 DB 直连上线前补应用层全链路压测(覆盖连接池/SQL 映射层)

复用价值(可提炼为通用方法论的点) ​

  1. 连接池是国产库压测的第一瓶颈候选:线程数 > 连接池上限时,压测结果反映的是连接排队而不是数据库上限——先让 poolMax ≥ threads 再谈容量。
  2. SLA 通过率要量化:给出总样本数 + 失败数 + 失败率(本例 5,932,401 样本 / 20 失败 / 0.0034%),比「通过/失败」定性结论更有汇报价值。
  3. 用「分层加压 + 长稳」两个维度闭环验证:短时并发(低压→高压找容量点)+ 长时稳定(中压验稳定与泄漏)缺一不可。
  4. 读写分体看:混合场景只给总吞吐会掩盖「读快写慢」——分项 SELECT/UPDATE 指标才能定位优化对象。

脱敏自检清单(已过) ​

  • 无客户名 / 项目真名
  • 无内网 IP / 域名 / 端口(原文含内网 IP,入 Wiki 前已省略)
  • 业务量级已模糊化(仅保留测试指标)
  • 无未公开工期 / 人员

关联 ​

最近更新