作者:金仓社区banjin
一、内存整体架构说明
KingbaseE整体内存分为共享内存和会话私有内存两大部分,无自动内存适配机制,所有内存规格均通过配置文件静态定义,是数据库性能稳定的核心调优板块。
共享内存为实例全局所有进程共用,参数修改后需重启数据库生效;私有内存随业务会话动态申请、释放,支持会话临时调整,无需重启实例。
1.1 内存计算规则
数据库整机内存占用计算公式:
数据库总内存 ≈ 共享内存总量 + 并发私有内存峰值 + 连接基础内存 + 运维专用内存
生产硬性规范:数据库内存总占用不得超过服务器物理内存的80%,剩余20%内存预留为操作系统文件缓存,杜绝Swap交换分区占用,避免整机性能卡顿。
1.2 内存层级划分
服务器物理内存整体分为两层,分别为操作系统内存与数据库实例内存:
1. 操作系统内存:主要用于系统进程、文件缓存、页面缓存,由effective_cache_size参数预估统计;
2. 数据库实例内存:包含共享内存(数据缓冲区、日志缓冲区、锁缓存)和私有内存(会话排序、运维操作、临时表缓存)。
对标Oracle数据库:shared_buffers、wal_buffers对应SGA区域;work_mem、maintenance_work_mem对应PGA区域。
二、共享内存核心参数详解
共享内存为实例启动时一次性分配,全局所有会话共享,核心参数调整必须重启数据库生效,是数据库IO性能的决定性参数。
2.1 shared_buffers 数据缓冲区
该参数是数据库核心内存参数,用于缓存数据表、索引的数据块,将热点数据常驻内存,大幅减少磁盘物理IO。系统默认值为128MB,生产环境禁止使用默认配置。
生产配置标准:独立数据库服务器配置物理内存的25%-40%;数据库与中间件混布服务器配置15%-25%,最大不超过整机内存40%。
性能判定标准:数据缓冲区命中率≥99%为健康状态;命中率低于95%时,需扩容缓冲区或优化低效SQL。
常用操作命令:
查看参数:SHOW shared_buffers;
修改参数:ALTER SYSTEM SET shared_buffers='4GB';(修改后重启实例生效)
2.2 wal_buffers 日志缓冲区
用于缓存事务WAL重做日志,通过批量刷盘减少频繁磁盘IO,提升事务提交性能。默认自动适配为shared_buffers的3%,支持手动自定义规格。
场景化配置:高并发OLTP业务配置4MB-64MB;批量导入、ETL数据同步场景配置16MB-32MB;低负载测试库可沿用默认值。
配置禁忌:该参数无需配置过大,WAL日志事务提交强制落盘,超大规格无法提升性能,只会浪费共享内存资源。
2.3 锁管理共享内存
该部分内存为系统隐式分配,无独立配置参数,主要用于存储行锁、表锁、事务锁等并发控制信息,内存大小由两个参数控制:max_connections(最大连接数)、max_locks_per_transaction(单事务最大锁数量)。
生产环境禁止将两个参数配置过大,极易导致实例启动内存分配失败,常规OLTP业务建议max_locks_per_transaction配置64-128即可。
三、私有内存核心参数详解
私有内存为单会话独立占用,随SQL执行动态申请和释放,支持全局配置与单会话临时调整,无需重启数据库,主要用于排序、关联、索引创建等运算场景。
3.1 work_mem 会话运算内存
用于单条SQL的排序、哈希关联、去重、子查询运算。内存充足时所有运算在内存完成,性能极高;内存不足则落地磁盘生成临时文件,SQL性能会大幅下降。默认值4MB。
核心风险:存在并发内存溢出风险,单条SQL可包含多个运算算子,高并发场景下过大的work_mem会瞬间耗尽整机内存,触发OOM故障。
场景配置规范:高并发OLTP业务2MB-8MB;混合业务8MB-16MB;低并发OLAP报表业务64MB-256MB。
单SQL临时调优:仅对当前大查询会话生效,不影响全局业务
SET work_mem='256MB'; SELECT 报表查询SQL; RESET work_mem;3.2 maintenance_work_mem 运维操作内存
专门用于VACUUM垃圾回收、索引创建、索引重建、表结构修改等数据库运维操作,默认64MB。运维任务多为串行执行,无并发冲突,可适当放大配置。
配置标准:配置整机物理内存的5%-10%,上限不超过2GB。大批量建索引、全库垃圾回收前,可临时调高该参数提升效率。
3.3 temp_buffers 临时表缓冲区
用于缓存会话临时表数据,默认8MB。业务频繁使用临时表的场景,可调整为32MB-64MB,仅当前会话生效,全局无需大规格配置。
四、辅助内存优化参数
4.1 effective_cache_size
该参数仅用于数据库优化器代价计算,不占用任何物理内存。用于告知优化器整机可用缓存大小,数值越高,优化器越优先选择索引扫描,避免全表扫描。
配置规范:统一配置为整机物理内存的50%-75%,且必须大于shared_buffers大小。
4.2 max_connections 最大连接数
数据库最大并发连接数,单连接会占用5-10MB基础内存。生产环境不建议配置过大,需配合应用连接池使用,实际业务连接数控制在参数最大值的1/3,避免空闲连接占用内存资源。
五、生产标准化内存配置模板
以下模板为成熟落地配置,可直接适配对应业务场景,导入kingbase.conf生效。
5.1 16G服务器 OLTP高并发业务(交易、税务系统)
# 共享内存(重启生效) shared_buffers = 4GB wal_buffers = 16MB max_connections = 500 max_locks_per_transaction = 128 # 私有内存 work_mem = 4MB maintenance_work_mem = 1GB # 辅助参数 effective_cache_size = 12GB5.2 32G服务器 OLAP报表业务(数仓、统计分析)
shared_buffers = 10GB wal_buffers = 32MB max_connections = 100 work_mem = 128MB maintenance_work_mem = 2GB effective_cache_size = 24GB5.3 8G服务器 测试/开发环境
shared_buffers=2GB wal_buffers=8MB max_connections=200 work_mem=2MB maintenance_work_mem=512MB effective_cache_size=6GB六、日常内存监控手段
6.1 数据库内部监控SQL
1、查询数据缓冲区命中率
SELECT sum(heap_blks_read+idx_blks_read) disk_read, sum(heap_blks_hit+idx_blks_hit) mem_hit, round(100.0*sum(heap_blks_hit+idx_blks_hit)/(sum(heap_blks_hit+idx_blks_read+heap_blks_read)+0.0001),2) hit_ratio FROM sys_statio_user_tables;2、查询内存不足导致磁盘临时文件的低效SQL
SELECT queryid,query,temp_blks_read,temp_blks_written,round(temp_blks_written*8/1024.0,2) AS temp_mb FROM sys_stat_statements WHERE temp_blks_written>0 ORDER BY temp_blks_written DESC;3、查询当前运行会话
SELECT pid,usename,now()-query_start AS run_time,state,query FROM sys_stat_activity;6.2 服务器系统监控命令
# 查看整机内存、Swap占用情况 free -h # 统计Kingbase进程总内存占用 ps aux | grep kingbase | awk '{sum+=$6}END{print sum/1024" MB"}' # 查看数据库共享内存段 ipcs -m # 实时监控进程资源占用 top/htop七、常见内存故障排查方案
7.1 数据库启动失败,提示无法分配共享内存
故障根因:共享内存参数配置过大,超出系统剩余内存;锁参数规格过高;系统内核共享内存上限不足。
解决方式:调小shared_buffers、max_locks_per_transaction参数;调整Linux内核shmmax共享内存最大值,刷新内核参数生效。
7.2 业务SQL执行缓慢,大量临时文件生成
故障根因:work_mem配置过小,排序、哈希运算无法在内存完成,强制落地磁盘;高并发下多算子叠加加剧性能问题。
解决方式:大查询会话临时调高work_mem;优化SQL减少无效排序、全表关联;OLTP环境适度微调全局work_mem,严控并发峰值。
7.3 服务器Swap飙升、整机卡顿
故障根因:数据库总内存配置超标,耗尽物理内存;业务并发突增,私有内存瞬间溢出,触发系统换页。
解决方式:下调内存参数,数据库总内存控制在整机70%以内;应用侧收紧连接池,限制最大并发连接数。
7.4 索引创建、垃圾回收运维操作执行极慢
故障根因:maintenance_work_mem内存不足,运维操作频繁读写临时文件。
解决方式:运维操作执行前,临时调高该参数,任务完成后恢复默认配置。