更新时间:2024-12-19 GMT+08:00
分享

锁管理

GaussDB中,并发执行的事务由于竞争资源会导致死锁。本节介绍的参数主要管理事务锁的机制。

deadlock_timeout

参数说明:设置死锁超时检测时间。当申请的锁超过设定值时,系统会检查是否产生了死锁。该参数仅针对常规锁生效。该参数可在PDB级别设置。

参数类型:整型

参数单位:ms(毫秒)

取值范围:1 ~ 2147483647

默认值:1000(即1s)。在PDB场景内,若未设置该参数,则继承来自全局的设置。

设置方式:该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。

设置建议:

  • 死锁的检查代价是比较高的,服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中,不经常出现死锁情况,因此在检查死锁前只需等待一个相对较短的时间。deadlock_timeout增加,可以减少死锁检查浪费的时间,但是会减慢真正的死锁错误报告的速度。在负载过重的服务器上,用户可能需要增大deadlock_timeout。这个值的设置应该超过事务持续时间,这样可以减少在锁释放之前就开始死锁检查的问题。
  • 当设置log_lock_waits为on时,deadlock_timeout决定一个等待时间来将查询执行过程中的锁等待耗时信息写入日志。如果要研究锁延时情况,可以设置deadlock_timeout值比正常情况小。

设置不当的风险与影响:设置过大时,会减慢死锁错误报告的速度;设置过小时,会出现锁释放前就开始检测死锁的问题。

lockwait_timeout

参数说明:控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。该参数仅针对常规锁生效。该参数可在PDB级别设置。

参数类型:整型

参数单位:ms(毫秒)

取值范围:0 ~ 2147483647

默认值:1200000(20min)。在PDB场景内,若未设置该参数,则继承来自全局的设置。

设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。例如,不带单位取值900,表示lockwait_timeout为900ms;带单位取值20min,表示lockwait_timeout为20min。取值如果要带单位,必须为ms、s、min、h、d。

设置建议:一般设置为默认值。根据业务需要,业务需要锁冲突超过多久,该参数就设置多少。

设置不当的风险与影响:设置过大时,锁冲突造成的阻塞时间更长;设置过小时,可能会出现更多的锁超时报错。

update_lockwait_timeout

参数说明:在业务允许并发更新的情况下,该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。该参数仅针对常规锁生效。该参数可在PDB级别设置。

参数类型:整型

参数单位:ms(毫秒)

取值范围:0 ~ 2147483647

默认值:120000(2min)。在PDB场景内,若未设置该参数,则继承来自全局的设置。

设置方式:该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。例如,不带单位取值900,表示update_lockwait_timeout为900ms;带单位取值2min,表示update_lockwait_timeout为2min。取值如果要带单位,必须为ms、s、min、h、d。

设置建议:设置值主要取决于并发更新同一行的事务的workload。一般TP业务,执行时间较短小于两分钟,因此等待并发更新事务提交时间较短,按默认值2min的配置误报锁超时概率较小;如果业务出现大量并发更新同一行事务,执行时间超过两分钟,可以调大该参数避免等锁超时误报。

设置不当的风险与影响:设置过大时,并发更新同一行时锁冲突造成的阻塞时间更长;设置过小时,可能会出现更多的锁超时报错。

max_locks_per_transaction

参数说明:当数据库连接数达到最大时,每个事务能够持有对象锁的平均数量。

这个参数并不严格限制每个事务最多可以持有多少对象锁。如果连接数没有达到最大值max_connections,那么每个事务能够持有对象锁的平均数量会增大。

参数类型:整型

参数单位:

取值范围:10 ~ 2147483647

默认值:256(196核CPU/1536G内存,128核CPU/1024G内存,104核CPU/1024G内存,96核CPU/1024G内存,96核CPU/768G内存,80核CPU/640G内存,64核CPU/512G内存,60核CPU/480G内存,32核CPU/256G内存,16核CPU/128G内存,8核CPU/64G内存,4核CPU/32G内存);64(4核CPU/16G内存)。

设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。

