返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

相关命令
gs_dump,gs_restore

GBase 8c 工具参考手册
南大通用数据技术股份有限公司
153

数据库服务器线程通过一系列队列访问共享缓冲区,并且使用互斥和锁定来同步访问以及
保护数据。

FIFO/LRU 队列
缓冲区为高速缓存而容纳数据。
数据库服务器使用最近最少使用 (LRU) 队列来替换高速缓
存的数据。GBase 8s 还有一个先进先出 (FIFO) 队列。设置 LRU 队列数时,您实际上正
在设置 FIFO/LRU 队列数。
使用 BUFFERPOOL 配置参数可指定有关缓冲池的信息,包括要在数据库服务器共享内存
已设置时要创建的 LRU 队列数目的信息,还包括控制将共享内存缓冲区清空到磁盘的频
率的 lru_min_dirty 和 lru_max_dirty 的值信息。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 133 -
要提高事务吞吐量,请增加 lru_min_dirty 和 lru_max_dirty 值。然而,请勿更改
lru_min_dirty 和 lru_max_dirty 值之间的差额。
LRU 队列的组成部分
每个 LRU 队列由一对已链接的列表组成,如下所示:
 FLRU(可用的最近最少使用的)列表,它跟踪队列中可用的或未修改的页
 MLRU(已修改的最近最少使用的)列表,它跟踪队列中已修改的页
可用或未修改的页列表称为队列对的 FLRU 队列,而已修改的页列表称为 MLRU 队列。
这两个不同的列表使您无需在队列中搜索可用或未修改的页。下图说明了 LRU 队列的结
构。
图: LRU 队列



按最近最少使用的顺序排序的页
当数据库服务器处理对从磁盘读取页的请求时,它必须决定在内存中替换哪个页。 数据库
服务器不是随机选择一个页,而是假定最近引用的页比一些时间没有引用的页更有可能在
今后得到引用。因此,数据库服务器不会替换最近访问的页,而是替换最近最少访问的页。
通过维护按最近最少使用到最近最多使用顺序排序的页,数据库服务器可以方便地在内存
中定位最近最少使用的页。
LRU 队列和缓冲池管理
在处理开始之前,所有页缓冲区都是空的,并且每个缓冲区都由某个 FLRU 队列的条目代
表。这些缓冲区在 FLRU 队列中是平均分布的。要计算每个队列中的缓冲区的数目,请将
缓冲区总数除以 LRU 队列数。缓冲区和 LRU 队列的数目是在 BUFFERPOOL 配置参数
中指定的。
当需要用户线程来获取缓冲区时,数据库服务器将随机选择一个 FLRU 队列,并使用列表
中最旧的或最近最少使用的条目。如果可以锁存最近最少使用的页,该页将从队列中除去。

如果 FLRU 队列已锁定并且不能锁存结束页,
那么数据库服务器将随机选择另一个 FLRU
队列。
如果用户线程正在共享内存中搜索特定的页,那么将从存储在缓冲区表中的控制信息中获
取该页的 LRU 队列的位置。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 134 -
正在执行的线程在完成其工作后将释放缓冲区。如果该页已修改,那么缓冲区将放置在
MLRU 队列的最近最多使用的一端。如果已读取该页但未修改,那么缓冲区将返回到
FLRU 队列的最近最多使用的一端。有关如何监视 LRU 队列的信息,请参阅监视缓冲池
活动。
要配置的 LRU 队列数
配置多个 LRU 队列有两个用途:

它们将减少用户线程对队列的争用。

