管理共享内存

  通过本文的学习,您将能够︰

  • 列出并描述数据库服务器的运行模式

  • 使用 onmodeoninit 改变运行模式

  • 描述数据库服务器使用的共享内存段

  • 描述影响共享内存大小的配置参数

  • 设置 RESIDENT 参数来控制共享内存驻留

  • 监控共享内存的主要组件

1. 服务器运行模式

数据库模式 说明    描述
Offline mode    脱机模式     服务器没有运行。没有分配共享内存。
Initialization mode    初始化模式 当服务器初始化时,并从脱机模式变到静止(默)模式过程中的一个过渡模式。
Recover mode    恢复模式 系统正在执行快速恢复 或着正从备份中恢复系统。快速恢复发生在从脱机到静默模式的改变过程中。
Quiescent mode 静默模式 oninit 进程正在运行,共享内存资源被分配,但系统不允许用户访问数据库。
Single-User mode 单用户模式 系统正在运行,并且只允许 sinodbms 用户有完全的访问权限。
Online mode 联机模式 该系统正在运行,并可供客户端访问。
Shutdown mode 关机模式 该系统正在运行,允许当前用户继续访问服务器,但不再允许新用户进行连接。

2. 标准服务器进程


  服务器使用多个 oninit 进程来进行自我维护。在正常操作期间,总有几个 oninit 进程在运行;为服务器配置的每个虚拟处理器都有一个这样的进程相对应。

  oninit 进程是以root用户来运行的。允许虚拟处理器以任务创建者的身份来运行任务是非常必要的。另外,因为 oninit 进程以root用户 来运行, 也额外带来了安全性方面的好处。除非用户具有root权限,否则任何用户都不能终止这些进程。

onstat 实用程序
  onstat 实用程序能够读取和报告服务器上共享内存结构的内容。onstat-g glo 选项会显示您每一个oninit 进程的信息,包括进程ID,虚拟处理器类,用户 CPU 和系统 CPU。

$ onstat -g glo

3. 初始化数据库服务器:oninit

语法:

oninit [-s][-i][-p][-j][-y][-version]

命令 说明
oninit 将服务器从脱机模式切换到联机模式
oninit -s 将服务器从脱机模式切换到静默模式
oninit -i 初始化root dbspace,并将服务器脱机模式切换到联机模式。
oninit -p 在共享内存初始化过程中,不搜索和删除临时表。
oninit -j 将服务器从脱机模式切换到单用户模式
oninit -y 自动对所有的提示符回答 yes
oninit -version 仅显示版本特定信息;不启动服务器

  您可以在系统命令行中使用 oninit 程序来改变服务器的运行模式。改变服务器模式的 oninit 选项如上所示。
  注意 : 为了在计算机系统重启后自动启动数据库服务器,可以将不带任何参数的oninit 命令,放置到系统的 startup(启动)文件中(在许多 UNIX 机器中是/etc/rc ),并确保在启动脚本中设置了相应的环境变量。

  一般情况下,-i 参数只应在首次创建数据库服务器或者如果您想从头开始重建服务器时使用。oninit -i 命令警告您如果继续,您的根数据库空间root dbspace将被覆盖,所有数据库都将丢失!

4. 更改服务器模式:onmode

语法:
onmode [-k][-m][-s][-u][-j][-y][-version]

