Ubuntu 上 Informix 性能测试方法与步骤
一 测试准备与基线
- 环境隔离:在非生产环境进行,使用与生产一致的Ubuntu 版本、Informix 版本与字符集/页大小,数据规模建议达到或超过生产的10%–30%。
- 资源与内核:确认CPU、内存、存储 IOPS/时延满足测试需求;如为云盘,优先选择更高 IOPS的存储类型;关闭不必要的后台服务,避免干扰。
- 数据库基线:执行健康检查与基线采集,便于对比优化前后差异。
- 使用 onstat - 查看实例概要(版本、启动时间、会话、缓冲池等)。
- 使用 onstat -d 查看 DBSpace/Chunk 使用与空间分布。
- 使用 onstat -l 查看 逻辑日志 配置与使用情况。
- 采集实例运行时间与概要:
- select dbinfo(‘UTC_TO_DATETIME’,sh_boottime) start_time, current year to second - dbinfo(‘UTC_TO_DATETIME’,sh_boottime) run_time, sh_maxchunks, sh_maxdbspaces, sh_maxuserthreads, sh_maxtrans, sh_maxlocks, sh_nlrus buff_lrus, sh_longtx longtxs from sysmaster:sysshmvals;
- select name, value from sysmaster:sysprofile;
- 监控准备:在测试主机与数据库侧同时开启监控,便于关联瓶颈来源(系统 vs 数据库)。
二 测试工具与监控
- 数据库内置与 SQL 观测
- 会话与等待:
- 按空闲时间排序的会话:
- select s.sid, s.username, s.hostname, q.odb_dbname database, dbinfo(‘UTC_TO_DATETIME’,s.connected) conection_time, dbinfo(‘UTC_TO_DATETIME’,t.last_run_time) last_run_time, current-dbinfo(‘UTC_TO_DATETIME’,t.last_run_time) idle_time FROM syssessions s, systcblst t, sysrstcb r, sysopendb q WHERE t.tid = r.tid AND s.sid= r.sid AND s.sid = q.odb_sessionid ORDER BY 7 DESC;
- 会话等待类型:
- select sid,pid, username, hostname, is_wlatch, is_wlock, is_wbuff, is_wckpt, is_incrit from syssessions order by username;
- SQL 与执行成本:
- 当前正在执行的 SQL:
- select username,sqx_sessionid, sqx_sqlstatement from sysmaster:syssqexplain, sysmaster:sysscblst where sqx_sessionid = sid;
- 成本最高的 SQL:
- select first 25 sqx_estcost, sqx_estrows, sqx_sqlstatement from sysmaster:syssqexplain order by sqx_estcost desc;
- SQL Trace:
- 开启:echo ‘execute function task (“set sql tracing on”,100000, “1k”, “low”,“your_db”);’ | dbaccess sysadmin
- 关闭:echo 'execute function sysadmin:task(“SET SQL TRACING OFF”); ’ | dbaccess sysadmin
- 分析顺序扫描:
- select distinct sql_statement from sysmaster:Syssqltrace t inner join sysmaster:syssqltrace_iter i on t.sql_id = i.sql_id where i.sql_itr_info=‘Seq Scan’;
- 按总耗时排序:
- select first 20 * from sysmaster:syssqltrace order by sql_totaltime | dbaccess your_db;
- 锁与空间:
- 表级锁等待:
- select dbsname, tabname, sum(pf_rqlock) as locks, sum(pf_wtlock) as lockwaits, sum(pf_deadlk) as deadlocks from sysactptnhdr,systabnames where systabnames.partnum = sysactptnhdr.partnum group by dbsname,tabname order by lockwaits desc;
- DBSpace 使用:
- SELECT A.dbsnum as No, trim(B.name) as name, CASE WHEN (bitval(B.flags,‘0x10’)>0 AND bitval(B.flags,‘0x2’…(按需完善字段)
- 系统监控
- 资源与 I/O:top、vmstat 1、iostat -x 1、sar -u 1、netstat -an
- 深度分析:perf(CPU/热点函数)、strace(系统调用跟踪)、gprof(应用级热点)
- 图形化与企业监控
- Informix Performance Monitor(IPM)、Informix Enterprise Monitor(IEM) 用于更细粒度的指标与可视化。
三 测试场景设计与执行
- 场景覆盖:
- 基准测试:小表点查/范围查询、大表聚合与排序、OLTP 事务混合读写、批量导入/导出、并发登录与会话压力。
- 稳定性测试:长稳运行(如8–24 小时)观察内存增长、检查点抖动、日志切换频率。
- 峰值与异常:峰值并发、慢查询注入、锁争用与日志满等异常路径验证。
- 数据与环境:
- 构造与生产分布/基数/关联键一致的测试数据;准备可重复的数据加载脚本与回放脚本(JDBC/ODBC/ESQL)。
- 执行流程:
- 预热:运行5–10 分钟小流量预热,避免冷缓存影响。
- 阶梯加压:并发从低到高(如10→50→100→200会话),每个阶梯稳定10–15 分钟。
- 稳态采集:每个阶梯记录TPS、P95/P99 延迟、错误率与资源指标。
- 峰值与破坏性:在可控范围内进行峰值与异常测试,验证限流/回滚/告警策略。
- 工具选择:
- 数据库与 SQL 层:自研脚本(JDBC/ODBC/ESQL)或 JMeter(通过 JDBC/HTTP 驱动)进行事务级压测;企业级可用 LoadRunner。
- 应用层:若需端到端,可用 JMeter/LoadRunner 模拟真实用户行为。
四 关键指标与结果分析
- 数据库指标
- 吞吐与延迟:每秒事务数(TPS)、平均/分位延迟(P50/P95/P99)、错误率。
- 会话与等待:活跃/阻塞会话数、锁等待、检查点频率与时长、逻辑日志切换频率。
- SQL 效率:高成本 SQL、全表扫描比例、执行计划稳定性。
- 系统与存储
- CPU:us/sy/wait/idle,长稳阶段是否出现异常占用。
- 内存:缓冲池命中率、页清洗与换页。
- I/O:await、r/s、w/s、svctm、util(iostat -x),关注 IOPS 与延迟是否成为瓶颈。
- 网络:连接数、重传率、带宽占用(netstat -an 结合监控)。
- 分析方法
- 关联:将数据库等待/锁与系统 CPU/IO/网络 指标对齐,定位是SQL/索引/锁问题还是硬件/配置瓶颈。
- 定位:对高成本 SQL 使用 SQL Trace 与执行计划,必要时用 perf/strace 深入内核/调用栈。
- 验证:针对问题调整(索引、SQL 改写、配置参数、存储/网络),重复同一阶梯复测,验证可重复性与收益。
五 实操要点与注意事项
- 可重复性:固定随机种子、数据分布与执行计划,确保多次测试可复现。
- 数据一致:每次测试前重建/回滚数据集,避免状态污染。
- 日志与空间:测试前预估逻辑日志与 DBSpace 增长,避免因日志满或空间不足导致测试中断。
- 监控对齐:数据库与系统监控同时开启与停止,保证时间戳一致,便于因果分析。
- 变更控制:一次只变更一个变量(SQL、索引、参数、硬件),便于归因。
- 安全合规:压测不影响生产;对包含敏感数据的库,使用脱敏数据或影子库。
- 风险提示:变更数据库参数与执行深度分析工具(如 perf/strace)可能带来性能波动或额外开销,请在维护窗口或测试环境进行,并事先做好备份与回滚方案。