目录
5.1. 内存 ¶
5.2. 磁盘 ¶
5.3. 内核资源使用 ¶
5.4. 基于代价的清理延迟 ¶
5.5. 后台写入器 ¶
5.6. 异步行为 ¶
5.7. 全局临时表 ¶
属性
描述
类型
integer
默认值
128MB
级别
KINGBASE---实例级
设置数据库服务器将使用的共享内存缓冲区量。默认通常是 128 兆字节( ),但是如果内核设置不支持(在initdb时决定),那么可以会更少。这个设置必须至少为 128 千字节( 的非默认值将改变最小值,最小值为BLCKSZ的16倍)。不过为了更好的性能,通常会使用明显高于最小值的设置。
如果有一个专用的 1GB 或更多内存的数据库服务器,一个合理的 开始值是系统内存的 25%。即使更大的 有效,也会造成一些工作负载, 但因为KingbaseES同样依赖操作系统的高速缓冲区,将 设置为超过 40% 的RAM不太可能比一个小点值工作得更好。为了能把对写大量新的或改变的数据的处理分布在一个较长的时间段内, 更大的设置通常要求对 也做相应增加。
如果系统内存小于 1GB,一个较小的 RAM 百分数是合适的,这样可以为操作系统留下足够的空间。
属性
描述
类型
enum
默认值
try
级别
KINGBASE---实例级
控制是否为主共享内存区域请求巨型页。有效值是 (默认)、 以及 。如果 被设置为 ,则服务器将尝试请求巨型页,但是如果失败会退回到默认的方式。如果为 ,请求巨型页失败将使得服务器无法启动。如果为 ,则不会请求巨型页。
当前,只有Linux和Windows上支持这个设置。在其他系统上这个参数被设置为 时,它会被忽略。
巨型页面的使用会导致更小的页面表以及花费在内存管理上的 CPU 时间更少,从而提高性能。
巨型页在Windows上被称为大页面。要使用大页面,需要为运行KingbaseES的Windows用户账号分配Lock Pages in Memory的用户权限。可以使用Windows的组策略工具(gpedit.msc)来分配用户权限Lock Pages in Memory。为了在命令窗口以单进程(而不是Windows服务)的方式启动数据库服务器,命令窗口必须以管理员身份运行或者禁用用户访问控制(UAC)。当UAC被启用时,普通的命令窗口会在启动时收回用户权限Lock Pages in Memory。
注意这种设置仅影响主共享内存区域。Linux、FreeBSD以及Illumos之类的操作系统也能为普通内存分配自动使用巨型页(也被称为“超级”页或者“大”页面),而不需要来自KingbaseES的显式请求。在Linux上,这被称为“transparent huge pages”(THP,透明巨型页)。已知这种特性对某些Linux版本上的某些用户会导致KingbaseES的性能退化,因此当前并不鼓励使用它(与 的显式使用不同)。
属性
描述
类型
integer
默认值
8MB
级别
USER---用户级
设置每个数据库会话使用的临时缓冲区的最大数目。这些都是会话的本地缓冲区,只用于访问临时表。默认是 8 兆字节( )。这个设置可以在独立的会话内部被改变,但是只有在会话第一次使用临时表之前才能改变; 在会话中随后企图改变该值是无效的。
一个会话将按照 给出的限制根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值, 其开销只是一个缓冲区描述符,或者说 每增加一则增加大概 64 字节。不过,如果一个缓冲区被实际使用,那么它就会额外消耗 8192 字节(或者 字节)。
属性
描述
类型
integer
默认值
0
级别
KINGBASE---实例级
设置可以同时处于“prepared”状态的事务的最大数目。把这个参数设置 为零(这是默认设置)将禁用预备事务特性。这个参数只能在服务器启动时设置。
如果不使用预备事务,可以把这个参数设置为零来防止意外创建预备事务。如果正在使用预备事务,需要把 至少设置为 max_connections 一样大,因此每一个会话可以有一个预备事务待处理。
当运行一个后备服务器时,这个参数必须至少与主服务器上的一样大。否则,后备服务器上将不会执行查询。
属性
描述
类型
integer
默认值
4MB
级别
USER---用户级
指定在写到临时磁盘文件之前被内部排序操作和哈希表使用的内存量。该值默认为四兆字节( )。注意对于一个复杂查询, 可能会并行运行好几个排序或者哈希操作;每个操作都会被允许使用这个参数指定的内存量,然后才会开始写数据到临时文件。同样,几个正在运行的会话可能并发进行这样的操作。因此被使用的总内存可能是 值的好几倍,在选择这个值时一定要记住这一点。 、 和归并连接都要用到排序操作。哈希连接、基于哈希的聚集以及基于哈希的 子查询处理中都要用到哈希表。
属性
描述
类型
integer
默认值
64MB
级别
USER---用户级
指定在维护性操作(例如 、 和 )中使用的 最大的内存量。其默认值是 64 兆字节( )。因为在一个数据库会话中,一个时刻只有一个这样的操作可以被执行,并且一个数据库安装通常不会有太多这样的操作并发执行, 把这个数值设置得比 大很多是安全的。 更大的设置可以改进清理和恢复数据库转储的性能。
注意当自动清理运行时,可能会分配最多达这个内存的 autovacuum_max_workers 倍,因此要小心不要把该默认值设置得太高。 通过独立地设置 autovacuum_work_mem 可能会对控制这种情况 有所帮助。
属性
描述
类型
integer
默认值
-1
级别
SIGHUP---会话级
指定每个自动清理工作者进程能使用的最大内存量。其默认值为 -1,表示转而使用 maintenance_work_mem 的值。当运行在其他上下文环境中时, 这个设置对 的行为没有影响。
属性
描述
类型
integer
默认值
2MB
级别
SUPERUSER---超级用户级
指定服务器的执行堆栈的最大安全深度。这个参数的理想设置是由内核强制的实际栈尺寸限制 ( 所设置的或者本地等价物),减去大约一兆字节的安全边缘。 需要这个安全边缘是因为在服务器中并非所有例程都检查栈深度,只是在关键的可能递规的 例程中才进行检查。默认设置是两兆字节( ), 这个值相对比较小并且不可能导致崩溃。但是,这个值可能太小了,以至于无法执行复杂的 函数。只有超级用户可以修改这个设置。
把 参数设置得高于实际的内核限制将意味着一个失控的递归函数可能会导致一个独立的后端进程崩溃。 在KingbaseES能够检测内核限制的平台上, 服务器将不允许把这个参数设置为一个不安全的值。不过,并非所有平台都能提供该信息,因此要小心设置此值。
属性
描述
类型
enum
默认值
mmap
级别
KINGBASE---实例级
指定服务器应该用于主共享内存区域的共享内存实现,该区域包含KingbaseES的共享缓冲区和其他共享数据。可能的值是 (为匿名共享内存分配使用 ), (为系统V分配共享内存 )和 (为Windows共享内存)。并非所有平台都支持所有值;第一个受支持的选项是该平台的默认选项。使用 选项在任何平台上都不是默认的,这通常是不鼓励的,因为它通常需要非默认的内核设置来允许大量的分配(参考 系统全局区配置 ).
属性
描述
类型
enum
默认值
posix
级别
SUPERUSER---超级用户级
指定服务器应该使用的动态共享内存实现。可能的值是 (用于使用 分配的 POSIX 共享内存)、 (用于通过 分配的 System V 共享内存)、 (用于 Windows 共享内存)、 (使用存储在数据目录中的内存映射文件模拟共享内存)。并非所有平台上都支持所有值,平台上第一个支持的选项就是其默认值。 在任何平台上 选项都不是默认值,通常不鼓励使用它,因为操作系统会 反复地把修改过的页面写回到磁盘上,从而增加了系统的I/O负载。不过当 目录被存储在一个 RAM 盘时或者没有其他共享内存功能可用时, 它还是有用的。
属性
描述
类型
integer
默认值
65535B
级别
USER---用户级
设置Copy From刷新缓冲区的大小。如果存储的元组的大小超过设置的缓冲区大小,则刷新缓冲区,将数据写入相应的表中。
属性
描述
类型
integer
默认值
-1
级别
SUPERUSER---超级用户级
指定一个进程能用于临时文件(如排序和哈希临时文件,或者用于保持游标的存储文件)的最大磁盘空间量。一个试图超过这个限制的事务将被取消。这个值以千字节计,并且 (默认值)意味着没有限制。只有超级用户能够修改这个设置。
这个设置约束着一个给定KingbaseES进程在任何瞬间所使用的所有临时文件的总空间。应该注意的是,与在查询执行中在幕后使用的临时文件相反,显式临时表所用的磁盘空间不被这个设置所限制。
属性
描述
类型
integer
默认值
1000
级别
KINGBASE---实例级
设置每个服务器子进程允许同时打开的最大文件数目。默认是 1000 个文件。如果内核强制一个安全的针对每个进程的限制,则不需要设置此值。但是在 一些平台上(特别是大多数 BSD 系统),如果很多进程都尝试打开很多文件,内核将允许独立进程打开比个系统真正可以支持的数目大得多得文件数。如果返回“Too many open files”这样的失败提示信息,可尝试减小这个设置。这个参数只能在服务器启动时设置。
在 VACUUM 和 ANALYZE 命令的执行过程中,系统维持着一个内部计数器来跟踪各种被执行的I/O操作的估算开销。当累计的代价达到一个限制(由 指定),执行这些操作的进程将按照 所指定的休眠一小段时间。然后它将重置计数器并继续执行。
这个特性的出发点是允许管理员降低这些命令对并发的数据库活动产生的I/O影响。在很多情况下, 和 等维护命令能否快速完成并不重要,而非常重要的是这些命令不会对系统执行其他数据库操作的能力产生显著的影响。基于代价的清理延迟提供了一种方式让管理员能够保证这一点。
对于手动发出的 命令,该特性默认被禁用。要启用它,只要把 变量设为一个非零值。
属性
描述
类型
real
默认值
0
级别
USER---用户级
进程超过代价限制后将休眠的时间长度,以毫秒计。其默认值为0, 这将禁用基于代价的清理延迟特性。正值将启用基于代价的清理。
在使用基于代价的清理时, 的合适值通常很小,可能不到1毫秒。虽然可以将 设置为毫秒级的值,但是在较老的平台上可能无法准确地测量这种延迟。在这样的平台上,增加 的节流资源消耗超过1ms需要改变其他的真空成本参数。尽管如此,也应该保持 的大小与平台一致;大的延迟是没有帮助的。
属性
描述
类型
integer
默认值
1
级别
USER---用户级
清理一个在共享缓存中找到的缓冲区的估计代价。它表示锁住缓冲池、查找共享哈希表和扫描页内容的代价。默认值为1。
属性
描述
类型
integer
默认值
10
级别
USER---用户级
清理一个必须从磁盘上读取的缓冲区的代价。它表示锁住缓冲池、查找共享哈希表、从磁盘读取需要的块以及扫描其内容的代价。默认值为10。
属性
描述
类型
integer
默认值
20
级别
USER---用户级
当清理修改一个之前干净的块时需要花费的估计代价。它表示再次把脏块刷出到磁盘所需要的额外I/O。默认值为20。
属性
描述
类型
integer
默认值
200
级别
USER---用户级
将导致清理进程休眠的累计代价。默认值为200。
注意
有些操作会保持关键性的锁,这样可以尽快完成。基于代价的清理延迟在这类操作期间不会发生。因此有可能代价会累计至大大超过指定的限制。
有一个独立的服务器进程,叫做 后台写入器 ,它的功能就是发出写“脏”(新的或修改过的)共享缓冲区的命令。它写出共享缓冲区,这样让处理用户查询的服务器进程很少或者永不等待写动作的发生。不过,后台写入器确实会增加 I/O 的总负荷,因为虽然在每个检查点间隔中一个重复弄脏的页面可能只会写出一次,但在同一个间隔中后台写入器可能会把它写出好几次。在这一小节讨论的参数可以被用于调节本地需求的行为。
属性
描述
类型
integer
默认值
200ms
级别
SIGHUP---会话级
指定后台写入器活动轮次之间的延迟。在每个轮次中,写入器都会为一定数量的脏缓冲区发出写操作(可以用下面的参数控制)。然后它就休眠 毫秒, 然后重复动作。默认值是 200 毫秒( )。注意在许多系统上,休眠延迟的有效解析度是 10 毫秒;因此,为 设置一个 不是 10 的倍数的值与把它设置为下一个更高的 10 的倍数是一样的效果。这个选项只能在服务器命令行上或者在 文件中设置。
属性
描述
类型
integer
默认值
100
级别
SIGHUP---会话级
在每个轮次中,不超过这么多个缓冲区将被后台写入器写出。把这个参数设置为零可禁用后台写出(注意被一个独立、专用辅助进程管理的检查点不受影响)。默认值是 100 个缓冲区。这个参数只能在 文件中或在服务器命令行上设置。
属性
描述
类型
real
默认值
2.0
级别
SIGHUP---会话级
每一轮次要写的脏缓冲区的数目基于最近几个轮次中服务器进程需要的新缓冲区的数目。 最近所需的平均值乘以 可以估算下一轮次中将会需要的缓冲区数目。脏缓冲区将被写出直到有很多干净可重用的缓冲区(然而,每一轮次中写出的缓冲区数不超过 )。 因此,设置为 1.0 表示一种“刚刚好的”策略,这种策略会写出正好符合预测值的数目的缓冲区。 更大大的值可以为需求高峰提供某种缓冲,而更小的值则需要服务进程来处理一些写出操作。默认值是 2.0。这个参数只能在 文件中或在服务器命令行上设置。
属性
描述
类型
integer
默认值
8KB
级别
SIGHUP---会话级
不管何时 bgwriter 写入了超过 字节,尝试强制 OS 把这些写发送到底层存储上。这样做将限制内核页缓存中脏数据的量,降低了在检查点末尾发出一个 fsync 时或者 OS 在后台大批量写回数据时卡住的可能性。那常常会导致大幅度压缩的事务延迟,但是也有一些情况(特别是负载超过 shared_buffers 但小于 OS 页面高速缓存)的性能会降低。这种设置可能会在某些平台上没有效果。合法的范围在 (禁用受控写回)和 之间。Linux 上的默认值是 ,其他平台上是 (如果 不是8kB,则默认值和最大值会按比例缩放至这个值)。这个参数只能在 文件中或者服务器命令行上设置。
较小的 和 可以降低由后台写入器造成的额外 I/O 开销。但更可能的是,服务器进程将必须自己发出写入操作,这会延迟交互式查询。
属性
描述
类型
integer
默认值
1
级别
USER---用户级
设置KingbaseES可以同时被执行的并发磁盘 I/O 操作的数量。调高这个值,可以增加任何单个KingbaseES会话试图并行发起的 I/O 操作的数目。 允许的范围是 1 到 1000,或 0 表示禁用异步 I/O 请求。当前这个设置仅影响位图堆扫描。
对于磁盘驱动器,这个设置的一个很好的出发点是组成一个被用于该数据库的 RAID 0 条带或 RAID 1 镜像的独立驱动器数量(对 RAID 5 而言,校验驱动器不计入)。但是, 如果数据库经常忙于在并发会话中发出的多个查询,较低的值可能足以使磁盘阵列繁忙。比保持磁盘繁忙所需的值更高的值只会造成额外的 CPU 开销。SSD 以及其他基于内存的存储常常能处理很多并发请求,因此它们的最佳值可能是数百。
异步 I/O 依赖于一个有效的 函数(一些操作系统可能没有)。 如果不存在这个函数,将这个参数设置为除 0 之外的任何东西将导致错误。在一些操作系统上(如Solaris)虽然提供了这个函数,但它不会做任何事情。
在支持的系统上默认值为 1,否则为 0。对于一个特定表空间中的表,可以通过设定该表空间的同名参数(见 ALTER TABLESPACE )可以覆盖这个值。
属性
描述
类型
integer
默认值
8
级别
KINGBASE---实例级
设置系统能够支持的后台进程的最大数量。这个参数只能在服务器启动时设置。默认值为 8。
在运行一个后备服务器时,必须把这个参数设置为等于或者高于主控服务器上的值。否则, 后备服务器上可能不会允许查询。
在更改这个值时,考虑也对 max_parallel_workers 、max_parallel_maintenance_workers 以及 max_parallel_workers_per_gather 进行调整。
属性
描述
类型
integer
默认值
2
级别
USER---用户级
设置单个 或者 节点能够开始的工作者的最大数量。并行工作者会从 max_worker_processes 建立的进程池中取得,数量由 max_parallel_workers 限制。注意所要求的工作者数量在运行时可能实际无法被满足。如果这种事情发生,该计划将会以比预期更少的工作者运行,这可能会不太高效。默认值是2。把这个值设置为 0将会禁用并行查询执行。
注意并行查询可能消耗比非并行查询更多的资源,因为每一个工作者进程时一个完全独立的进程,它对系统产生的影响大致和一个额外的用户会话相同。在为这个设置选择值时,以及配置其他控制资源利用的设置(例如 work_mem)时,应该把这个因素考虑在内。 之类的资源限制会被独立地应用于每一个工作者,这意味着所有进程的总资源利用可能会比单个进程时高得多。例如,一个使用 4 个工作者的并行查询使用的 CPU 时间、内存、I/O 带宽可能是不使用工作者时的 5 倍之多。
属性
描述
类型
integer
默认值
2
级别
USER---用户级
设置单一工具性命令能够启动的并行工作者的最大数目。当前,唯一一种支持使用并行工作者的工具性命令是 ,并且只有在构建B-树索引时才能并行。并行工作者从由 max_worker_processes 创建的进程池中取出,数量由 max_parallel_workers 控制。注意实际在运行时所请求数量的工作者可能不可用。如果发生这种情况,工具性操作将使用比预期数量少的工作者运行。默认值为2。将这个值设置为0可以禁用工具性命令对并行工作者的使用。
注意并行工具性命令不应该消耗比同等数量非并行操作更多的内存。这种策略与并行查询不同,并行查询的资源限制通常是应用在每个工作者进程上。并行工具性命令把资源限制 当作对整个工具性命令的限制,而不管其中用到了多少个并行工作者进程。不过,并行工具性命令实际上可能仍会消耗更多的CPU资源和I/O带宽。
属性
描述
类型
integer
默认值
8
级别
USER---用户级
设置系统为并行操作所支持的工作者的最大数量。默认值为8。在增加或者减小这个值时,也要考虑对 max_parallel_maintenance_workers 以及 max_parallel_workers_per_gather 进行调整。此外,要注意将这个值设置得大于 max_worker_processes 将不会产生效果,因为并行工作者进程都是从 max_worker_processes 所建立的工作者进程池中取出来的。
属性
描述
类型
integer
默认值
0
级别
USER---用户级
只要一个后端写入了超过 字节,就会尝试强制 OS 把这些写发送到底层存储。这样做将会限制内核页高速缓存中的脏数据数量,降低在检查点末尾发出 时或者 OS 在后台大批写回数据时卡住的可能性。这常常会导致极大降低的事务延迟,但是也有一些情况中(特别是负载超过 shared_buffers 但低于 OS 的页面高速缓存时),性能可能会下降。这个设置可能在某些平台上没有效果。合法的范围位于 (禁用受控写回)和 之间。默认是 (即没有强制写回)。(如果 不是8kB,最大值会按比例缩放到它)。
属性
描述
类型
integer
默认值
-1
级别
KINGBASE---实例级
设置在使用快照时,一个快照可以被使用而没有发生 错误风险的最小时间。这个参数只能在服务器启动时设置。
如果超过该阈值,旧数据将被清理掉。这可以有助于阻止长时间使用的快照造成的快照膨胀。为了阻止由于本来对该快照可见的数据被清理导致的不正确结果,当快照比这个阈值更旧并且该快照被用来读取一个该快照建立以来被修改过的页面时,将会产生一个错误。
值为 会禁用这个特性,并且这个值是默认值。对于生产工作有用的值可能从几个小时到几天。该设置将被转换成分钟粒度,并且小数字(例如 或者 )被允许只是因为它们有时对于测试有用。虽然允许高达 的设置,但是请注意很多负载情况下,很短的时间帧里就可能发生极大的膨胀或者事务 ID 回卷。
当这个特性被启用时,关系末尾的被清出的空间不能被释放给操作系统,因为那可能会移除用于检测 情况所需的信息。所有分配给关系的空间还将与该关系关联在一起便于重用,除非它们被显式地释放(例如,用 )。
这个设置不会尝试保证在任何特殊情况下都会生成错误。事实上,如果(例如)可以从一个已经物化了一个结果集的游标中生成正确的结果,即便被引用表中的底层行已经被清理掉也不会生成错误。某些表不能被过早地安全清除,并且因此将不受这个设置的影响,例如系统目录。对于这些表,这个设置将不能降低膨胀,也不能降低在扫描时产生 错误的可能性。
属性
描述
类型
integer
默认值
32
级别
KINGBASE---实例级