尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SwingBench实战:Oracle数据库压测与性能评估指南
简介一份面向Oracle DBA、性能测试工程师及数据库初学者的负载生成工具包基于SwingBench 2.6.1124构建可用于模拟并发用户压力、验证分区与压缩等特性或评估新硬件性能。压缩包共325个文件以SQL脚本、Java源码、XML配置、JAR驱动、批处理启动器为主辅以CSV统计数据和少量Python工具整体仅27.92MB内置TPC-DS、JSON、订单/客户等基准测试向导并支持自定义SQL查询编辑器与新版图表渲染引擎。已有1260人学习下载适合需要快速搭建Oracle压测场景的初中级DBA。资料还包含结果转PDF、集群概览、基准验证与扩展等辅助脚本可直接对照运行相关批处理工具帮助理解各基准的生成逻辑、统计指标采集及结果输出方式。1. 为什么数据库压测我最后留了swingbench 2.6.1124 这一个 zip 包做数据库选型或接手老旧系统时最怕的不是功能 bug而是上线前压测阶段才发现撑不住。某次替一家制造企业做库存系统改造开发自认为 SQL 写得没问题用 shell 脚本并发插入 100 条记录也没问题结果一上真实用户场景夜间批处理和日间事务互相锁死。那场事故之后我开始系统找能模拟真实业务轮廓的负载工具最后留下的就是 swingbench 2.6.1124 这个压缩包。它不需要装客户端解压即用能生成和真实业务很像的 OLTP、OLAP、批处理负载直接把并发用户数、事务类型、响应时间分布这些指标拉出来。适合做 Oracle 数据库的容量规划、升级前后的回归对比以及排查锁和争用问题。只要你的库是 Oracle这套工具就值得作为压测基线保留一份。2. 先把工具跑起来swingbench 的目录结构、数据准备与首次连库2.1 组件构成两个启动入口和一个配置目录swingbench 2.6.1124 解压后目录里最核心的是swingbench、oewizard和minbench三个可执行脚本以及samples和workloads两个配置目录。工作负载定义文件全部是 XML这意味着你可以不用图形界面直接改 XML 来调整事务配比和表结构。我第一次用的时候没有细看目录直接在安装目录下执行./swingbench系统提示找不到库其实是没先加载环境变量。export ORACLE_HOME/opt/oracle/product/19c/dbhome_1 export ORACLE_SIDORCL export LD_LIBRARY_PATH$ORACLE_HOME/lib逻辑说明swingbench 是纯 Java 实现但连接 Oracle 时走 JDBC Thin 驱动理论上不需要 ORACLE_HOME。实盘里oewizard建用户、建表时如果用了-dbap等参数去调 SQL*Plus那就需要ORACLE_HOME指向真实客户端。上面这段环境变量设置是保证后续命令行脚本能直接调sqlplus生成数据。参数说明ORACLE_HOMEOracle 客户端安装根目录如果你只做远程连库压测不生成数据这个变量可以留空。ORACLE_SID在使用 bequeath 连接方式时用JDBC 下用 service name这里设了不冲突。LD_LIBRARY_PATH只有在调用 OCI 驱动时才需要。swingbench 默认用 thin 驱动走 1521 端口无需本地库。2.2 用 oewizard 批量生成模拟数据从 100MB 到 10GB 的取舍压测前先得有数据。Oracle 官方提供的 Order Entry 应用是 swingbench 自带的业务模型模拟订单录入、客户查询、商品浏览等操作。首次使用我建议先用小数据规模跑通流程再用大 scale 做正式测试。./oewizard -scale 100 -dbap oracle -cs localhost:1521/ORCLPDB \ -dba sys as sysdba -soe soe -sop soe_password \ -ts USERS -tc 8 -nolog逻辑说明oewizard的作用是在目标库中创建soe用户并在USERS表空间下生成订单相关的表、索引和约束。-scale 100表示生成的业务数据规模约为 100MB 用户数据而不是表空间占用。整个生成过程包含建表、插入、收集统计信息三个阶段日志中看到Properties File Generated说明配置完成。参数说明scale 100数据量系数范围 0.1 到 100000。scale 每增加一位orders表的记录数约增加 10 万条量级。测试阶段 100500 够用正式对比至少 1000 起。-tc 8并行度按 CPU 核数设定。8 核机器用 816 核用 16过高会出现段头争用反而变慢。-dba sys as sysdba注意引号不能省oewizard解析参数时会按空格切分。如果是纯远程压测数据已经存在这一步可跳过。我一直建议拿到 zip 后先在本库跑oewizard一次因为脚本会额外生成schema.xml和config.xml这些文件后续在顺手改事务比例时非常有用。2.3 首次连接图形界面连库与常见连接报错处理./swingbench在 GUI 里选择Properties文件如果刚才用oewizard生成了soe.properties直接加载它会自动填入连接串、用户名。连接串格式如下jdbc:oracle:thin://localhost:1521/ORCLPDB容易在这里翻车的点一是 19c 默认为 PDB 环境连接串如果不带服务名直接连 CDB 会报 ORA-01017二是soe用户只有CONNECT和RESOURCE权限如果要跑批处理压测需要额外授权CREATE TABLE权限否则会在准备阶段报ORA-01031。如果你是在内网要用特定端口做转发连接串可以写成jdbc:oracle:thin://跳板机IP:21521/ORCLPDB。swingbench 对网络延迟很敏感压测机到数据库的 RTT 建议控制在 2ms 以内否则响应时间数据里会掺杂网络噪声。3. 核心配置拆解从 XML 看懂事务配比、并发与数据分布3.1 图形界面背后的 XML 配置文件很多人在 GUI 里调节完参数就直接跑了事实上 GUI 只是生成和改写了workloads/soe.xml。理解这个 XML 能让你绕开图形界面做批量压测也能让你在深夜压测失败时一眼看出问题。?xml version1.0 encodingUTF-8 ? swingbench config connection usersoe/user passwordsoe_password/password connect_stringjdbc:oracle:thin://localhost:1521/ORCLPDB/connect_string driveroracle.jdbc.driver.OracleDriver/driver /connection workload load_scenarioOrder Entry/load_scenario collection_levelmedium/collection_level coordinationundcoord.xml/coordination total_connections30/total_connections /workload /config /swingbench逻辑说明collection_level决定采样粒度有none、light、medium、full四档。medium 会记录事务延迟分布full 会额外记录每个连接的状态转换开销大约有 5%8%。total_connections是并发连接数上限它不直接等于并发用户数而是用户池大小。参数说明load_scenario可选Order Entry、Call Center、Sales History等每个场景对应不同的 SQL 模板。coordination多节点压测时使用协调文件单机可以忽略。total_connections和事务类型比例一起决定实际负载强度。保持其他参数不变这个值从 30 提到 60吞吐量不会翻倍因为应用会触发锁等待。3.2 事务配比的心法不是并发越高越真实soe.xml中每个事务可以用独立的weight属性控制占比。实际压测前先和业务方确认各操作频率然后映射到事务类型。常见制造业 ERP 场景的事务配比如下业务操作占比swingbench 事务名订单创建45%New Order订单查询25%Order Status商品浏览15%Browse支付处理10%Payment库存更新5%Stock Update在 XML 中设置权重的片段transaction nameNew Order weight45 / transaction nameOrder Status weight25 / transaction namePayment weight10 /逻辑说明weight总和不需要等于 100swingbench 按相对值随机选择下一个事务。组合事务时会先按权重选事务再按事务自身的内部逻辑决定访问哪些表。比如 New Order 会先读customers再插入orders期间产生行锁和索引竞争这比单纯压一条INSERT得更接近真实业务。参数说明如果只想压测某一个模块比如库存系统可以只保留Stock Update和Browse两项并把total_connections下调到 10。模块级压测下载体积小、结果干净方便快速定位是哪段逻辑在抖动。3.3 预热阶段与数据分布对结果的影响swingbench 自带prepared阶段也就是所谓的预热。在soe.xml中找到prepare标签其内有iterations和delay两个字段。我一般把iterations设为 2000delay设为 0这样预热会以最快速度把常用索引数据加载到 buffer cache。如果预热次数太少前几分钟的响应时间数据会偏高容易让你误判为性能问题。prepare prepare_iterations2000/prepare_iterations prepare_delay0/prepare_delay /prepare逻辑说明prepare_iterations是每个连接在正式压测前执行的事务预热次数。Buffer cache 未热时物理读占比高这期间得到的 TPM 完全没有参考价值。prepare_delay则是每次预热事务之间的睡眠毫秒数常规设为 0除非你刻意模拟低并发下的冷缓存表现。数据分布方面oewizard生成的订单日期字段是最近 3 年呈均匀分布而真实业务往往是偏斜的集中在近 30 天。如果你压测的目的在索引扫描请手工将orders表的order_date更新为近期数据集中分布。操作方法是用 SQL 先查最大日期再按偏移量更新这个过程会锁表建议在业务低峰期做。4. 命令行无头压测把 swingbench 跑进定时任务与 CI 流程4.1 常用命令行参数说明生产环境通常没有图形界面需要把压测脚本写成一个 shell 命令。swingbench脚本本身支持大量参数直接./swingbench -h能看到完整列表。日常最常用的参数组合是./swingbench -u soe -p soe_password -cs localhost:1521/ORCLPDB \ -c workloads/soe.xml -v tpm,tps,rt \ -co 2 -ran /dev/null -o result.log -nc逻辑说明-c指定 XML 文件路径-v指定采样输出内容最有用的是tpm每分钟事务数、tps每秒事务数、rt平均响应时间毫秒。-co 2表示每 2 秒采集一次数据并写入日志。-nc是no chart模式去掉图形绘制减少 Java 内存占用。参数说明-co采集间隔建议设为 25 秒。如果设 1 秒采集本身会消耗 CPU影响压测结果设太大会丢失瞬时峰值。-o输出文件保存原始采样点这些数据后续可以导入 Python 或 Excel。-ran随机种子文件指定后可以让每次压测生成不同数据访问模式避免每次都撞同一个数据块。4.2 一个适合定时任务的无头压测脚本公司里做夜间自动压测一般是先通过 cron 触发压测完成后自动关闭并保存报告。以下脚本我已经在多个模拟项目中复用。#!/bin/bash export ORACLE_HOME/opt/oracle/product/19c/dbhome_1 export LD_LIBRARY_PATH$ORACLE_HOME/lib export PATH$PATH:$ORACLE_HOME/bin:/opt/swingbench/bin DATE$(date %Y%m%d_%H%M) LOG/opt/swingbench/results/soe_${DATE}.log cd /opt/swingbench ./swingbench -u soe -p soe_password \ -cs dbhost:1521/ORCLPDB \ -c workloads/soe.xml \ -co 5 -nc \ -min 10 -max 20 \ -v tpm,tps,rt \ -o ${LOG} 21 echo 压测完成日志位于 ${LOG} | mail -s swingbench job done opsexample.com逻辑说明脚本先设置环境变量再进入安装目录。-min 10 -max 20表示压测时长在 10 到 20 分钟之间波动。如果不指定时长swingbench 默认会持续运行直到手动停止定时任务里容易失控。-o后面接的是实时输出文件最终压测结果会以行形式附加在文件尾部。参数说明-min/-max这是两组参数分别是最小运行分钟和最大运行分钟。工具会根据这两个值在区间内随机决定停止点保证多次压测时长不完全一致避免锁的周期性重合。邮箱发送那一段是我自己加的生产环境可以用自己公司的通知渠道。关键是脚本退出码swingbench 压测中断会返回非零值如果你在 CI 里用记得在下一步前检查退出码。4.3 chart 模式的隐藏价值走势图比结果表更早暴露问题chart模式并不是只为了好看。./swingbench -c workloads/soe.xml -u soe -p soe_password -nc false -v tpm,rt逻辑说明-nc false开启内置图表窗口实时绘制 TPM 和响应时间的走势。观察走势比看平均值更有用——数据库抖动通常先表现为响应时间毛刺而 TPM 在毛刺出现的同时可能还在攀升。如果跑出来的图是一条平直线说明负载被某个锁卡住不动了这种情况下 TPM 的平均值再高也没有实际意义。在自动化压测中我一般用-nc false配合-o log.txt将采样保存下来压测结束后在浏览器里打开生成的 HTML 报告。若发现响应时间有明显周期性的山峰高度怀疑有定时任务和压测并发需要去查数据库中正在执行的DBMS_SCHEDULER作业。5. 避坑与常见问题排查swingbench 压测中反复踩的五个坑5.1 现象并发数加到 100TPM 反而狂跌一半出现 ORA-00054 锁错误原因oewizard生成的默认表结构中订单号索引是普通索引。多个并发会话同时执行New Order时对同一索引叶块的竞争激化同时触发enq: TX - index contention。这不是工具问题而是真实业务场景下的索引热点。解决ALTER INDEX soe.orders_pk REBUILD ONLINE; ALTER INDEX soe.orders_ix01 REBUILD ONLINE; ALTER TABLE soe.orders MODIFY (order_date TIMESTAMP WITH TIME ZONE);重建索引后重新压测如果 TPM 恢复线性增长说明原索引 partition 结构不合理。更彻底的解法是在oewizard中增大-partition 8把索引改为哈希分区分散热点。5.2 现象压测机 CPU 跑满但数据库 AWR 里显示 DB Time 很低原因swingbench 在 JDBC 层默认使用线程池每个连接一个线程。并发 100 时 JVM 线程切换开销巨大尤其用默认的ParallelGC时 GC 老年代频繁回收。解决修改bin/swingbench脚本中的 JVM 启动参数。JAVA_OPTS-Xms4G -Xmx4G -XX:UseG1GC压测机内存小的话至少给到 2G。另外如果用-co 1采样也会导致 CPU 消耗过高建议-co 5。5.3 现象远程压测刚开始 10 秒就断连报 ORA-12541原因防火墙拦截了 Oracle 1521 端口之外的连接。swingbench 默认使用 JDBC thin 连接只需要 1521 一个端口。但如果数据库启用了REMOTE_LISTENER做连接负载均衡连接重定向后会去连其他端口此时就需要在防火墙放行整个监听端口段。排查方法tnsping ORCLPDB确认 tnsping 能通之后再看 swingbench 是否暴露出不同报错。如果报IO Error: Got minus one from a read call多半是服务器端将空闲连接回收了需要把sqlnet.ora中的SQLNET.EXPIRE_TIME调大到 10。5.4 现象数据生成到 60% 时报 ORA-01653无法扩展表空间原因oewizard建表时表空间使用UNIFORM SIZE管理默认 1MB。数据量一大段空间耗尽。解决ALTER DATABASE DATAFILE .../users01.dbf AUTOEXTEND ON NEXT 512M MAXSIZE 32G;重新执行 oewizard 前先查询DBA_FREE_SPACE确认剩余空间。更省事的方法从一开始就建一个 32G 的裸文件做数据表空间避免中途失败重跑。数据生成本身要锁表中途报错后表会残留再次执行前必须先DROP USER soe CASCADE。5.5 现象两次压测结果完全不可比一次 TPM 5000 一次 3000原因第一次压测时数据库buffer cache是热的第二次跑之前重启了数据库或清掉了共享池。解决方法的重点在于规范化流程-- 每次压测前执行 ALTER SYSTEM FLUSH BUFFER_CACHE; ALTER SYSTEM FLUSH SHARED_POOL;注意FLUSH BUFFER_CACHE在 RAC 环境只清当前实例多节点要挨个执行。对比场景下需要固定数据库参数包括db_block_buffers、parallel_max_servers任何初始化参数变更都会让结果失真。这也是我习惯在压测脚本里先写一段固定参数的 server 端 action 的原因。6. 进阶多节点分发、结果后处理与自定义事务脚本单机压测受限于 CPU 和 JVM 线程调度当并发需求超过 300 时建议把负载分发到多个压测机。swingbench 原生支持以协调文件的方式做多节点协作。先在每台压测机放一份swingbench目录然后在主控机上生成coordination.xmlcoordination node id1 nameload01 / node id2 nameload02 / /coordination主控机通过 SSH 远程下发启动命令ssh load01 cd /opt/swingbench ./swingbench -u soe -p soe_password -c workloads/soe.xml -co 5 -nc -o results/load01.log ssh load02 cd /opt/swingbench ./swingbench -u soe -p soe_password -c workloads/soe.xml -co 5 -nc -o results/load02.log逻辑说明多节点压测的关键在于使用相同的 XML 配置但不使用同一份输出文件。各节点用本地时钟记录时间戳在汇总结果时统一按相对启动时间对齐。如果节点间时钟偏差超过 1 秒响应时间分位数会出现错位所以压测前必须同步 NTP。汇总后的结果我一般用 awk 简单处理不需要引入太重的大数据组件。awk -F, {sum_tpm $2; sum_rt $3; count} END {printf 平均TPM: %.2f, 平均响应时间: %.2f ms\n, sum_tpm/count, sum_rt/count} load01.log load02.log这段代码的作用是把两个日志文件的 TPM 和响应时间字段按行累加最后算出平均值。注意这里假设日志格式是 CSV字段顺序是时间戳、TPM、TPS、响应时间。如果你的日志字段顺序不同先手动 head 几行确认。自定义事务脚本方面swingbench 提供了一种轻量的办法在 XML 中用statement直接嵌入你要压的 SQL。下面的片段演示如何加入一个统计查询transaction nameCustom Report weight100 statement SELECT COUNT(*) FROM soe.orders WHERE order_date SYSDATE - 7 /statement /transaction逻辑说明自定义语句默认在每次事务中执行一次如果需要按结果集大小影响业务分支就要写 PL/SQL 存储过程然后在statement标签中调用存储过程。自定义脚本的好处是不依赖 oewizard 预置表结构你可以直接压生产库的真实表但有一点必须要做压测连接数必须是你线上连接池上限的 1.5 倍否则压测结果反映不出连接池瓶颈。把那台服务器换掉之前的教训让我养成了习惯swingbench 的配置文件、数据准备脚本、结果目录一定固定放在同一套目录结构里版本号写进 zip 包名。2.6.1124 这个版本我踩过了并发连接、权限、表空间几个坑也验证过它的数据生成和自定义事务都足够可信。后来每次给 Oracle 库做上线前检查我都会先./oewizard -scale 1000重建标准数据集再./swingbench -nc -co 5 -v tpm,rt跑 20 分钟基线把日志归档到按日期命名的目录。这套流程从没让我在公开评审时拿不出可对比的量化结论。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Simulink单机无穷大系统两相接地短路暂态稳定仿真与发电机转速分析