设置建议:

  • 共享锁的哈希表大小是以假设任意时刻最多只有max_locks_per_transaction*(max_connections+max_prepared_transactions) 个独立对象需要被锁住为基础进行计算的,进而推导出max_locks_per_transaction >= 业务事务的并发数 * 业务的每个事务加对象锁的数目/(max_connections+max_prepared_transactions) ,但该参数不能超过取值范围的上限。
  • 不超过设定数量的多个对象可以在任意时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个参数值。
  • 增大这个参数可能导致GaussDB请求更多的System V共享内存,有可能超过操作系统的缺省配置,导致数据库启动失败。
  • 当运行备机时,请将此参数设置不小于主机上的值,否则在备机上查询操作不被允许。
  • 设置该参数变小后,若在重启前备机节点故障,则该备机会故障恢复失败。建议参数设置回原值后重启恢复环境。

设置不当的风险与影响:设置过大时,可能导致数据库启动失败。

max_pred_locks_per_transaction

参数说明:当数据库连接数达到最大时,每个事务能够持有断定锁的平均数量。

这个参数并不严格限制每个事务最多可以持有多少断定锁。如果连接数没有达到最大值max_connections,那么每个事务能够持有断定锁的平均数量会增大。

参数类型:整型

参数单位:

取值范围:10 ~ 2147483647

默认值:64

设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。

设置建议:

  • 共享的断定锁表的大小是以假设任意时刻最多只有max_pred_locks_per_transaction*(max_connections+max_prepared_transactions) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在服务器启动的时候设置。
  • 增大这个参数可能导致GaussDB请求更多的System V共享内存,有可能超过操作系统的缺省配置。

设置不当的风险与影响:设置过大时,可能导致数据库启动失败。

gs_clean_timeout

参数说明:控制主节点调用gs_clean工具的周期,可用来定时清理临时表。数据库连接异常中止时,通常会有临时表残留,此时需要对数据库中的临时表进行清理。

参数类型:整型

参数单位:s(秒)

取值范围:0 ~ 2147483

默认值:60

设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。例如:不带单位取值1,表示gs_clean_timeout为1s;带单位取值1min,表示gs_clean_timeout为1min。取值如果要带单位,必须为s、min、h、d。

设置建议:推荐使用默认值。

设置不当的风险与影响:设置过大时,会使数据库残留临时表清理周期延长。

partition_lock_upgrade_timeout

参数说明:在执行某些查询语句的过程中,需要将分区表上的锁级别由允许读的ExclusiveLock级别升级到读写阻塞的AccessExclusiveLock级别。如果此时已经存在并发的读事务,那么该锁升级操作将阻塞等待。partition_lock_upgrade_timeout为尝试锁升级的等待超时时间。该参数可在PDB级别设置。

举例:在分区表上进行MERGE PARTITION和CLUSTER PARTITION操作时,都利用了临时表进行数据重排和文件交换,为了最大程度提高分区上的操作并发度,在数据重排阶段给相关分区加锁ExclusiveLock,在文件交换阶段加锁AccessExclusiveLock。加锁方式是尝试性加锁,加锁成功了则立即返回,不成功则等待50ms后继续下次尝试,加锁超时时间使用会话级设置参数partition_lock_upgrade_timeout。

参数类型:整型

参数单位:s(秒)

取值范围:-1 ~ 3000。-1表示无限等待,即不停地尝试锁升级,直到加锁成功。

默认值:1800。在PDB场景内,若未设置该参数,则继承来自全局的设置。

设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:设置为-1时,长时间无法升级锁可能导致业务阻塞。

fault_mon_timeout

参数说明:轻量级死锁检测周期。

参数类型:整型

参数单位:min(分钟)

取值范围:0 ~ 1440

默认值:5

设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:设置过大时,会无法及时发现死锁问题而减慢死锁错误报告的速度。

enable_online_ddl_waitlock

参数说明:控制DDL是否会阻塞等待pg_advisory_lock等数据库锁。

参数类型:布尔型

参数单位:

取值范围:

  • on:表示开启。
  • off:表示关闭。

默认值:off

设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。

设置建议:主要用于OM在线操作场景,不建议用户设置。

设置不当的风险与影响:修改该参数取值可能导致数据库出现意料之外的结果,请保持默认值。

xloginsert_locks

