可以使用公式来估计共享内存虚拟部分的初始大小。
在 SHMVIRTSIZE 配置参数中指定初始大小。
用于估计共享内存虚拟部分的初始大小的公式如下:
shmvirtsize = 固定开销 + 共享结构 +
(mncs * 专用结构) +
其他缓冲区
要使用上述公式估算 SHMVIRTSIZE 值:
-
估计公式的固定开销部分的值,如下所示:
-
运行 onstat -g mem 命令获取分配给会话的池大小。
-
从 totalsize 值中减去 freesize 字段中的值即可得到分配给每个会话的字节数。
-
估计引导后的线程池 变量的值。
此变量部分地取决于虚拟处理器数。
-
使用以下公式来估计共享结构的值:
共享结构 = AIO 向量 + 排序内存 +
数据库空间备份缓冲区 +
数据字典高速缓存大小 +
用户定义的例程高速缓存大小 +
直方图池 +
STMT_CACHE_SIZE(SQL 语句高速缓存)+
其他池(请参阅 onstat 显示。)
-
估计公式的下一部分,如下所示:
-
用以下公式估计 mncs 的值(其为并行会话的最大数量):
mncs = 轮询线程数 * 每个轮询线程连接数
轮询线程数的值是在 NETTYPE 配置参数的第 2 个字段中指定的值。
每个轮询线程连接数的值是在 NETTYPE 配置参数的第 3 个字段中指定的值。
在高峰处理期间运行 onstat -u 命令时,还可能会得到并发会话最大数的估计值。onstat -u 输出的最后一行包含最大的并发用户线程数。
-
估计专用结构 的值,如下所示:
专用结构 = 堆栈 + 堆 + 会话控制块结构
- 堆栈
- 通常为 32 KB,但取决于用户定义例程中的递归。可以用 onstat -g sts选项来获取每个线程的堆栈大小。
- 堆
- 大约为 15 KB。使用 onstat -g stm 选项时,您可以获取 SQL 语句的堆大小。
- 会话控制块结构
- 每个会话使用的内存量。onstat -g ses选项在为每个会话标识列出的 total memory 列中显示内存量(以字节为单位)。
-
将步骤 3a 和 3b 的结果相乘以得到公式的以下部分:
-
估计其他缓冲区的值,以说明分配给某些功能(例如,智能大对象的轻量级 I/O 操作)的专用缓冲区。每个用户大约 180 KB。
-
将步骤 1 到 4 的结果相加可获取 SHMVIRTSIZE 配置参数的估计值。
技巧: 当数据库服务器正以稳定的工作负载运行时,可以使用 onstat -g seg 来获取共享内存虚拟部分的实际大小的精确值。然后,您可以使用此命令报告的共享内存值来重新配置 SHMVIRTSIZE。
要为稍后添加到虚拟共享内存中的段指定大小,请设置 SHMADD 配置参数。使用 EXTSHMADD 配置参数可以指定为用户定义的例程和 DataBlade 例程添加的虚拟扩展段的大小。
下表列出了其他主题,它们说明如何估计内存中共享结构的大小。