内存使用限制

数据库系统常常对内存的使用比较多,在服务器的内存不足的情况下,应该限制服务器使用的内存大小,这不但可以让数据库服务器和Web服务器同机运行在一台服务器上,还可以控制数据库服务器使用的内存大小。

神通数据库对内存的控制主要分为:排序内存、数据缓冲区内存、日志读缓冲区内存以及日志写缓冲区内存等。这些参数的修改都可以通过“系统参数配置工具”修改。

默认情况下:

参数名字 描述 缺省值 最小值 最大值
SORT_MEM 执行器排序最大内存(单位KB) 4096 8 0X7FFFFFFF
BUF_DATA_BUFFER_PAGES 数据缓冲区页数(以8192字节为单位) 8192 64 0x1000000
LOG_READ_BUFFER_PAGES 日志读缓冲区页数(以512字节为单位) 0X400 0x20 0x1000000
LOG_WRITE_BUFFER_PAGES 日志写缓冲区页数(以512字节为单位) 0X1000 0x20 0x1000000

内存限额功能

有些场景中,服务器内存不足,数据库实例又占用系统内存较大,很容易导致数据库被系统OOM。为预防和排查这种情况,增加了内存限额功能。

内存限额类型分为实例级和会话级。

内存限额的配置参数可以通过配置文件或是DBA设置,启库后普通用户不能自己设置。

参数说明如下:

参数名字 缺省值 最小值 最大值 描述
INST_MEM_THRESHOLD 90 0 100 实例内存占系统总内存的百分比
SESSION_MEMORY_MAX_SIZE 0 0 2147483647 会话级最大内存限制,单位MB
SESSION_MEMORY_ACTION LOG NULL NULL 会话级内存超过限制后指定的行为 LOG :打印LOG日志,继续执行;ERROR :抛错 ,停止执行。

实例级内存超限后的处理:

超过实例最大内存限制会选出占用内存最大的会话,通知会话回滚掉当前执行的语句,待内存释放后判断其内存使用状态,若释放的内存不够多时会杀掉会话。

会话级内存超限后的处理:

若参数 SESSION_MEMORY_ACTION 配置为 log,则会话内存超限后只会打印日志,继续执行当前语句;

若参数 SESSION_MEMORY_ACTION 配置为 error,则会话内存超限后会抛错回滚,停止执行当前语句。