参数说明:控制用于并发写预写式日志锁的个数。主要用于提高写预写式日志的效率。

参数类型:整型

参数单位:

取值范围:1 ~ 1000。若CPU为NUMA架构,数值必须为NUMA节点数量的整数倍。

默认值:16

设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。

设置建议:ARM CPU架构在并发压力大的场景下,可能因为原子操作的竞争而导致概率性的性能抖动,可以适当降低该参数值而获取相对稳定的运行性能。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

num_internal_lock_partitions

参数说明:控制内部轻量级锁分区的个数。主要用于各类场景的性能调优。

  • 参数内容以关键字和数字的KV方式组织,各个不同类型锁之间以逗号隔开。
  • 先后顺序对设置结果不影响。例如"CLOG_PART=256,CSNLOG_PART=512"等同于"CSNLOG_PART=512,CLOG_PART=256"。
  • 重复设置同一关键字时,以最后一次设置为准。例如"CLOG_PART=256,CLOG_PART=2",设置的结果为CLOG_PART=2。

参数类型:字符串

参数单位:

取值范围:

  • CLOG_PART:CLOG文件控制器的个数。最小值为1,最大值为256。
  • CSNLOG_PART:CSNLOG文件控制器的个数。最小值为1,最大值为512。
  • LOG2_LOCKTABLE_PART:常规锁表锁分区个数的2对数。最小值4,即锁分区数为16;最大值为16,即锁分区数为65536。
  • FASTPATH_PART:每个线程可以不通过主锁表拿锁的最大锁个数。最小值为20,最大值为10000。

默认值:

"CLOG_PART=256,CSNLOG_PART=512,LOG2_LOCKTABLE_PART=4,FASTPATH_PART=20"(196核CPU/1536G内存,128核CPU/1024G内存,104核CPU/1024G内存,96核CPU/1024G内存,96核CPU/768G内存,80核CPU/640G内存,64核CPU/512G内存,60核CPU/480G内存,32核CPU/256G内存,16核CPU/128G内存,8核CPU/64G内存,4核CPU/32G内存);"CLOG_PART=8,CSNLOG_PART=16,LOG2_LOCKTABLE_PART=4,FASTPATH_PART=20"(4核CPU/16G内存)。

设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。

设置建议:

  • CLOG_PART:增大该值可以提高CLOG日志写入效率,提升事务提交性能,但是会增大内存使用;减小该值会减少相应内存使用,但可能使得CLOG日志写入冲突变大,影响性能。
  • CSNLOG_PART:增大该值可以提高CSNLOG日志写入效率,提升事务提交性能,但是会增大内存使用;减小该值会减少相应内存使用,但可能使得CSNLOG日志写入冲突变大,影响性能。
  • LOG2_LOCKTABLE_PART:增大该值可以提升正常流程常规锁获取锁的并行度,但是会增大内存使用,对于等待事件在LockMgrLock时,可以调大该锁增加性能。
  • FASTPATH_PART:对于分区表读取、更新、插入、删除操作且等待事件在LockMgrLock时,可以通过调大该值避免获取LockMgrLock提升性能,建议调整数量大于等于分区数*(1+本地索引数量)+全局索引数量+10,调大该值可能增加锁转移和锁消除时的耗时,并会额外增加内存。fastpath增量内存=((fastpath增加量/20)*8 + fastpath增加量*12) * 线程池大小,单位是字节。

设置不当的风险与影响:设置不当可能会影响数据库性能。

enable_wait_exclusive_lock

参数说明:控制ProcArrayLock的排他锁hang死检测与治愈功能的开关。

参数类型:布尔型

参数单位:

取值范围:

  • on:表示开启。
  • off:表示关闭。

默认值:on

设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

barrier_lock_timeout

参数说明:持有barrier锁的超时时间。该参数可在PDB级别设置。

参数类型:整型

参数单位:s(秒)

取值范围:0 ~ 3600

默认值:30。在PDB场景内,若未设置该参数,则继承来自全局的设置。

设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

enable_xid_abort_check

参数说明:事务提交时校验事务ID回滚开关是否开启。

参数类型:布尔型

参数单位:

取值范围:

  • on:表示开启。
  • off:表示关闭。

默认值:on

设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。

相关文档