命令 说明
onmode -k 执行立即关机,并将服务器从联机或静止(默)模式切换到脱机模式
onmode -m 将服务器从静止(默模式切换到联机模式
onmode -s 执行平稳关机,并将服务器从联机模式切换到静默模式。
onmode -u 执行立即关机,并将服务器从联机模式切换到静默模式。
onmode -y 自动对所有的提示符回答 yes
onmode -j 除了informix(仅 IDS V10),为所有的用户执行立即关机
onmode -version 仅显示版本特定信息;不改变服务器的模式

  您可以在系统命令行中使用 onmode 程序来改变服务器的运行模式。改变服务器模式的 onmode 选项如上所示。onmode 命令使用两种方法中的一种来关闭服务器:

  • 优雅关机是一种比较“友好”的方法。它允许现有用户可以继续工作,但拒绝对任何新用户的访问。当所有用户从服务器断开,它才会被置为静默模式。

  • 立即关机,会立即将服务器从联机模式切换到静默模式。这将终止所有当前的活跃用户进程,并回滚任何未结束的事务。

5.共享内存区

1695698481557

  数据库服务器初始化时会分配两个或三个共享内存区。实际上,所有星瑞格数据库都有一个驻留区(Resident Portion),虚拟区(Virtual Portion)以及缓冲区(Bufferpool Portion),当服务器被配置使用Shared memory 通信时,会另外分配一个消息区(Message Potion)。

  每个共享内存区都包括一个或多个共享内存段 。所分配的共享内存段的数量不仅取决于你对数据库onconfig配置参数的设置,也取决于内核参数的设置。

5.1 共享内存段

$ onstat -g seg

Sinoregal SinoDB Dynamic Server Version 16.8.FC8U0X3 -- On-Line -- Up 7 days 00:16:47 -- 1355616 Kbytes

Segment Summary:
id         key        addr             size             ovhd     class blkused  blkfree 
9535517    52564801   44000000         16449536         631048   R     4016     0       
9568286    52564802   44fb0000         1048576000       12289752 V     12853    243147  
9601055    52564803   837b0000         113287168        1        B     27658    0       
9633824    52564804   8a3ba000         43479040         1        B     10615    0       
9666593    52564805   8cd31000         166359040        1        B     40615    0       
Total:     -          -                1388150784       -        -     95757    243147  

   (* segment locked in memory)
No reserve memory is allocated

  使用onstat -g seg 命令查看已分配给数据库服务器的共享内存段的列表。下面是报告中所显示的字段描述:

说明
id 段的 id 号代表该段被分配的顺序。
key key 是数据库服务器在进行操作系统调用时,用来识别段的唯一值。动态服务器使用的共享内存键是以 SERVERNUM 配置参数的值为基础的。动态服务器生成唯一的共享内存键值的能力,使数据库服务器在同一台计算机系统上的多重驻留成为可能。
addr addr 字段是共享内存段用来分配共享内存结构的起始地址。该地址基于 SHMBASE 配置参数的值,它用于设定数据库服务器所分配的所有共享内存的起始地址值
size 这是分配给该共享内存段的内存大小。
ovhd ovhd 是在共享内存段内分配给用于维护段内容的结构的内存大小。
class 类是共享内存分区的类型:R 为驻留区,V 为虚拟区,B为缓冲区,M 为消息区。
blkused 这是共享内存段中已使用的内存量以4K为单位。
blkfree 这是在段中未使用的 内存数量,以4K为单位。

  在onconfig.std 文件中设置的 SHMBASE 值是基于该平台操作系统分配共享内存的方式而设立的。 SHMBASE 配置参数的值不可改变。

  在上面的示例中,驻留区分配了1个段,虚拟区分配了1个段,以及缓冲区分配了3个段。

  单个共享内存段的最大值,可分配给进程的最大共享内存段数,以及可分配给整个计算机系统的共享内存段的最大数量是由内核参数来决定的。有关这些参数的信息,请参阅动态服务器发行说明。

  分配给共享内存的共享内存段的数量和大小由内核参数的设置,服务器配置参数设置以及数据库服务器的活跃度来共同决定。

5.2 UNIX级共享内存

[root@vm84145 ~]# ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 131072     root       660        9052160    11         dest         
0x00000000 163841     root       660        103809024  11         dest         
0x00000000 196610     root       660        77594624   11         dest         
0x00000000 229379     root       660        72351744   11         dest         
0x52564801 14024708   root       660        23408640   15                      
0x52564802 14057477   root       660        2097152000 15                      
0x52564803 14090246   root       660        452349952  15                      
0x52564804 14123015   root       660        84439040   15                      
0x52564805 14155784   root       660        166359040  15                      
0x52564806 14188553   informix   660        8388608    15                     

  UNIX 的ipcs 命令可以用来检查共享内存段,和 在UNIX级分配的信号集。此命令可能并非在所有平台上都可用。

  ipcs 命令会打印当前活跃在操作系统上的共享内存资源的信息。对每种资i源,这条命令会显示:

说明
key 程序用于访问该资源的参数。
shmid 内存唯一标识符。
owner 所有者的登录名。服务器上的所有共享内存资源都归root和sinodbms所有。
perms 共享内存资源的权限。

  ipcs -m 命令会列出在您的计算机系统中所有的共享内存段。onstat -g seg 命令会列出这些段的一个子集;只有当前数据库服务器所使用的段才会被列出。为了从 ipcs -m 报告中找出某个特定数据库服务器的共享内存段,你需要知道该服务器所使用的每个共享内存段的键值。

数据库服务器共享内存的基准键值

  服务器共享内存的基准键值是 0x52564801。为了计算共享内存的键,应将 SERVERNUM 的值乘以 0x10000,并加上基准键值。例如,如果你的 SERVERNUM 值是 2 时,那么初始共享内存段的键值应该为 0x52564801 + (2 * 0x10000) = 0x52584801。当 SERVERNUM 值是 6 时,键值则为 0x525c4801。对于服务器上的每个附加段,只需将前面计算出来的键值简单地加 1 即可。

  onstat -g seg 命令会以十进制的格式显示共享内存键值。如需要将这些段与列在ipcs -m 报告中的那些段作比较,则需要将onstat –g seg显示的键值转换成十六进制。

6. 配置缓冲区

  SinoDB数据库允许使用多个缓冲池,需要为不同的页分配不同的缓冲池,每个都是通过一个 BUFFERPOOL 参数单独设置的。BUFFERPOOL 参数可以配置页面大小、缓冲区数目、 LRU 数目以及 LRU_MIN_DIRTY 和 LRU_MAX_DIRTY 参数的值。

LRUS

  LRUS 参数用来管理共享内存缓冲池的 LRU(最近最少使用) 队列的数量。onconfig.std 文件中 LRU 的缺省值是 8,最少可以只有 1 个队列,最多可以有 512 个队列。

7. 配置驻留区

  共享内存驻留区的大小是固定的,而且基于多种驻留区结构配置参数的设定。

LOGBUFF

  LOGBUFF 配置参数设置为服务器所需的三个逻辑日志缓冲区的大小。逻辑日志缓冲区的大小决定了在缓冲区被刷新到磁盘上的逻辑日志文件之前,内存最多可以容纳的事务数量。在onconfig.std文件中 LOGBUFF缺省值为 32 KB。

PHYSBUFF

  两个物理日志缓冲区的任何一个大小是由 PHYSBUFF 配置参数的设置决定的。物理日志缓冲区的大小决定了在缓冲区被刷新到磁盘上的物理日志文件之前,内存最多可以容纳的前映像页面数量。在 onconfig.std 文件中 PHYSBUFF 的缺省值是 32KB。

LOCKS

  LOCKS 配置参数为共享内存锁表的初始大小。如果锁表被填满,就会根据 LOCKS 参数的值,在共享内存虚拟区为锁表分配额外的空间。只有当内存重新被初始化时,锁表的自动空间分配才会停止。在 onconfig.std 文件中 LOCKS 的值是 2000,但你可以为你的服务器配置多达 1600万个锁。

  如果共享内存驻留区所需的总大小比内核参数所限制的单一段的最大值要大,那么数据库服务器会请求分配尽可能多的段,来满足驻留区的空间需求。

8. 强制驻留


  共享内存段并不一定在任何时间都能保证在计算机系统的物理内存中。系统对内存的需求可能会迫使操作系统将一些结构从物理内存交换到磁盘上。交换空间允许操作系统将可寻址存储器扩展为虚拟内存,既包括实际内存,又包括交换空间。操作系统将决定什么留在实际内存中,什么交换到磁盘上。

  一些操作系统提供称为强制驻留 的功能,允许高优先级的应用程序或段永远留在内存中,而不会被交换到磁盘。通过强制这些内存结构保留在内存中,内存到磁盘以及从磁盘到内存交换的开销得以被避免。

  动态服务器允许您强制把共享内存的驻留段和虚拟段永远驻留在实际内存中。将 RESIDENT 配置参数的值设置为 -1,来对驻留段和虚拟段实行强制驻留。将 RESIDENT 设置为0 来禁用强制驻留。将 RESIDENT 设置为一个整数,来表明要驻留的共享内存段数。

  共享内存段将按照被分配的顺序来进行驻留设置。

  强制驻留过多的共享内存段或者驻留的共享内存段非常大,会使得服务器上其他共享内存段或应用的可用内存空间不足。过度的非驻留区内存交换会导致性能低下。

  在服务器联机时,您可以通过以下的命令,来对驻留区进行强制驻留:

onmode -r

若要禁用强制驻留,请运行命令︰

onmode –n

9. 配置虚拟区

  动态服务器共享内存的虚拟区中单一结构的大小会因结构的不同而变化。因此,虚拟区本身的大小必须是一个变量。若要配置共享内存的虚拟区,您需要配置位于虚拟区的共享内存段的大小,而不是可变大小元素的大小。

SHMVIRTSIZE

  SHMVIRTSIZE 配置参数设置了所分配的第一个虚拟段的大小。如果 SHMVIRTSIZE超过了 内核参数对段大小的限制,那么系统就会分配多个段,直到达到 SHMVIRTSIZE 的大小需求。在 onconfig.std 文件中 SHMVIRTSIZE 的缺省值是 8000KB。SHMVIRTSIZE 的在32位平台上的最大值是 2GB,在64位平台上最大值为4TB。

  SHMVIRTSIZE 的值应设置地足够高,这样数据库服务器在正常操作期间就不会分配额外的段。在数据库服务器分配和维护附加段的代价是昂贵的;只分配一个虚拟段时的性能是最好的。但如果 SHMVIRTSIZE 设置的过高的话,电脑上其他活动可用的内存资源就会变少。

SHMADD

  SHMADD 参数设置的是每个在初始段之后分配给虚拟区的共享内存段的大小。在 onconfig.std 文件中 SHMADD 的缺省值是 8192 KB,其允许的最大值是 2GB。

  附加共享内存段应仅仅在高峰期进行分配。尝试配置 SHMADD,使得分配的附加共享内存段在高峰期能够满足对内存的要求。

SHMTOTAL

  SHMTOTAL 配置参数设置可分配给虚拟区的共享内存总量。将参数设置为 0,则表明没有最大限制。在 onconfig.std 文件中的缺省值就是 0。

  如果 SHMTOTAL 设置的过高的话,数据库服务器就会分配过多的共享内存,以至于计算机必须将内存中的数据交换到磁盘上。这样的结果是在计算机上的所有活动的性能都有所下降。如果 SHMTOTAL 设置的过低的话,数据库服务器就有可能在需要时无法为虚拟区分配内存段,其结果是,数据库服务器活动会被减缓或阻塞。

10.删除虚拟段

  服务器的活动会随时间而波动。在活动高峰期过后,你可能想要通过删除一些活动高峰期自动分配的虚拟区共享内存段来减少一些数据库服务器所使用的资源。将所有虚拟共享内存段尽可能合并到较少的段中,可运行下列命令:

onmode -F

  onmode -F 命令需要重新组织共享内存结构,来清空多余的段,因此命令执行期间数据库服务器的性能有可能下降。