共享内存大小

数据库服务器共享内存的每个部分都由一个或多个操作系统内存段组成,每个内存段分成一系列大小为 4 KB 的块,并由位图进行管理。

onstat 实用程序输出的标题行包含数据库服务器共享内存的大小(以 KB 表示)。您还可以使用 onstat -g seg 监视数据库服务器为共享内存的每一部分分配多少内存。有关如何使用 onstat 的信息,请参阅 GBase 8s 管理员参考

可以在 onconfig 文件中设置 SHMTOTAL 参数来限制数据库服务器可以在计算机或节点上安排的内存开销量。SHMTOTAL 参数指定数据库服务器可用于所有内存分配的共享内存总量。 然而,如果数据库服务器需要的内存量大于 SHMTOTAL 中设置的量,那么某些操作可能会失败。如果发生这种情况,数据库服务器会在消息日志中显示以下消息:
size of resident + virtual segments x + y > z 
total allowed by configuration parameter SHMTOTAL
此外,数据库服务器会将错误消息返回到已启动违规操作的应用程序中。例如,如果数据库服务器在尝试执行操作(例如,索引构建或散列连接)时需要的内存量大于在 SHMTOTAL 中指定的内存量,那么该服务器将向应用程序返回类似于以下某条消息的错误消息:
-567    Cannot write sorted rows.
-116    ISAM error: cannot allocate memory.

数据库服务器在发送了这些消息后会回滚任何由违规查询执行的部分结果。

内部操作(例如页清除程序或检查点活动)也会导致数据库服务器超过 SHMTOTAL 的上限。当发生这种情况时,数据库服务器会向消息日志发送一条消息: 例如,假设数据库服务器试图为页清除程序活动分配附加的内存但失败了。结果,数据库服务器会向消息日志发送类似于以下消息的信息:
17:19:13          Assert Failed: WARNING! No memory available for page cleaners
17:19:13          Who: Thread(11, flush_sub(0), 9a8444, 1)
17:19:13          Results: Database server may be unable to complete a checkpoint
17:19:13          Action: Make more virtual memory available to database server
17:19:13          See Also: /tmp/af.c4 

在数据库服务器通知您分配附加的内存失败后,该服务器会回滚导致其超过 SHMTOTAL 限制的事务。一经回滚,操作就不会再因为内存不足而失败,数据库服务器将继续如平常一样处理事务。