Firebird OLTP-EMULator 测试
OLTP-EMUL 是官方的 Firebird 测试工具,用于在 Firebird 2.5 及以上版本上模拟真实的 OLTP 工作负载。在多个并发 ISQL 会话下进行性能和回归检查时使用它。运行测试前请仔细阅读本指南。
克隆仓库
Windows
git clone --config core.autocrlf=true https://github.com/FirebirdSQL/oltp-emul
Linux / POSIX
git clone --config core.autocrlf=false https://github.com/FirebirdSQL/oltp-emul
快速入门基于 Pavel Zotov(莫斯科)的工作。关于测试本身的问题:[email protected]。IBSurgeon 支持:[email protected]。
1. 先决条件
在将要运行 ISQL 会话的主机上,安装 Firebird 客户端并确保以下二进制文件可用:
isql(在某些 POSIX 软件包中:isql-fb)fbsvcmgr
2. 选择并复制配置文件
在 src 文件夹中,选择与您的 Firebird 主版本和操作系统匹配的默认配置,然后将其复制并去掉 .default 后缀。
| Firebird | 操作系统 | 配置文件 |
|---|---|---|
| 2.5 | Windows | oltp25_config.win.default |
| 2.5 | Linux | oltp25_config.nix.default |
| 3.0 | Windows | oltp30_config.win.default |
| 3.0 | Linux | oltp30_config.nix.default |
| 4.0 | Windows | oltp40_config.win.default |
| 4.0 | Linux | oltp40_config.nix.default |
# Windows copy .\oltp30_config.win.default .\oltp30_config.winLinux
cp ./oltp30_config.nix.default ./oltp30_config.nix
3. 重要设置
编辑复制的配置。请特别注意以下内容:
- fbc - 启动会话的机器上
isql的路径 - clu - 可选的非标准 ISQL 二进制名称(例如 POSIX 软件包中的
isql-fb) - dbnm - 服务器上数据库的完整路径和文件名(仅限 ASCII;如果您希望脚本创建数据库,则不能使用别名)
- host、port、usr、pwd - 连接参数
- tmpdir - ISQL 日志和临时测试文件的目录
- init_docs - 在测量工作负载之前创建的文档数(先尝试 3000-5000)
- warm_time / test_time - 预热和测量阶段,以分钟为单位
- sleep_min / sleep_max - 事务之间的暂停时间(将
sleep_max设置为 0 可禁用暂停) - sleep_ddl - 可选的用于暂停的 UDF(优先于 shell
sleep/cscript);二进制文件位于util/udf64/下 - wait_for_copy - 初始化后暂停,以便在预热/测量之前对数据库进行快照(对于重复运行很有用)
初始化后,测试先运行 warm_time 分钟的预热,然后进行 test_time 分钟的测量。
4. Windows 和 firebird.conf 提示
将防病毒/操作系统扫描排除在 tmpdir 和 Firebird 临时文件夹(FIREBIRD_TMP / TMP / TEMP,以及 firebird.conf 中的 TempDirectories)之外。将 FIREBIRD_TMP 与 TempDirectories 对齐可减少多个 ISQL 会话下的性能下降。
至少增加以下参数:
DefaultDbCachePagesLockHashSlotsLockMemSizeFileSystemCacheThreshold- 必须显式设置且大于DefaultDbCachePages(测试会拒绝缺失/被注释的值,某些 POSIX 软件包布局除外)
页面缓存的目标约为内存的 25%。对于 Classic / SuperClassic,不要将 DefaultDbCachePages 设置为高于 2048。页面大小硬编码为 8192。
中等负载示例(约 100 个会话):
| 参数 | SuperServer 3.0+ | [Super]Classic 3.0+ | [Super]Classic 2.5 |
|---|---|---|---|
DefaultDbCachePages |
~0.25 × 内存 / 8192 | 1024 | 1024 |
LockHashSlots |
8191 | 16001 | 16001 |
LockMemSize |
4194304 | 16777216 | 16777216 |
5. 运行测试
打开 shell,切换到 src,然后运行:
1run_oltp_emul <FbMajor> <NumSessions> [nostop]
- FbMajor - 对于 Firebird 2.5 / 3.0 / 4.0,分别为
25、30或40 - NumSessions - 要启动的 ISQL 会话数
- nostop - 可选;跳过交互式暂停(从计划任务运行时很有用)
如果数据库文件不存在且 dbnm 是完整路径(不是别名),脚本可以创建它。不完整或空的旧数据库将根据需要重新创建。
6. 报告和停止
预热 + 测量时间结束后,会话自动停止。第一个 ISQL 会话在 tmpdir 下写入最终报告。在 Windows 上使用 make_html = 1 时,还会生成 HTML 报告(速度较慢)。
报告命名取决于 file_name_with_test_params:
- 注释状态(默认)- 例如
oltp**.report.txt regular- 带时间戳的名称,适合在文件夹列表中浏览多次运行结果benchmark- 适合比较设置/DDL变体的名称
报告包括架构和设置、总体及每间隔性能(CNT_OK_PER_MINUTE / AVG_TIMES_PER_MINUTE)、可选的监控详情、异常、数据库统计、版本/记录比率、修改表的验证,以及 firebird.log 的前后差异。
您还可以查询:
select * from srv_mon_perf_dynamic; select * from srv_mon_perf_total;
提前停止
使用每次启动时在 tmpdir 中创建的 1stoptest.tmp(.bat / .sh)。对于多主机启动,您可以改为在 firebird.conf 中启用 ExternalFileAccess,在 OLTP 配置中设置 use_external_to_stop,然后向该停止文件中写入一个字符(每次新运行前清除它)。
可重复的基线
设置 wait_for_copy = 1,让初始化完成,复制数据库,然后在每次比较运行前恢复该副本,以便每次测量都从相同的起点开始。
工作负载模拟的内容
该场景遵循汽车服务风格的业务文档:
- 客户(或内部)订购零件
- 订单合并并发送给供应商
- 供应商发票(全额或部分)
- 库存收货;客户订购的零件被预留
- 销售和库存核销
- 在多个步骤中可能发生取消
- 部分/全额付款和取消影响余额
- 第一个会话生成性能、异常、统计和验证报告