它们允许多个清除程序清空来自 LRU 队列的页并使脏页的百分比维持在可接受
的水平。
根据计算机上提供的 CPU 数目推荐 LRUS 的初始值。如果您的计算机是单处理器的,那
么一开始请将 BUFFERPOOL 配置参数中的 lrus 值设置为 4。如果您的计算机是多处理
器的,请使用以下公式:
LRUS = max(4, (number_CPU_VPs))
在为 BUFFERPOOL 配置参数中的 lrus 提供了初始值后,
请使用 onstat -R 监视 LRU 队
列。
如果发现脏 LRU 队列的百分比一直超过 lru_max_dirty 的指定值,
请增加为 lrus 指
定的值以添加更多的 LRU 队列。
例如,假设将 lru_max_dirty 设置为 70,并且一直发现有 75% 的 LRU 队列是脏的。请
考虑增加 lrus 的值。如果增加 LRU 队列的数目,就会缩短各个队列的长度,从而减少页
清除程序的工作。
然而,
您必须使用 CLEANERS 配置参数分配足够数量的页清除程序
(如
下一节中所说明)。保留 lru_max_dirty 和 lru_min_dirty 之间相同的差额。
要分配的清除程序数
通常必须为应用程序经常更新的每个磁盘都配置一个清除程序。但是,除此之外还必须考
虑 LRU 队列的长度以及检查点的频率,如以下各段中所说明。
除了 LRU 队列数不够之外,另外一个影响页清除程序数是否跟得上清除的页数的因素是
您是否分配了足够的页清除程序线程数。在一些队列 中,脏页的百分比可能超过指定给
lru_max_dirty 的BUFFERPOOL 值,
因为没有清除程序可用于清除这些队列。
一段时间过
后,页清除程序可能实在赶不上了,这时缓冲池将会比您在 lru_max_dirty 中指定的百分
比还要脏。
例如,假设 CLEANERS 参数已设置为 8,以及将 LRU 队列数从 8 增加到 12。您不能
指望性能会有多大的提升,
因为 8 个清除程序现在必须共享清除额外的 4 个队列的工作。
如果将 CLEANERS 的数值增加到 12,
那么单个清除程序就可以更加有效地清除现在已缩
短的队列中的每个队列。
将 CLEANERS 设置得太小会导致出现检查点时性能变差,因为页清除程序必须在检查点
期间将所有已修改的页清空到磁盘。如果不配置足够数量的页清除程序,那么检查点会花
费更长的时间,导致整体的性能变差。
有关更多信息,请参阅清空缓冲池缓冲区。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 135 -
已添加到 MLRU 队列的页数
页清除程序线程会定期将 MLRU 队列中已修改的缓冲区清空到磁盘。要指定清除开始的
点,请使用 BUFFERPOOL 配置参数指定 lru_max_dirty 的值。
通过指定页清除程序何时开始,
lru_max_dirty 值会限制可附加到 MLRU 队列的页缓冲区
数。lru_max_dirty 的初始设置是 60.00,因此页清除会在队列所管理的缓冲区的百分之六
十被修改时开始。
实际上,页清除程序可以在若干条件下开始,但只有其中一个条件是 MLRU 队列达到
lru_max_dirty 值的情况。
有关数据库服务器如何执行缓冲池清空的更多信息,
请参阅将数
据清空到磁盘。
以下示例显示 lru_max_dirty 的值如何应用于 LRU 队列以指定页清除程序何时开始,从
而限制 MLRU 队列中的缓冲区数。
Buffers specified as 8000
lrus specified as 8
lru_max_dirty specified as 60 percent

Page cleaning begins when the number of buffers in the MLRU
queue is equal to lru_max_dirty.

Buffers per lru queue = (8000/8) = 1000

Max buffers in MLRU queue and point at which page cleaning
begins: 1000 x 0.60 = 600
MLRU 清除结束
还可以指定 MLRU 清除可以结束的点。BUFFERPOOL 配置参数中的 lru_min_dirty 值
指定 MLRU 队列中缓冲区的可接受百分比。例如,如果将 lru_min_dirty 设置为 50.00,
那么当修改了 LRU 队列中 50% 的缓冲区时就不需要清除页了。 实际上,页清除可以根
据页清除程序线程的指令继续超过此点。
以下示例显示 lru_min_dirty 的值如何应用于 LRU 队列,以指定 MLRU 队列中缓冲区
的可接受百分比以及页清除结束的点。
Buffers specified as 8000
lrus specified as 8
lru_min_dirty specified as 50 percent

The acceptable number of buffers in the MLRU queue and
the point at which page cleaning can end is equal
to lru_min_dirty.

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 136 -

Buffers per LRU queue = (8000/8) = 1000

Acceptable number of buffers in MLRU queue and the point
at which page cleaning can end: 1000 x .50 = 500
可以对 lru_max_dirty 和 lru_min_dirty 值使用十进制。例如,如果把 lru_max_dirty 设
置为 1.0333 并且把 lru_min_dirty 设置为 1.0,那么将触发 LRU 在 3,100 脏缓冲区时
开始写并在 3,000 脏缓冲区时停止。
有关数据库服务器如何清空缓冲池的更多信息,请参阅将数据清空到磁盘。

预读操作
对于顺序表或索引扫描,可以将数据库服务器配置为在处理当前页的过程中预读多页。数
据库服务器将自动预读正在为查询处理的当前页的后面几页,除非禁用自动预读操作。预
读使应用程序能够更快地运行,因为它们将花费更少的时间等待磁盘 I/O。
自动预读取在连续扫描数据记录期间请求将页面放入缓冲池高速缓存,这可在服务器检测
到查询(包括 OLTP 查询和索引扫描)遇到 I/O 时提高查询的性能。
缺省情况下,数据库服务器将根据查询遇到来自磁盘的 I/O 的时间,自动确定何时发出预
读请求以及何时停止。

