在Linux环境下对 IBM Informix 进行调优,通常从 操作系统、数据库参数、SQL与索引、存储与I/O、内存与CPU 等多个层面入手。下面给你一个比较系统、实战向的调优指南。
Informix 对共享内存、信号量、文件句柄等依赖较大。
# 查看当前参数
sysctl -a | egrep "shm|sem|file-max"
建议调整(示例,需根据内存调整):
vi /etc/sysctl.conf
kernel.shmmax = 68719476736 # 64GB
kernel.shmall = 16777216
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
应用:
sysctl -p
Informix 通常需要大量文件句柄。
vi /etc/security/limits.conf
informix soft nofile 65536
informix hard nofile 65536
informix soft nproc 65536
informix hard nproc 65536
Informix 更依赖物理内存,swap 过多影响性能。
# 查看
free -h
# 降低 swap 倾向
sysctl vm.swappiness=10
核心配置文件:$INFORMIXDIR/etc/$ONCONFIG
SHMVIRTSIZE 32768 # 初始虚拟共享内存(KB)
SHMADD 8192 # 每次扩展大小
SHMTOTAL 0 # 0 表示不限制
BUFFERS 100000 # 数据缓冲区(页)
经验值:
- OLTP:物理内存的 40%~60%
- 数据仓库:可更高
LOGFILES 6
LOGSIZE 50000 # 每个日志大小(KB)
CKPTINTVL 300 # 检查点间隔(秒)
避免频繁检查点:
RTO_SERVER_RESTART 0
LOCKS 200000
MAXLOCKS 20000
NUMCPUVPS 4 # CPU VP 数量(建议 ≤ CPU 核数)
NETTYPE soctcp,1,50,CPU
CREATE TABLE t1 (...) IN datadbs;
CREATE INDEX idx1 ON t1(c1) IN indexdbs;
DBSPACETEMP tempdbs1,tempdbs2
避免临时表空间在系统盘。
Linux 下建议启用 KAIO:
USE_AIO 1
UPDATE STATISTICS FOR TABLE t1;
定期执行,尤其是:
CREATE INDEX idx_emp ON employee(dept, id);
SELECT *-- 不推荐
SELECT * FROM t WHERE UPPER(name)='A';
-- 推荐
SELECT id,name FROM t WHERE name='A';
onstat -g cfg # 参数
onstat -g mem # 内存
onstat -g ses # 会话
onstat -g sql # SQL
onstat -g iof # I/O
onstat -g sql
结合:
SET EXPLAIN ON;
| 问题 | 可能原因 | 优化方向 |
|---|---|---|
| CPU 高 | 索引缺失 | 加索引 |
| I/O 高 | 缓冲池小 | 增大 BUFFERS |
| 锁等待 | 事务过长 | 缩短事务 |
| 临时空间慢 | tempdb 不合理 | 分离 tempdb |
| 启动慢 | 检查点频繁 | 调大 LOGSIZE |
如果你愿意,我可以:
你可以直接贴:
Informix 版本 + Linux 版本 + 内存/CPU + ONCONFIG 关键参数