一、系统级参数优化
1. 内存管理
- 调整内核参数(需在
/etc/sysctl.conf
中配置):
生效命令:# 减少 Swap 使用,优先使用物理内存 vm.swappiness = 10 # 控制脏页刷新频率,避免频繁刷盘 vm.dirty_background_ratio = 3 vm.dirty_ratio = 10 # 提高内存分配灵活性 vm.overcommit_memory = 2 vm.overcommit_ratio = 90
sysctl -p
2. 网络参数优化
- 调整 TCP 缓冲区大小(适用于分布式节点通信):
net.core.rmem_max = 134217728 net.core.wmem_max = 134217728 net.ipv4.tcp_rmem = 4096 87380 134217728 net.ipv4.tcp_wmem = 4096 65536 134217728
3. 文件句柄限制
- 提升最大文件句柄数(防止连接数不足):
用户级限制(在fs.file-max = 6815744
/etc/security/limits.conf
中配置):opentenbase soft nofile 65536 opentenbase hard nofile 65536
二、OpenTenBase 数据库参数调优
1. 共享内存与缓存
-
**共享缓冲区(shared_buffers)**:
- 推荐值:分配物理内存的 25%-40%,但不超过 64GB。
- 配置示例:
SET shared_buffers = '16GB';
- 作用:提高数据缓存命中率,减少磁盘 I/O。
-
**临时缓冲区(temp_buffers)**:
- 推荐值:根据临时查询需求动态调整(默认 8MB)。
- 配置示例:
SET temp_buffers = '512MB';
2. 工作内存与排序
-
**工作内存(work_mem)**:
- 推荐值:根据并发查询数分配,每查询 256MB-1GB。
- 配置示例:
SET work_mem = '512MB';
- 注意:值过大会导致内存争用,需结合
max_connections
调整。
-
**排序内存(sort_mem)**:
- 推荐值:与
work_mem
一致或稍小。 - 配置示例:
SET sort_mem = '256MB';
- 推荐值:与
3. 写入优化
-
**检查点间隔(checkpoint_segments, checkpoint_timeout)**:
- 推荐值:
SET checkpoint_segments = 32; SET checkpoint_timeout = '15min';
- 作用:减少频繁检查点对写入性能的影响。
- 推荐值:
-
**预写日志(wal_buffers)**:
- 推荐值:分配物理内存的 1%-2%。
- 配置示例:
SET wal_buffers = '256MB';
4. 并行查询与并发控制
-
**并行查询线程数(max_parallel_workers_per_gather)**:
- 推荐值:根据 CPU 核心数分配(例如 4 核 CPU 设置为 4)。
- 配置示例:
SET max_parallel_workers_per_gather = 4;
-
**最大连接数(max_connections)**:
- 推荐值:根据业务负载调整,避免资源争用。
- 配置示例:
SET max_connections = 200;
三、分片策略与数据分布优化
1. 选择合适的分片策略
-
Hash 分片(默认推荐):
- 适用场景:OLTP 负载,数据均匀分布需求。
- 优势:数据分布均匀,查询性能稳定。
- 劣势:范围查询效率低。
- 配置示例:
CREATE TABLE orders ( id INT, user_id INT, created TIMESTAMP ) DISTRIBUTE BY HASH(user_id);
-
Range 分片:
- 适用场景:时序数据(如日志、交易记录),范围查询频繁。
- 优势:范围查询性能优秀。
- 劣势:可能产生热点。
- 配置示例:
CREATE TABLE logs ( id INT, timestamp TIMESTAMP ) DISTRIBUTE BY RANGE(timestamp);
-
List 分片:
- 适用场景:按业务维度分片(如区域、用户类型)。
- 优势:业务逻辑清晰。
- 劣势:维护复杂度高。
- 配置示例:
CREATE TABLE users ( id INT, region VARCHAR(10) ) DISTRIBUTE BY LIST(region);
2. 冷热数据分离
- 配置冷热数据组(适用于历史数据归档):
- 步骤:
- 创建冷数据组:
CREATE NODE GROUP cold_group WITH (dn002);
- 创建分片策略:
CREATE SHARDING GROUP ON TABLE history_data TO cold_group;
- 验证执行计划:
EXPLAIN SELECT * FROM history_data WHERE timestamp < '2022-01-01'; -- 预期访问 cold_group 节点
- 步骤:
四、查询性能调优
1. 跨节点 Join 优化
- 强制分布键关联(减少数据传输):
SELECT /*+ DISTRIBUTE(o.user_id) */ o.*, u.name FROM orders o JOIN users u ON o.user_id = u.id WHERE o.created > '2024-01-01';
2. 索引优化
-
**局部索引(Local Index)**:
- 对非分布键字段创建索引:
CREATE INDEX idx_orders_created ON orders(created);
- 对非分布键字段创建索引:
-
全局索引(Global Index)(谨慎使用):
- 对跨节点查询字段创建全局索引:
CREATE GLOBAL INDEX idx_users_region ON users(region);
- 对跨节点查询字段创建全局索引:
3. 避免全表扫描
- 分区裁剪:
- 对 Range 分片表使用分区条件过滤:
SELECT * FROM logs WHERE timestamp BETWEEN '2024-01-01' AND '2024-01-31';
- 对 Range 分片表使用分区条件过滤:
五、监控与日志分析
1. 关键监控指标
- 系统级:
- CPU 使用率、内存占用、磁盘 I/O。
- 网络延迟(适用于分布式节点通信)。
- 数据库级:
- 查询响应时间、缓存命中率、锁等待时间。
pg_stat_activity
查看活跃会话:SELECT * FROM pg_stat_activity;
2. 日志分析
- 日志路径:
/data/opentenbase/pgxc_ctl/pgxc_log/
- 常见问题排查:
- 连接失败:检查
/etc/environment
中的PATH
和LD_LIBRARY_PATH
。 - 初始化失败:查看
pgxc_ctl
日志中的错误信息,确保所有节点目录已创建。
- 连接失败:检查
六、调优后验证
- 基准测试:
- 使用
pgbench
或自定义脚本模拟业务负载。 - 对比调优前后的 TPS(每秒事务数)和响应时间。
- 使用
- 执行计划分析:
- 使用
EXPLAIN ANALYZE
检查查询是否命中索引、分布键是否合理。
- 使用
- 资源监控:
- 使用
top
、iostat
、vmstat
等工具监控系统资源。
- 使用
七、注意事项
- 单机版资源分配:协调节点(CN)和数据节点(DN)共享同一台机器时,需合理划分内存和 CPU 资源,避免争用。
- 备份与恢复:调优前备份配置文件和数据,确保可回滚。
- 版本兼容性:不同版本的 OpenTenBase 参数可能有差异,参考官方文档(OpenTenBase 官方文档)。