如果查询遇到 I/O,服务器将发出预读请求,以提高查询性能。因为预读请求通过
对相对于 CPU 处理速度较慢的 I/O 处理进行补偿,可以极大地提高数据库处理的
速度,所以使性能得到提升。

如果查询大部分已进行高速缓存,那么服务器将检测到没有执行任何 I/O,因此不
会预读。
使用 AUTO_READAHEAD 配置参数可更改查询的自动预读方式或禁用查询的自动预读。
您可以:

通过运行 onmode -wm 或 onmode -wf 命令,动态更改 AUTO_READAHEAD 配
置参数的值。

运行 SET ENVIRONMENT AUTO_READAHEAD 语句以更改方式,
或启用或禁用
会话的自动预读。
顺序数据或索引读取期间,只要数据库服务器检测到有必要执行预读,就会执行预读。
onconfig 文件中的 RA_PAGES 参数指定数据库服务器执行预读时,要从磁盘或索引读取
的页数。
RA_THRESHOLD 参数指定内存中导致数据库服务器执行另一个预读的未处理页的数量。
例如,如果 RA_PAGES 设置为 10,且 RA_THRESHOLD 为 4,那么数据库服务器将在
缓冲区中留有 4 个要处理的页时预读 10 个页。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 137 -
可以使用 onstat -p 命令来查看数据库服务器读取和写入,
并监视需要某个线程等待共享内
存锁存器的次数。RA-pgsused 输出字段显示数据库服务器预读使用的页数,并监视数据库
服务器对预读的使用。
使用 onstat -g rah 命令可显示有关预读请求的统计信息。

数据库服务器线程对缓存页的访问
数据库服务器使用共享锁定缓存以使多个数据库服务器线程能够在共享内存中同时访问相
同的缓冲区。
数据库服务器使用两种类型的缓冲区锁来提供此并发性,而不会在线程隔离时有所损失。
锁定访问的两个类型是共享和互斥。(有关更多信息,请参阅缓冲区锁定的类型。)

可在高可用性集群环境中配置服务器,以便在执行了主服务器故障转移之后继续处理事
务。
失败的主服务器以外的任何服务器上运行的事务将继续运行。请配置集群环境,以便:

在辅助服务器上运行的事务不受影响。

在成为主服务器的辅助服务器上运行的事务不受影响。

在失败的主服务器上运行的事务将终止。
目前对智能大对象、XA 事务发生故障转移之后,以及在辅助服务器上运行 DDL 语句时
发生故障转移之后,均不支持继续完成事务。
如果发生了故障转移,集群中的辅助服务器将临时暂挂正在运行的用户事务,直到新主服
务器开始运行。故障转移之后,辅助服务器会将保存的事务重新发送到新的主服务器。新
主服务器将恢复执行来自尚存的辅助服务器的事务。
运行分布式事务(跨多个数据库服务器的事务)时,出现故障时在主服务器上运行的任何
事务都将终止。
不管故障转移是自动的(使用连接管理器)还是手动的(通过指定服务器来充当新主服务
器),故障转移服务器都必须是具有集群中所有尚存服务器的最高级日志重放位置的服务
器。如果故障转移服务器没有最高级日志重放位置,那么集群中的所有事务都将终止并回
滚。
要实现最佳性能,请使用缺省的连接管理器故障转移配置:SDS+HDR+RSS,0(请参阅连
接管理)。
建议故障转移到 SD 辅助服务器,因为主服务器和 SD 辅助服务器从同一个物理磁盘读
取数据。
如果故障转移服务器是 HDR 辅助服务器,那么 SD 辅助服务器将关闭。
配置服务器以使事务在故障转移后完成
可使用 FAILOVER_TX_TIMEOUT 配置参数来配置高可用性集群中的服务器,以便在故
障转移之后完成事务。


GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 419 -
FAILOVER_TX_TIMEOUT 的值指示主服务器出现故障之后,回滚事务之前服务器等待的
最大秒数。请在集群中所有服务器上都设置相同的 FAILOVER_TX_TIMEOUT 值。例
如,要对事务完成指定 20 秒,请将 onconfig 文件中 FAILOVER_TX_TIMEOUT 配置
参数的值设置为 20。
要禁用故障转移之后完成事务,请在集群中的所有服务器上将 FAILOVER_TX_TIMEOUT
配置参数设置为 0。