Simulink单机无穷大系统两相接地短路暂态稳定仿真与发电机转速分析

一台发电机经双回输电线路往大电网送电,电网侧的电压和频率几乎纹丝不动——这种“单机无穷大系统”虽然模型简单,却是电力系统暂态稳定性仿真里最经典的一块试金石。我这里要研究的场景很具体:线路发生两相接地短路时,故障持续几…

📅 2026/10/9 16:11:15
SSM+Flask双引擎架构:宠物医院信息管理系统开发实践

SSM+Flask双引擎架构:宠物医院信息管理系统开发实践

1. 项目从0到1:为什么我坚持用SSMFlask做双引擎 宠物医院信息管理系统,说直白点就是给宠物诊所做的一套业务中台:前台要挂号、预约、办会员,诊室要开病历、写处方、做检查记录,药房要管库存、划价、发药,老…

📅 2026/10/9 16:11:15
实战验证——把 SDK 塞进一个 macOS 原生 Agent 应用:TaoToken 统一 Key 通道接入 SwiftUI + MCP 全流程

实战验证——把 SDK 塞进一个 macOS 原生 Agent 应用:TaoToken 统一 Key 通道接入 SwiftUI + MCP 全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/9 16:11:15
MORE NEWS

更多资讯

📰

Gsql在Win8/Win10上的安装排错与数据库管理实战指南

