估计共享内存虚拟部分的大小

可以使用公式来估计共享内存虚拟部分的初始大小。 在 SHMVIRTSIZE 配置参数中指定初始大小。

用于估计共享内存虚拟部分的初始大小的公式如下:
shmvirtsize = 固定开销 + 共享结构 +
            (mncs * 专用结构) +
            其他缓冲区

要使用上述公式估算 SHMVIRTSIZE 值:

  1. 估计公式的固定开销部分的值,如下所示:
    固定开销 = 全局池 + 引导后的线程池
    

    1. 运行 onstat -g mem 命令获取分配给会话的池大小。
    2. totalsize 值中减去 freesize 字段中的值即可得到分配给每个会话的字节数。
    3. 估计引导后的线程池 变量的值。 此变量部分地取决于虚拟处理器数。
  2. 使用以下公式来估计共享结构的值:
    共享结构 = AIO 向量 + 排序内存 +
                            数据库空间备份缓冲区 +
                            数据字典高速缓存大小 +
                            用户定义的例程高速缓存大小 +
                            直方图池 +
                            STMT_CACHE_SIZE(SQL 语句高速缓存)+
                            其他池(请参阅 onstat 显示。)
    
  3. 估计公式的下一部分,如下所示:
    1. 用以下公式估计 mncs 的值(其为并行会话的最大数量):
      mncs = 轮询线程数 * 每个轮询线程连接数

      轮询线程数的值是在 NETTYPE 配置参数的第 2 个字段中指定的值。

      每个轮询线程连接数的值是在 NETTYPE 配置参数的第 3 个字段中指定的值。

      在高峰处理期间运行 onstat -u 命令时,还可能会得到并发会话最大数的估计值。onstat -u 输出的最后一行包含最大的并发用户线程数。

    2. 估计专用结构 的值,如下所示:
      专用结构 = 堆栈 +  +                   会话控制块结构
      堆栈
      通常为 32 KB,但取决于用户定义例程中的递归。可以用 onstat -g sts选项来获取每个线程的堆栈大小。
      大约为 15 KB。使用 onstat -g stm 选项时,您可以获取 SQL 语句的堆大小。
      会话控制块结构
      每个会话使用的内存量。onstat -g ses选项在为每个会话标识列出的 total memory 列中显示内存量(以字节为单位)。
    3. 将步骤 3a 和 3b 的结果相乘以得到公式的以下部分:
      mncs * 专用结构
  4. 估计其他缓冲区的值,以说明分配给某些功能(例如,智能大对象的轻量级 I/O 操作)的专用缓冲区。每个用户大约 180 KB。
  5. 将步骤 1 到 4 的结果相加可获取 SHMVIRTSIZE 配置参数的估计值。
技巧: 当数据库服务器正以稳定的工作负载运行时,可以使用 onstat -g seg 来获取共享内存虚拟部分的实际大小的精确值。然后,您可以使用此命令报告的共享内存值来重新配置 SHMVIRTSIZE。

要为稍后添加到虚拟共享内存中的段指定大小,请设置 SHMADD 配置参数。使用 EXTSHMADD 配置参数可以指定为用户定义的例程和 DataBlade 例程添加的虚拟扩展段的大小。

下表列出了其他主题,它们说明如何估计内存中共享结构的大小。

表 1. 共享内存结构的信息
共享内存结构 更多信息
排序内存 估计排序所需的内存
数据字典高速缓存 数据字典配置
数据分布高速缓存(直方图池) 数据分发配置
用户定义的例程 (UDR) 高速缓存 存储在 UDR 高速缓存中的 SPL 例程可执行格式
SQL 语句高速缓存 启用 SQL 语句高速缓存 监视和调整 SQL 语句高速缓存
其他池 要查看分配给不同池的内存数量,可使用 onstat -g mem命令。