简介:面向使用Windows 8或Windows 10操作系统的用户,这款轻量级数据库环境由开发者发布,适合个人自学、小型项目开发与软件测试。资源内含启动数据库服务的主程序、编写与执行SQL语句的辅助工具,以及调整端口、认证方式和数据库路…

📰

SPEC CPU2006 源码编译与测试实战:从零跑出可信分数

简介:这份资源是面向CPU性能测试初学者与硬件评测人员的SPEC CPU2006安装测试指南配套项目源码,帮助读者在ARM、x86_64、MIPS等不同平台上完成基准测试工具的部署与验证。压缩包共3个文件,以inscode工程配置、html说明页面和gitignore忽略规则…

📰

SwingBench 2.6 压测 Oracle 数据库:从环境配置到结果解读

简介:SwingBench 2.6 是一款易于上手的 Oracle 数据库负载生成工具,自带多种基准测试与向导,适合 DBA、性能测试工程师和架构师用于压测数据库特性(如分区、压缩)或评估新硬件性能。本次分享的 swingbench2.6.1124.zip…

📰

Oracle ERP R12表结构详解:EBS核心模块查表指南与SQL排查技巧

简介:一套针对Oracle ERP R12系统的表结构参考文档,面向ERP实施顾问、开发人员及数据库运维者,用于快速定位业务模块对应的后台表及字段关系。资源共112个文件,其中58个PDF提供各模块表结构的完整说明与关联梳理,54个H…

📰

Python实战:从采集到调度,搭建高匿免费代理池

1. 免费代理池这件事,到底值不值得自己动手做数据采集的朋友大概率都遇到过这样的场景:目标站点请求频率一高,IP 就被限流甚至封禁,脚本跑着跑着就返回 403 或者验证码页面。这时候最直接的解法就是换 IP,而免费代理池…

📰

AI工具全景解析:智能编码、数据标注与模型训练平台深度指南(TaoToken统一接入篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